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 = "";
}
}
}
题主【好比没有服务器和客户端的样子】是错误的理解。
简单说说原理,和使用什么协议无关。假设存在服务端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地址和端口号的作用(如果是不同子网的,还需打洞)。
以上。