提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
实现多个客户端与一个服务器之间的通讯,界面使用Windows窗体应用程序生成
一、客户端与服务器界面
#1、客户端界面如下:
功能1: 输入IP和端口号点击“connect”按钮实现客户端与服务器的连接(服务器处于监听状态),提示显示在第一个textbox中
功能2:在第二个textbox中输入要发送的内容,点击“发送"按钮,实现数据的发送,提示显示在第一个textbox中
#2、服务器界面如下:
功能1:输入端口号,点击”开始监听“按钮,等待客户端的连接,提示显示在第一个textbox中
功能2:选中combox中的ip和端口号,在第二个textbox中输入要发送的内容,点击”发送“按钮,蒋数据发送到对应的客户端,提示显示在第一个textbox中
二、客户端与服务器的连接、接收数据
1.服务器”开始监听“
等待客户端的连接,连接成功后一直接收客户端发来的消息
代码如下(示例):
/// <summary>
/// 开始监听
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//创建用于监听的socket
Socket socketwatch = new Socket(SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(textBox1.Text));
//监听
socketwatch.Bind(point);
socketwatch.Listen(10);
showmsg("监听成功");
//开辟新线程一直监听客户端的连接
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketwatch);
}
/// <summary>
/// 开辟新的线程一直监听客户端的连接
/// </summary>
Socket socketsend;
void Listen(object o)
{
Socket socketwatch = o as Socket;
while(true)
{
//等待客户端的连接,并创建一个用于通信的socket
socketsend = socketwatch.Accept();
showmsg(socketsend.RemoteEndPoint.ToString() + ": 连接成功");
//开辟新的后台线程一直接收客户端发来的消息
Thread th = new Thread(receive);
th.IsBackground = true;
th.Start(socketsend);
}
}
//定义键值对将ip和对应的通讯socket存入
Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
/// <summary>
/// 接收客户端发来的消息
/// </summary>
/// <param name="o"></param>
public void receive(object o) //线程中传递变量必须是object类型
{
Socket socketsend = o as Socket;
//将连接的ip和对应的socket存入键值对
dicSocket.Add(socketsend.RemoteEndPoint.ToString(), socketsend);
//将连接的ip和端口号存入combox中
comboBox1.Items.Add(socketsend.RemoteEndPoint.ToString());
while (true)
{
try {
//接收客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 2];
int i = socketsend.Receive(buffer);