个人随笔
技术改变世界

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

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

文件分别是两部分:

1.服务端

2.客户端

—————————————————

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

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

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

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

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

(记得路由器端口映射哦)

————————————————–

下面是本机的一个演示:
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;  
        }  
    }  
}

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

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

下载地址如下:Socket_1Client_NServer

转载请注明出处王旭博客 » C# Socket聊天程序(一个服务端,多个客户端)

分享到:更多 ()

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #2

    不错,

    qq4周前 (04-03)回复
  2. #1

    实用!

    jigsaw2年前 (2015-04-06)回复