C# 局域网聊天原理
各位高手好,最近一直在琢磨局域网聊天,很头大的样子!现在有几个原理不懂,目前可以实现点对点的聊天,也就是大家输入同一个ip首先要启动服务器A,在客户端B连接。采用的是TC...
各位高手好,最近一直在琢磨局域网聊天,很头大的样子!现在有几个原理不懂,目前可以实现点对点的聊天,也就是大家输入同一个ip 首先要启动服务器A,在客户端B连接。采用的是TCP原理,socket通信,可是我想做一个像QQ一样的,登陆后,局域网内的人只要上线都可以看到,然后点击头像就可以聊天的东西,可是和我之前找的程序不一样,好比没有服务器和客户端的样子,可是之前的必须先启动服务器,客户端连接才行,不知道用什么方法了,谢谢赐教
展开
2个回答
展开全部
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项目,源码整一下就可以用了
展开全部
题主【好比没有服务器和客户端的样子】是错误的理解。
简单说说原理,和使用什么协议无关。假设存在服务端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地址和端口号的作用(如果是不同子网的,还需打洞)。
以上。
简单说说原理,和使用什么协议无关。假设存在服务端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。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询