C# 局域网聊天原理

各位高手好,最近一直在琢磨局域网聊天,很头大的样子!现在有几个原理不懂,目前可以实现点对点的聊天,也就是大家输入同一个ip 首先要启动服务器A,在客户端B连接。采用的是TCP原理,socket通信,可是我想做一个像QQ一样的,登陆后,局域网内的人只要上线都可以看到,然后点击头像就可以聊天的东西,可是和我之前找的程序不一样,好比没有服务器和客户端的样子,可是之前的必须先启动服务器,客户端连接才行,不知道用什么方法了,谢谢赐教
2026年09月27日 02:21
有2个网友回答
网友(1):

QQ用的是UDP通信协议为主,给你个UDP通信例子

自己研究吧

客户端:  
窗体设计--一个listbox  
namespace Client  
{  
    public partial class MainlForm : Form  
    {  
        public MainlForm()  
        {  
            InitializeComponent();  
        }  
        private void MainlForm_Load(object sender, EventArgs e)  
        {  
            Thread myThread = new Thread(ReceiveData);  
            myThread.IsBackground = true;  
            myThread.Start();  
        }  
        private UdpClient receiveUdpClient;  
        private void ReceiveData()  
        {  
            IPEndPoint local = new IPEndPoint(IPAddress.Any, 8008);  
            receiveUdpClient = new UdpClient(local);  
            IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);  
            while (true)  
            {  
                byte[] receiveBytes = receiveUdpClient.Receive(ref remote);  
                string receiveMessage = Encoding.UTF8.GetString(receiveBytes, 0, receiveBytes.Length);  
                AddItem(lst_Receive, receiveMessage);  
            }  
        }  
        delegate void AddItemDelegate(ListBox listbox, string text);  
        private void AddItem(ListBox listbox, string text)  
        {  
            if (listbox.InvokeRequired)  
            {  
                AddItemDelegate d = AddItem;  
                listbox.Invoke(d, new object[] { listbox, text });  
            }  
            else  
            {  
                listbox.Items.Add(text);  
                listbox.SelectedIndex = listbox.Items.Count - 1;  
                listbox.ClearSelected();  
            }  
        }  
    }  
}  
   
服务器端:  
窗体设计--1.远程IP textbox 2.远程Porttextbox 3.发送消息内容 textbox 4.发送button  
namespace Server  
{  
    public partial class MainForm : Form  
    {  
        UdpClient myUdpClient = new UdpClient();  
        public MainForm()  
        {  
            InitializeComponent();  
        }  
        private void btnSend_Click(object sender, EventArgs e)  
        {  
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(textMsg.Text);  
            IPEndPoint local = new IPEndPoint(IPAddress.Parse(remoteIp.Text), int.Parse(remotePort.Text));  
            myUdpClient.Send(bytes, bytes.Length, local);  
            textMsg.Text = "";  
        }  
    }  
}

网友(2):

题主【好比没有服务器和客户端的样子】是错误的理解。

简单说说原理,和使用什么协议无关。假设存在服务端S、客户端A、客户端B,服务端上存在一个集合用于存放当前在线的客户列表。

首先,A与S连接,S收到A的登录请求后,向A发送当前在线的客户列表,A收到后以图形化显示出来,此时列表中只有A。

接着,B与S连接,S收到B的登录请求后,向A、B(也就是遍历当前在线的客户列表)分别发送在线列表,A、B收到后分别显示,此时列表中有A、B两个。

然后,A想与B通信,那么A先向S发出申请“我想跟B对话”,S收到后,此时有两种思路:一种是A与B的对话通过S来中转,也就是A、B之间没有建立连接,两者的消息都是通过S转发的;另一种是A与B之间建立连接,此时S仅仅起到一个向AB发送对方的IP地址和端口号的作用(如果是不同子网的,还需打洞)。

以上。