C# Socket 发送&接收&返回
因为工作比较忙,好久没有写过博客了,最近因项目需求,需要用到Socket来进行通信,简单写了几个例子,记录一下,代码很简单,无非就是接收与发送,以及接收到数据后返回一个自定义信息,也可以说是发送。
先来简单写一个接收端的样例,因为Socket需要监听主机上的某个可用端口,在监听开始之前并不是很清楚要监听的某个端口是否被占用,可以在CMD或Powershell中输入netstat -ano 进行查看,但这样的话在每次使用一个端口之前都需要这样操作,相对来讲比较繁琐。当然除此之外我们也可以通过 IPGlobalProperties来获取本机的网络连接的信息,并通过GetActiveTcpListeners找到已用端口,进而可以知道所需的端口是否已被占用,完成代码如下:
public static bool PortIsUse(int port)
{
bool isUse = false;
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners();//找到已用端口
foreach (IPEndPoint endPoint in ipEndPoints)
{
if (endPoint.Port == port)//判断是否存在
{
isUse= true;
break;
}
}
return isUse;
}
在做好准备工作后,开始来写接收端代码,首先得定义一个TcpListener对象来监听本地的某个端口,比如我要监听本地的1111端口那么代码可以写为:
TcpListener tcpl = new TcpListener(new IPAddress(new byte[] { , , , }), );//定义一个TcpListener对象监听本地的1111端口
在监听之前先调用之前写的方法,检查一下端口是否被占用,在定义好TcpListener后就可以调用该类的Start方法开始监听,接收端完整代码如下:
TcpListener tcpl = new TcpListener(new IPAddress(new byte[] { , , , }), );//定义一个TcpListener对象监听本地的1111端口
tcpl.Start();//监听开始
while (true)
{
Socket s = tcpl.AcceptSocket();//挂起一个Socket对象
string remote = s.RemoteEndPoint.ToString();//获取发送端的IP及端口转为String备用
Byte[] stream = new Byte[];
s.Receive(stream);//接收发送端发过来的数据,写入字节数组
//BGW_Handle.ReportProgress(1, "接收来自[" + remote + "]信息");
string _data = Encoding.UTF8.GetString(stream);//将字节数据数组转为String
s.Send(stream);//将接收到的内容,直接返回接收端
s.Shutdown(SocketShutdown.Both);
}
tcpl.Stop();//停止监听
接收端代码并没有很多,看起来也不是很复杂,在启动监听后,挂起一个Socket,并等待消息到达,在收到消息时,使用Receive方法将收到的消息写入到Byte数组中,并在后续中直接将所收到的内容,转为String,此时调用Socket的Send方法,将收到的数据直接回送给发送端,值得注意的在上述代码中我使用了一个死循环while(true),在实际项目中,要考虑到这个循环所带来的一系列问题,如阻塞主线程,UI线程,检测到后续代码无法访问等,在应用到实际项目时,还要做一定的修改。
在接收端准备好后,开始来写发送端代码,因为发送端不需要监听端口,所以就不用再定义一个TcpListener对象,也不需要检查所用的端口是否已被占用,此时我们可以直接初始化一个Socket及将要连接的IPEndPoint对象,在定义Socket时指定其寻址方案为AddressFamily.InterNetwork,即通过IPV4来寻址,并指定类型为SocketType.Stream,即支持可靠、 双向、 基于连接的字节流,在开始通信之前需要远程主机的连接。同时指定Socket类支持的协议为TCP,代码为:
IPAddress ip = IPAddress.Parse("127.0.0.1");//接收端所在IP
IPEndPoint ipEnd = new IPEndPoint(ip, );//接收端所监听的接口
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化一个Socket对象
在初始化完Socket对象后,即可使用Socket的Connect方法,尝试连接,些前已定的接收端的地址及端口,在连接成功后,即可开始发送数据,并尝试接收返回的数据,完整代码如下:
IPAddress ip = IPAddress.Parse("127.0.0.1");//接收端所在IP
IPEndPoint ipEnd = new IPEndPoint(ip, );//接收端所监听的接口
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化一个Socket对象
try
{
socket.Connect(ipEnd);//连接指定IP&端口
}
catch (SocketException e)
{
Console.WriteLine("连接失败");
Console.WriteLine(e.ToString());
return;
}
socket.Send(Encoding.UTF8.GetBytes(""));//发送数据
while (true)//定义一个循环接收返回数据
{
byte[] data = new byte[];
socket.Receive(data);//接收返回数据
string stringData = Encoding.UTF8.GetString(data);
if (!string.IsNullOrWhiteSpace(stringData))
{
Console.Write(stringData);
break;
}
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();//关闭Socket
从上面代码来看,发送端的代码也并不是很繁杂,当然上面所写的代码也只是实现了几个简单的发送与接收的功能。到这里为止一个简单的发送与接收及收接后返回就已完成了,上述代码若有何不当之处,可在评论中提出来。
C# Socket 发送&接收&返回的更多相关文章
- TCP/IP Socket发送接收图片demo
一个实例通过client端和server端通讯 客户端通过TCP/IP传输资源文件,比如图片,文字,音频,视频等..... 服务端接受到文件存入本地磁盘,返回接受到:“收到来自于"+s.ge ...
- C# Socket发送接收字节数组和十六16进制之间转换函数
近期在使用远程网络模块的时候, 需要用的Socket发送数据,远程模块指令为16进制. 官方提供的DEMO比较繁琐.不方便新手使用. 下面的转换函数可大大方便新手使用. // 16进制字符串转字节数组 ...
- Python socket ssh接收大数据
通过socket连续接收返回数据 Server服务端 import socket,os server = socket.socket() server.bind(('localhost',9999)) ...
- 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解.所以我想写一篇文章来纠正错误,并作为记 ...
- C# Socket模拟发送接收
Socket简介 通过TCP/IP与仪器或设备通讯,在C#语言中,我们通常采用Socket.本项目是一个简单的Socket建立服务监听与Socket作为客户端请求的一个示例. 项目结构 客户端项目 S ...
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程? 详细代码介 ...
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C#串口通信—向串口发送数据,同步接收返回数据
最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接 ...
- socket发送和接收数据
1)sendBuf(),sendText(),sendStream() 几乎所有的通信控件都会提供上面的3个方法.首先看看SendBuf(). function TCustomWinSocket.Se ...
随机推荐
- 阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
此教程中使用的相关IP等设置,在你的环境中要做相应修改. 使用之前更新apt-get,因为服务器基本上是一个裸系统 apt-get update;apt-get upgrade; 1 我们使用root ...
- 【转】关于一个Jmeter interface testing的实例
目标:测试某个保险系统的费率接口 准备:a 请求方式:Http b 接口地址://10.1.1.223:9090/rulesEngine/executeRateRule.do Jmeter 设置: a ...
- 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)
Happy Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- microtime() 测试代码执行时间,提高编码效率
<?php $b_time = microtime(true); $a = array("); $count = ; foreach ($a as $key => $value) ...
- vue-cli中的babel配置文件.babelrc详解
本文介绍vue-cli脚手架工具根目录的babelrc配置文件 介绍 es6特性浏览器还没有全部支持,但是使用es6是大势所趋,所以babel应运而生,用来将es6代码转换成浏览器能够识别的代码 ba ...
- python构造远控
server端: import socket import subprocess server=socket.socket() server.bind(('127.0.0.1',4444)) serv ...
- 系统环境变量PATH被删除后从注册表恢复
转自:https://wenku.baidu.com/view/75d0b6ec19e8b8f67c1cb958.html 首先需要了解path这个环境变量有什么用: 当你打开命令提示窗口时,即win ...
- .NET 调用c++库注意事项
很久没有更新了,主要还是因为自己懒吧,希望从今天开始坚持至少一周写一篇文章. 调用函数库是正常的,调用完成后,在使用EF进行数据更新时,将发生如下异常信息,而且几乎必现. 行库遇到了错误.此错误的地址 ...
- Mac设置Root密码
[Mac设置Root密码] Mac系统重新设置root用户密码 如果不知道root用户密码,需要重设. 命令[sudo passwd root ] 然后提示你输入当前登录用户密码,通过以后, ...
- 用户“*****”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。
错误: 用户“ts\***”不具有所需的权限.请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题. 解决: 当从客户端用IE连接http://xxx.xxx.xxx.xx ...