以下是服务器端完整代码附带有具体注释: /// <summary> //功能:简单聊天室 //版本: v1.0 //作者:苏嗣典 //日期: 2011-12-09 /// </summary> using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Net;
namespace Server { public partial class Server : Form { public Server() { InitializeComponent(); RichTextBox.CheckForIllegalCrossThreadCalls = false; //对跨线程不处理 } //拓展知识:套接字用来描述 IP 地址和端口,是通信链的句柄,其实就是用于两个进程间 通信的。 Socket socket_Server = null; //定义一个套接字接口对象,并初始化值为空 Thread myThread = null; //定义一个线程对象,并初始化值为空 Socket socket_Connet = null; //用于与客户端连接 Dictionary<string, Socket> dic = new Dictionary<string, Socket> { }; //定义一个集合, 存储客户 端信息 string RemoteEndPoint; //客户端的网络结点 private void buttonStartListen_Click(object sender, EventArgs e) { socket_Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //new 一个 Socket 对象,注意这里用的是流式 Socket(针对于面向连接的 TCP 服务应用)而不是数据报式 Socket(针对于面向无连接的 UDP 服务应用)。 string IP = textBoxIP.Text.Trim(); IPAddress ServerIP =IPAddress.Parse(IP); //提取 IP 地址 int port=int.Parse (textBoxPort .Text .Trim ()); //port 是端口号 IPEndPoint point = new IPEndPoint(ServerIP, port); //point 为网络结点对象 socket_Server.Bind(point); //将结点绑定到套接字上 socket_Server.Listen(10); //设置连接队列的最大长度,可根据服务器的性能,可以设置更大 程度。 myThread = new Thread(Listen_Disp ); myThread.IsBackground = true; //设置是否为后台线程 myThread.Start(); textBoxListenMsg.AppendText("监听成功!\t\n"); } void Listen_Disp() { while (true) { socket_Connet = socket_Server.Accept(); RemoteEndPoint = socket_Connet.RemoteEndPoint.ToString(); //客户端网络结点号 textBoxListenMsg.AppendText("成功与" + RemoteEndPoint + "客户端建立连接!\t\n"); //显示