先看张原理图:
服务器端:
第一步:创建一个用于监听连接的Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Bind()方法绑定EndPoint;
第四步:用socket对像的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
第六步:通信结束后一定记得关闭socket;
服务器与客户端不同,服务器要开两个线程一个用于监听连接,一个用于监听客户端信息;还要有两个socket,一个用于监听,一个用于通信。服务端的主要职责是处理各个客户端发送来的数据,因此在客户端的Socket编程中需要使用两个线程来循环处理客户端的请求,一个线程用于监听客户端的连接情况,一个线程用于监听客户端的消息发送。
基本流程
• 创建套接字
• 绑定套接字的IP和端口号——Bind(EndPoint)
• 将套接字处于监听状态等待客户端的连接请求——Listen(int) 监听端口,其中 int 表示最大监听数。
• 阻塞方法,当请求到来后,接受请求并返回本次会话的套接字——Accept()接受客户端链接,并返回一个新的链接,用于处理同客户端的通信问题。
• 使用返回的套接字和客户端通信——Send()/Receive()
Send(byte[]) 简单发送数据。
Send(byte[],SocketFlag) 使用指定的SocketFlag发送数据。
Send(byte[],int, SocketFlag) 使用指定的SocketFlag发送指定长度数据。
Send(byte[], int, int,SocketFlag) 使用指定的SocketFlag,将指定字节数的数据发送到已连接的socket(从指定偏移量开始)。
Receive(byte[]) 简单接受数据。
Receive(byte[],SocketFlag) 使用指定的SocketFlag接受数据。
Receive(byte[], int, SocketFlag) 使用指定的SocketFlag接受指定长度数据。
Receive (byte[], int,int, SocketFlag) 使用指定的SocketFlag,从绑定的套接字接收指定字节数的数据,并存到指定偏移量位置的缓冲区。
• 返回,再次等待新的连接请求
• 关闭套接字
客户端:
客户端相对于服务端来说任务要轻许多,因为客户端仅仅需要和服务端通信即可,可是因为在和服务器通信的过程中,需要时刻保持连接通畅,因此同样需要两个线程来分别处理连接情况的监听和消息发送的监听。
基本流程
• 创建套接字保证与服务器的端口一致
• 向服务器发出连接请求——Connect(EndPoint)连接远程服务器,如果没有相应的远程等待连接,直接返回错误。
• 和服务器端进行通信——Send()/Receive()
• 关闭套接字
服务端接收客户端信息并向客户端返回信息
服务端:
static void Main()
{
try{
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,8001);
Socket s = newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定
s.Listen(0);//开始监听
Socket temp = s.Accept();//等待客户端连接
byte[] recvBytes = new byte[1024];
int bytes = temp.Receive(recvBytes);//从客户端接受信息,返回接收的数据长度
string recvStr = Encoding.UTF8.GetString(recvBytes,0, bytes);
Console.WriteLine("Server GetMessage:{0}", recvStr);
string sendStr = "Ok!Client SendMessage Sucessful!";
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
temp.Slend(bs);//向客户端发送数据
temp.Close();
s.Close();
}
catch (ArgumentNullException e){
Console.WriteLine("ArgumentNullException:{0}", e);}
catch (SocketException e){
Console.WriteLine("SocketException: {0}", e);}
Console.WriteLine("Press Enter to Exit");
Console.ReadLine();
}