我是靠谱客的博主 奋斗白云,最近开发中收集的这篇文章主要介绍C#实现客户端与服务器的TCP通讯前言一、客户端与服务器界面二、客户端与服务器的连接、接收数据三、客户端与服务器发送数据四、常见问题点,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、客户端与服务器界面
- 二、客户端与服务器的连接、接收数据
- 1.服务器”开始监听“
- 2.客户端”连接“
- 三、客户端与服务器发送数据
- 1.客户端”发送“
- 2.服务器”发送“
- 四、常见问题点
- 1、线程中不能操作界面控件
- 2、可能出错的地方加上try{}catch{}
- 3、断开连接后会一直接收长度为0的数据,需要判断长度为0时跳出接收数据的循环
- 4、连接/接收数据时处于while循环中,需要将连接的代码放在后台线程中,否则容易出现卡界面的情况
前言
实现多个客户端与一个服务器之间的通讯,界面使用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);
//断开连接时接收到的数据长度为0,此时跳出循环
if (i == 0)
{
comboBox1.Items.Remove(socketsend.RemoteEndPoint.ToString());
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, i);
showmsg(socketsend.RemoteEndPoint + ":" + str);
}
catch { }
}
}
/// <summary>
/// 显示提示信息
/// </summary>
/// <param name="s"></param>
void showmsg(string s)
{
textBox2.AppendText(s + "rn");
}
2.客户端”连接“
客户端连接服务器,成功后一直接听服务器发来的消息
代码如下(示例):
//设为全局变量用于通讯连接和接收数据
Socket socketsend;
/// <summary>
/// 连接服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try {
//创建用于通讯的socket
socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(textBox2.Text);
IPEndPoint port = new IPEndPoint(ip, Convert.ToInt32(textBox1.Text));
//连接对应的端口
socketsend.Connect(port);
ShowMsg(socketsend.RemoteEndPoint+ ": 连接成功!");
//开辟新的线程用于接收服务器发来的数据
Thread th = new Thread(receive);
th.IsBackground = true;
th.Start();
}
catch { }
}
/// <summary>
/// 接收服务器发来的数据
/// </summary>
public void receive()
{
while(true)
{
try {
byte[] buffer = new byte[1024 * 1024 * 2];
int i = socketsend.Receive(buffer);
//接收到的数据长度为0时表示连接断开,跳出循环
if (i == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, i);
ShowMsg(socketsend.RemoteEndPoint+":"+ str);
}
catch { }
}
}
/// <summary>
/// 显示提示信息
/// </summary>
/// <param name="str"></param>
public void ShowMsg(string str)
{
textBox3.AppendText(str + "rn");
}
三、客户端与服务器发送数据
1.客户端”发送“
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string str = textBox4.Text;
Byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketsend.Send(buffer);
}
2.服务器”发送“
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string str = textBox3.Text;
byte[] buffer = Encoding.UTF8.GetBytes(str);
dicSocket[comboBox1.SelectedItem.ToString()].Send(buffer);
//socketsend.Send(buffer);
}
四、常见问题点
1、线程中不能操作界面控件
/// <summary>
/// 将检查线程调用界面控件设置为false
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
2、可能出错的地方加上try{}catch{}
3、断开连接后会一直接收长度为0的数据,需要判断长度为0时跳出接收数据的循环
4、连接/接收数据时处于while循环中,需要将连接的代码放在后台线程中,否则容易出现卡界面的情况
最后
以上就是奋斗白云为你收集整理的C#实现客户端与服务器的TCP通讯前言一、客户端与服务器界面二、客户端与服务器的连接、接收数据三、客户端与服务器发送数据四、常见问题点的全部内容,希望文章能够帮你解决C#实现客户端与服务器的TCP通讯前言一、客户端与服务器界面二、客户端与服务器的连接、接收数据三、客户端与服务器发送数据四、常见问题点所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复