前几天开始学Socket编程,跟着老师一点一点的做。最后做了一个WinForm版的小聊天室。这个聊天室的客户端和服务端都只是在本机上运行。
这里我首先和大家谈谈我对聊天室的一点理解,聊天室其实是服务端分配一个端口,开启一个一直监听有没有客户端来连接服务器的Socket,
如果一台客户端要去连接这台服务器,那么就会分配一个通信用的Socket并知道这台服务器的IP和端口号,去向服务器发出连接请求,
如果服务器的监听Socket监听到有一台客户端发出连接请求,那么服务器监听Socket就会创建一个新的Socket,也称连接Socket来和
客户端进行连接通信。
下面上服务端开始监听Socket的代码:
class="brush:csharp;gutter:true;"> //监听Socket private void btnStart_Click(object sender, EventArgs e) { //ip地址 IPAddress ip = IPAddress.Parse(txtServer.Text); //IP地址和端口号 IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text)); //创建监听Socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定IP和端口号 socket.Bind(point); ////通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 ////开启监听Socket 监听队列的长度 socket.Listen(10); btnStart.Enabled = false; ShowMsg("开始监听..."); //监听端口号,如果有客户端连接,创建新的Socket用于通信 //Socket connSocket = socket.Accept(); Thread t = new Thread(Listen); t.IsBackground = true; t.Start(socket); }
服务端监听客户端连接请求代码:
Socket socket = obj as Socket; //这样可以不断的监听客户端发送的连接请求 while (true){ //通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 //监听端口号,如果有客户端连接,创建新的Socket用于通信 //socket.Accept();会阻塞窗体的运行 Socket connSocket = socket.Accept(); //当前连接的客户端IP和端口号 string ipport=connSocket.RemoteEndPoint.ToString(); //连接的客户端IP和端口号显示在下拉框中 cmbClient.Items.Add(ipport); //将连接的客户端IP、端口号和Socket存储Dictionary中 dic.Add(ipport, connSocket); //本机IP和端口号 //connSocket.LocalEndPoint ShowMsg(connSocket.RemoteEndPoint.ToString()); Thread t = new Thread(ReceiveMsg); t.IsBackground = true; t.Start(connSocket); }
客户端Socket代码:
//客户端连接服务器的IP IPAddress ip = IPAddress.Parse(txtServer.Text); //客户端连接服务器的IP和端口号 IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text)); try { //创建通信连接的Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(point); ShowMsg("连接成功"); } catch(Exception ex) { ShowMsg(ex.Message); } //接收消息 Thread t = new Thread(Receive); t.IsBackground = true; t.Start();
由于代码比较多,这里就不一一贴上所有代码