C# Socket聊天程序(一个服务端,多个客户端)

这是一个多用户聊天的socket程序

文件分别是两部分:

1.服务端

2.客户端

---------------------------------------------------

使用方法:在一台电脑中挂起一个 服务端程序。

其他电脑即可开启客户端进行相互聊天(所有客户端之间);


在客户端与服务端的‘启动程序’目录下都有一个:ServerIPAndPort.txt 文本用于配置IP地址与端口

如局域网配置(服务端与客户端配置一致):192.168.X.X:8885 既你的本机局域网IP地址

外网配置:服务端配置为192.168.X.X:8885 即可,而客户端需要配置为 服务端的外网IP。

(记得路由器端口映射哦

--------------------------------------------------

下面是本机的一个演示:

C# Socket聊天程序(一个服务端,多个客户端)


注:这里的【刷新】按钮是没有任何意义的。(忘了删除 就传上来了。真是不好意思)。。


代码挺多的,大概这里贴一点。。大家去下载我上传的项目文件把(包含客户端和服务端)


部分代码:

命名空间:

using System.Net; using System.Net.Sockets; using System.Threading; using System.IO;

代码片段:

/// <summary> /// 根据当前程序目录的文本文件‘ServerIPAndPort.txt’内容来设定IP和端口 /// 格式:127.0.0.1:8885 /// </summary> private void SetServerIPAndPort() { FileStream fs = new FileStream("ServerIPAndPort.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); string IPAndPort = sr.ReadLine(); ServerIP = IPAndPort.Split(':')[0]; //设定IP port = int.Parse(IPAndPort.Split(':')[1]); //设定端口 sr.Close(); fs.Close(); } /// <summary> /// 开始监听 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Start_Click(object sender, EventArgs e) { myListener = new TcpListener(IPAddress.Parse(ServerIP), port); myListener.Start(); AddItemToListBox(string.Format("开始在{0}:{1}监听客户连接", ServerIP, port)); //创建一个线程监客户端连接请求 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); btn_Start.Enabled = false; btn_Stop.Enabled = true; } /// <summary> /// 接收客户端连接 /// </summary> private void ListenClientConnect() { TcpClient newClient = null; while (true) { try { newClient = myListener.AcceptTcpClient(); } catch { //当单击‘停止监听’或者退出此窗体时 AcceptTcpClient() 会产生异常 //因此可以利用此异常退出循环 break; } //每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息; User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user); AddItemToListBox(string.Format("[{0}]进入", newClient.Client.RemoteEndPoint)); AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count)); } } /// <summary> /// 处理接收的客户端信息 /// </summary> /// <param name="userState">客户端信息</param> private void ReceiveData(object userState) { User user = (User)userState; TcpClient client = user.client; while (isNormalExit == false) { string receiveString = null; try { //从网络流中读出字符串,此方法会自动判断字符串长度前缀 receiveString = user.br.ReadString(); } catch (Exception) { if (isNormalExit == false) { AddItemToListBox(string.Format("与[{0}]失去联系,已终止接收该用户信息", client.Client.RemoteEndPoint)); RemoveUser(user); } break; } AddItemToListBox(string.Format("来自[{0}]:{1}",user.client.Client.RemoteEndPoint,receiveString)); string[] splitString = receiveString.Split(','); switch(splitString[0]) { case "Login": user.userName = splitString[1]; SendToAllClient(user,receiveString); break; case "Logout": SendToAllClient(user,receiveString); RemoveUser(user); return; case "Talk": string talkString = receiveString.Substring(splitString[0].Length + splitString[1].Length + 2); AddItemToListBox(string.Format("{0}对{1}说:{2}",user.userName,splitString[1],talkString)); SendToClient(user,"talk," + user.userName + "," + talkString); foreach(User target in userList) { if(target.userName == splitString[1] && user.userName != splitString[1]) { SendToClient(target,"talk," + user.userName + "," + talkString); break; } } break; default: AddItemToListBox("什么意思啊:" + receiveString); break; } } }

以上是不完整的代码片段,由于代码太多这里贴出来肯定眼花缭乱的。。

有需要的朋友还是下载源码看把。

下载地址如下:

http://download.csdn.net/source/3471191