用C#来编写SOCKET程序,总的来说还是比较方便的,微软帮忙我们做了很多工作。SOCKET编程应用很多, 相关资料网上也很多,因为工作需要,前一段时间也用C#编写一个socket程序,在这里写一下也算一个记录。
在服务器端创建一个Socket,使用Bind方法绑定所指定的接口使Socket与一个本地终结联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。
使用完Socket后,记住使用Shutdown方法禁用Socket,并使用Close方法关闭Socket
在C#中,微软提供了socket 类
public class Socket : IDisposable
{
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
//......
}
但是编码的时候一般不直接使用socket类,因为有两个类封装得更好。 TcpListener 和 TcpClient 。
首先是服务端,绑定一个端口号,开启服务。
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; namespace ConsoleSocketServer { class Program { private static TcpListener tcpServer = null; static void Main(string[] args) { IPAddress iPAddress = IPAddress.Any; tcpServer = new TcpListener(iPAddress, 999); //999是端口号,可以随便改 0-1024,主要不要和什么80,8080之类的常用端口号相冲突哦。 tcpServer.Start(); Console.WriteLine("监听已启动......"); byte[] msg = Encoding.UTF8.GetBytes("服务端数据"); byte[] bytes = new byte[256]; while (true) { TcpClient client = tcpServer.AcceptTcpClient(); int i = client.Client.Receive(bytes); Console.WriteLine("接受:" + Encoding.UTF8.GetString(bytes)); client.Client.Send(msg); client.Close(); Thread.Sleep(1000); } } } }
客户端将是通过TcpClient的Connect方法来连接到指定的服务器,并通过Send方法发送数据,Receive接收数据。具体代码如下:
using System; using System.Text; using System.Collections; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; using System.Collections.Generic; namespace ConsoleSocketClient { class Program { private static TcpClient client = new TcpClient(); static void Main(string[] args) { client.Connect("127.0.0.1", 999);//这里连得是本机999端口号 Console.WriteLine("连接成功......"); byte[] data = Encoding.UTF8.GetBytes("客户端数据"); Socket socket = client.Client; socket.Send(data, data.Length, SocketFlags.None); //Console.WriteLine("发送成功" + Encoding.UTF8.GetString(data)); socket.Receive(data, SocketFlags.None); Console.WriteLine("接受数据" + Encoding.UTF8.GetString(data)); Console.ReadKey(); } } }
当然这个只是简单的说明socket如何通信,上面只是代码的简单演示,仅帮助大家学习、理解SOCKET编程,SOCKET实战还有很多路需要走。在实际编程过程中,SOCKET大多都与多线程有关系。没有多线程,可以说SOCKET编程就没有太多的意义。因为SOCKET涉及到太多了阻塞、运行和等待。如果以前没有做过SOCKET编程,很多时候会感觉程序莫名其妙的不动了,或者说是没有正常的响应了。其实这个时候往往就是程序处于阻塞状态。如果没有相应经历,总有点怪怪的感觉。解决办法就是采用多线程的方式。具体怎么弄,后面的文章再来写写。
上述代码在.net 4.0中编译通过。