Socket编程基础

参考资料:

Socket编程的原理 ①    

Socket编程的实例   

Socket位于TCP/IP协议中的应用层与网络层之间,如下图:

大体流程如下图:

using System.Net

using System.Net.Sockets

服务器端

创建流式(SocketType.Stream)套接字-----Socket()

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

addressFamily参数指定Socket使用的寻址方案,socketType参数指定Socket的类型,protocolType参数指定Socket使用的协议

使Socket与一个本地终结点(IPEndPoint)相联-----Bind()

IPAddress ip = IPAddress.Any;   会自动运算本机IP地址并返回一个IPAddress实例,还可以IPAddress ip=IPAddress.Parse(ip地址的字符串)

IPEndPoint iep=new IPEndPoint(ip,端口);  参数是一个IPAddress实例和整型的端口,返回一个本地终结点

socket.Bind(iep);

使Socket与一个本地终结点连接侦听该接口上的请求-----Listen()

socket.Listen(10);  参数指定队列中最多可容纳的等待接受的传入连接数,默认为5

当侦听到用户端的连接时调用Accept完成连接的操作-----Accept() 

Accept()方法会产生一个新的Socket对象来处理客户端的连接,而原来的Socket对象继续监听端口的请求

while (true)  

{    

Socket temp = socket.Accept();     

byte[] rebuffer = new byte[1024];   建立用于存储客户端信息的字节流数组

将接收到的字节流存入字节数组-----Receive()    

int len = temp.Receive(rebuffer,0,rebuffer.Length)  Receive()方法返回已接受的字节数,还有一种BeginReceive()用于异步接收数据    

string reinfo += Encoding.ASCII.GetString(rebuffer,0,len);  将接收到的字节流解码为一个字符串    

string seinfo="我已收到!"    

byte[] sebuffer = Encoding.ASCII.GetBytes(seinfo);  将要发的字符串中的所有字符编码为一个字节数组

将数据发送到连接的客户端的Socket-----Send()    

temp.Send(sebuffer,0,sebuffer.Length);    

temp.Close(); 

 }
客户端

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPAddress ip = IPAddress.Parse("服务器的ip地址");

IPEndPoint ipe = new IPEndPoint(ip,"服务器的开放端口");

socket.Connect(ipe);   与远程主机的一个socket连接

string seinfo="收到了吗?";

byte[] sebuffer = Encoding.ASCII.GetBytes(seinfo);

socket.Send(sebuffer,0,sebuffer.Length);

byte[] rebuffer = new bytep[1024];

int len = socket.Receive(rebuffer,0,rebuffer.Length);

string reinfo = Encoding.ASCII.GetString(rebuffer,0,len);

scoket.close();

源码下载

原文地址:https://www.cnblogs.com/hanmeimei/p/socket.html