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();