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 ...
随机推荐
- java代码getHostAddress .getHostName()的练习
总结:主机名,ip地址是可以实现的,关键是要掌握 package com.aa; import java.io.IOException; import java.net.*; public class ...
- javascript知识
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...
- Nginx启动提示找不到libpcre.so.1解决方法
如果是32位系统 [root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib 如果是64位系统 [root@lee ~]# ln -s /usr/lo ...
- 第十一章 SpringMvc(待续)
············
- PHP操作Redis(一) PHP连接Redis,含Redis密码验证、指定某一Redis数据库
台服务器上都快开启200个redis实例了,看着就崩溃了.这么做无非就是想让不同类型的数据属于不同的应用程序而彼此分开. 那么,redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的实 ...
- Maven的安装及配置、Maven在Eclipse中的配置
一.需要准备的东西 1. JDK 2. Eclipse 3. Maven程序包 二.检查JAVA安装 三.安装Maven 下载apache-maven-3.5.3-bin.zip解压即可. 四.配置M ...
- SSD惊悚的跪了,找回数据
1.电脑出现小bug,例如显示乱码,开机变慢等,都是SSD跪的前兆,哭,我怎么就没看出来,而且没有备份过数据. 2.终于,PC死机了...OK,重启,纳尼?起不来... 3.大哭,所有代码,所有论文不 ...
- WebRTC相关的基础知识点
这里主要用来记录自己整理的和webRTC相关的一些基本的知识点,后续整理的一些基础和零碎的知识点都会更新在这里.内容大部分来自于webRTC官网.w3c以及一些前辈们的博客中的文章和相关书籍等. 20 ...
- web界面上的字体兼容方案
原贴地址:http://www.baidufe.com/item/60cd11d3bfdee5c51369.html 做前端的,对web界面基本都抠的很仔细,尤其精确到1px! 类似边距.宽度.高度等 ...
- linux下配置tomcat开机自启动
Linux下配置tomcat开机自启动 1.写一个tomcat脚本,内容如下,设置其权限为755,放在/etc/init.d/目录下 #!/bin/bash## /etc/init.d/tomca ...