c#编写TCP助手(客户端和服务端)
·


上面是制作出来的助手软件样式,所有代码放在下面,可以直接复制粘贴使用,里面的每行代码我都有注释,会有两个引用文件,可以私信我获取。
TCPClient客户端:
using System.Configuration;
using System.Diagnostics;
using System.Net;
using System.Text;
using STTech.BytesIO.Tcp;
using text;
namespace TCPClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false; //关闭线程检测
hostAddress.SelectedIndex = 0; //默认选中第一个主机地址
hostPort.Text = "8080"; //默认端口号
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//告知计算机用什么编码给是解码
client.OnDataReceived += Client_OnDataReceived; //引入监听事件,接收消息
ASCII.Checked = true; //接收配置默认选中ASCII显示
sendASCII.Checked = true; //发送配置默认选中ASCII显示
}
private void Form1_Load(object sender, EventArgs e)
{
//获取本机ip地址
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
//Console.WriteLine("IP Address = " + ip.ToString());
hostAddress.Items.Add(ip.ToString());
}
}
}
//接收消息
private void messageShow(string msg)
{
receivingBox.AppendText($"{DateTime.Now} {client.Host}:{client.Port}\r\n {msg} \r\n"); //接收框显示内容 client.Host主机地址 client.Port端口号
}
private void Client_OnDataReceived(object? sender, STTech.BytesIO.Core.DataReceivedEventArgs e) //e.Data 是字节,传输信息时使用字节传输
{
//接收消息时是否选中十六进制框
if (ASCII.Checked)
{
string str = Encoding.GetEncoding("gb2312").GetString(e.Data).Replace("\0", "\\0"); //未选中就使用gb2312编码格式解码,转换成字符串显示
messageShow(str);
}
else if (HEX.Checked)
{
string str1 = Transform.ToHexString(e.Data, " "); //选中后,将转化成十六进制字符串显示
messageShow(str1);
}
}
//接收配置清空按钮
private void clearMessage_Click(object sender, EventArgs e)
{
receivingBox.Text = "";
}
//连接按钮
TcpClient client = new TcpClient(); //引入TcpClient
private void configuratio()
{
client.Host = hostAddress.Text; //主机地址赋值
client.Port = int.Parse(hostPort.Text); //端口号赋值
}
private void connect_Click(object sender, EventArgs e)
{
if (hostAddress.Text == "")
{
MessageBox.Show("本地主机地址不能为空!");
}
else if (hostPort.Text == "")
{
MessageBox.Show("本机主机端口号不能为空!");
}
else
{
configuratio();//建立连接之前一定要更改配置
client.Connect(); //建立连接
//点击连接之后会禁用掉按钮,主机地址和端口号输入框禁用,点击断开会重新释放连接按钮
connect.Enabled = false; //禁用连接按钮
disconnect.Enabled = true; //启用断开按钮
hostAddress.Enabled = false; //禁用主机地址选择框
hostPort.Enabled = false; //禁用端口号输入框
state.Text = "连接成功";
}
}
//断开按钮
private void disconnect_Click(object sender, EventArgs e)
{
//点击断开之后会禁用掉按钮,主机地址和端口号输入框启用,点击连接会重新释放断开按钮
client.Disconnect();
connect.Enabled = true; //启用连接按钮
disconnect.Enabled = false; //禁用断开按钮
hostAddress.Enabled = true; //启用主机地址选择框
hostPort.Enabled = true;//启用端口号输入框
state.Text = "断开连接";
}
//发送框操作
private List<byte> sendBuffer = new List<byte>(); //发送数据缓存
private void InputBox_Leave(object sender, EventArgs e)
{
//选择十六进制
if (sendHEX.Checked)
{
if (DataEncoding.IsHexString(InputBox.Text.Replace(" ", "")))
{
sendBuffer.Clear(); //存入数据之前清空缓存区
sendBuffer.AddRange(Transform.ToBytes(InputBox.Text.Replace(" ", ""))); //将数据转换成十六进制存入缓存区
}
else
{
MessageBox.Show("请输入正确的十六进制数据");
InputBox.Select(); //提示格式错误后,聚焦输入框
}
}
else
{
sendBuffer.Clear();//存入数据之前清空缓存区
sendBuffer.AddRange(Encoding.GetEncoding("gb2312").GetBytes(InputBox.Text)); //将数据转换成字节存入缓存区
}
}
//发送按钮
private void sendBtn_Click(object sender, EventArgs e)
{
if (connect.Enabled == true)
{
MessageBox.Show("网络尚未连接,发送失败!");
}
else
{
if (InputBox.Text == "")
{
MessageBox.Show("发送框不能为空!");
}
else
{
client.Send(sendBuffer.ToArray()); //发送缓存区的数据
}
}
}
//发送配置清空按钮
private void sendClear_Click(object sender, EventArgs e)
{
InputBox.Text = "";
}
private void sendHEX_CheckedChanged(object sender, EventArgs e)
{
if (sendHEX.Checked)
{
InputBox.Text = Transform.ToHexString(sendBuffer.ToArray()," "); //选择十六进制选择框时,将缓存区的字节转换为十六进制字符串显示
}
}
private void sendASCII_CheckedChanged(object sender, EventArgs e)
{
if (sendASCII.Checked)
{
InputBox.Text = Encoding.GetEncoding("gb2312").GetString(sendBuffer.ToArray()).Replace("\0", "\\0");//选择ASCII选择框时,将缓存区的字节转换为字符串显示
}
}
}
}
TCPSever服务端:
using System.Configuration;
using System.Net;
using System.Text;
using STTech.BytesIO.Tcp;
using TCPServer;
namespace TCPSever
{
public partial class Form1 : Form
{
TcpServer sever = new TcpServer();
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//告知计算机使用什么编码格式解码
ascii.Checked = true; //默认选中ASCII显示
}
private void Form1_Load(object sender, EventArgs e)
{
hostAdress.SelectedIndex = 0; //本机地址默认选中第一个
portNumber.Text = "8080"; //默认端口
sever.Started += Sever_Started; //启动事件
sever.Closed += Sever_Closed; //关闭事件
sever.ClientConnected += Sever_ClientConnected; //处理新客户端连接
sever.ClientDisconnected += Sever_ClientDisconnected; //处理客户端断开连接
//获取本机ip地址
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
hostAdress.Items.Add(ip.ToString());
}
}
}
//处理客户端断开连接
private void Sever_ClientDisconnected(object? sender, STTech.BytesIO.Tcp.Entity.ClientDisconnectedEventArgs e)
{
messageShow($"客户端[{e.Client.Host}:{e.Client.Port}]\r\n断开连接!");
}
//处理新客户端连接
private void Sever_ClientConnected(object? sender, STTech.BytesIO.Tcp.Entity.ClientConnectedEventArgs e)
{
messageShow($"客户端[{e.Client.Host}:{e.Client.Port}]\r\n连接成功!");
e.Client.OnDataReceived += Client_OnDataReceived; //监听客户端信息
}
//监听客户端信息
private void Client_OnDataReceived(object? sender, STTech.BytesIO.Core.DataReceivedEventArgs e)
{
TcpClient tcpClient = (TcpClient)sender;
//选中十六进制框
if (hex.Checked)
{
string str = Transform.ToHexString(e.Data, " ");
messageShow($"收到来着客户端[{tcpClient.RemoteEndPoint}]的消息 \r\n {str}"); //将消息转化为十六进制字符串显示
}
else
{
string str1 = Encoding.GetEncoding("gb2312").GetString(e.Data).Replace("\0", "\\0"); //未选中就使用gb2312编码格式解码,转换成普通字符串显示
messageShow($"收到来着客户端[{tcpClient.RemoteEndPoint}]的消息 \r\n {str1}");
}
}
//关闭事件
private void Sever_Closed(object? sender, EventArgs e)
{
messageShow("停止监听");
}
//启动事件
private void Configuratio()
{
sever.Host = hostAdress.Text; //更改主机地址
sever.Port = int.Parse(portNumber.Text); //更改端口号,portNumber里面的为字符串而端口号是number类型,所以要转换类型
}
private void Sever_Started(object? sender, EventArgs e)
{
messageShow("开始监听");
}
//开始监听按钮
private void startListening_Click(object sender, EventArgs e)
{
Configuratio(); //更改配置
sever.StartAsync(); //开启监听
startListening.Enabled = false; //禁用监听按钮
stopListening.Enabled = true; //开启断开按钮
hostAdress.Enabled = false; //禁用主机地址选择框
portNumber.Enabled = false; //禁用端口号选择框
}
//停止监听按钮
private void stopListening_Click(object sender, EventArgs e)
{
sever.CloseAsync(); //关闭监听
startListening.Enabled = true;//启用监听按钮
stopListening.Enabled = false;//禁用断开按钮
hostAdress.Enabled = true;//启用主机地址选择框
portNumber.Enabled = true;//启用端口号选择框
}
//接收消息方法
private void messageShow(string msg)
{
receiveMessage.AppendText($"[{DateTime.Now}],{msg}\r\n");
}
private void clearMessage_Click(object sender, EventArgs e)
{
receiveMessage.Text = "";
}
}
}
以上是个人见解,如有不对之处,望各位大佬指出。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)