C# 局域网聊天原理

各位高手好,最近一直在琢磨局域网聊天,很头大的样子!现在有几个原理不懂,目前可以实现点对点的聊天,也就是大家输入同一个ip首先要启动服务器A,在客户端B连接。采用的是TC... 各位高手好,最近一直在琢磨局域网聊天,很头大的样子!现在有几个原理不懂,目前可以实现点对点的聊天,也就是大家输入同一个ip 首先要启动服务器A,在客户端B连接。采用的是TCP原理,socket通信,可是我想做一个像QQ一样的,登陆后,局域网内的人只要上线都可以看到,然后点击头像就可以聊天的东西,可是和我之前找的程序不一样,好比没有服务器和客户端的样子,可是之前的必须先启动服务器,客户端连接才行,不知道用什么方法了,谢谢赐教 展开
 我来答
六子是个好同志
2014-04-10 · TA获得超过229个赞
知道答主
回答量:222
采纳率:0%
帮助的人:175万
展开全部

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 = "";  
        }  
    }  
}
追问
有源码下载吗??
追答
发你的就是源码了,自己新建一个winform项目,源码整一下就可以用了
然后去远足
推荐于2016-07-26 · TA获得超过1万个赞
知道大有可为答主
回答量:4016
采纳率:83%
帮助的人:2445万
展开全部
题主【好比没有服务器和客户端的样子】是错误的理解。

简单说说原理,和使用什么协议无关。假设存在服务端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地址和端口号的作用(如果是不同子网的,还需打洞)。

以上。
更多追问追答
追问
高手不要走!
你的意思是,必须要有一台电脑充当服务器的角色,然后其余的电脑都是客户端的意思吗?你这么说我就理解多了,你有没源码我想研究下!我是小白!!!
追答

是的,必须有一个服务端,这个服务端起到的作用是验证登录者身份、记录所有登陆者的身份和IP地址(也就是所谓的在线列表)、为其他客户端更新在线列表。

 

楼下代码给的就挺简单明了的了,我说下思路和原理而已。

 

再提供一份基于UDP协议“打洞”的源码,内含 TestClient、TestServer。

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式