3 Star 21 Fork 12

LinYong/多功能通信工具

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
SocketDemo.cs 24.48 KB
一键复制 编辑 原始数据 按行查看 历史
LinYong 提交于 12个月前 . Socket完成
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
using CommunicationTools.Helper;
using Sunny.UI;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading.Channels;
namespace CommunicationTools.Controls
{
public partial class SocketDemo : UIPage
{
public SocketDemo()
{
InitializeComponent();
}
//判断是否打开
private bool _isOpen = false;
// 设置文件路径为当前目录下的LogFile.txt
private string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LogSocketFile.txt");
//消息队列
private Channel<string> _messageChannel;
//Token
CancellationTokenSource _ctsTCPClient = new CancellationTokenSource();
CancellationTokenSource _ctsTCPServer = new CancellationTokenSource();
CancellationTokenSource _ctsUDP = new CancellationTokenSource();
bool _autoScroll = true;
bool _ischeckRandom = false;
private bool _log = false;
Random rd = new Random();
Encoding encode = Encoding.UTF8;
//控制串口设置
private void Enable(bool flag)
{
TCPClient_Radio.Enabled = flag;
TcpServer_Radio.Enabled = flag;
UDP_Radio.Enabled = flag;
textbox_IP.Enabled = flag;
//btn_random.Enabled = flag;
if (TCPClient_Radio.Checked || UDP_Radio.Checked)
{
this.textbox_port.Enabled = true;
this.textbox_localPort.Enabled = false;
}
if (TcpServer_Radio.Checked)
{
textbox_port.Enabled = false;
textbox_localPort.Enabled = true;
}
}
/// <summary>
/// 连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void uiButton1_Click(object sender, EventArgs e)
{
try
{
if (_isOpen)
{
//serialPort.Close();
btn_open.Text = "连接网络";
LogBox.AppendText("连接关闭".FormatStringLog());
Enable(true);
_ctsTCPClient?.Cancel();
_ctsTCPServer?.Cancel();
_ctsUDP?.Cancel();
//_cts?.Cancel();
}
else
{
Enable(false);
btn_open.Text = "关闭连接";
//选择连接对象
if (TCPClient_Radio.Checked)
{
_ctsTCPClient = new CancellationTokenSource();
ConnectToTcpServer(textbox_IP.Text, textbox_port.Text.ToInt(), _ctsTCPClient.Token);
}
else if (TcpServer_Radio.Checked)
{
_ctsTCPServer = new CancellationTokenSource();
StartTcpServer(textbox_localPort.Text.ToInt(), _ctsTCPServer.Token);
}
else if (UDP_Radio.Checked)
{
_ctsTCPServer = new CancellationTokenSource();
StartUdpClient(textbox_IP.Text, textbox_port.Text.ToInt(), _ctsUDP.Token);
}
}
}
catch (Exception ex)
{
// 处理异常
Console.WriteLine("An error occurred: {0}", ex.Message);
}
finally
{
_isOpen = !_isOpen;
}
}
//==============================连接网络===========================================
// TcpClient方法
public async Task ConnectToTcpServer(string ipAddress, int port, CancellationToken cts)
{
// 创建一个TcpClient实例
using (TcpClient client = new TcpClient())
{
try
{
// 解析IP地址
IPAddress ip = IPAddress.Parse(ipAddress);
// 创建一个远程端点
IPEndPoint remoteEndPoint = new IPEndPoint(ip, port);
// 连接到服务器
await client.ConnectAsync(remoteEndPoint);
LogBox.AppendText($"Connected to {ip}:{port}".FormatStringLog());
// 获取网络流
using (NetworkStream stream = client.GetStream())
{
// 初始化通道
_messageChannel = Channel.CreateUnbounded<string>(new UnboundedChannelOptions
{
SingleWriter = true,
SingleReader = true
});
// 开始监听通道中的数据并发送
Task senderTask = Task.Run(async () =>
{
await foreach (var message in _messageChannel.Reader.ReadAllAsync(cts))
{
await Task.Delay(100);
byte[] data = Encoding.ASCII.GetBytes(message);
await stream.WriteAsync(data, cts);
if (radio_send_ascii.Checked)
{
Invoke(() =>
{
LogBox.AppendText($"Sent message:{message}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
else
{
Invoke(() =>
{
LogBox.AppendText($"Sent message:{message.StringToHexString(encode)}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
}
}, cts);
// 开始接收来自服务器的消息
Task receiverTask = Task.Run(async () =>
{
byte[] buffer = new byte[1024];
while (!cts.IsCancellationRequested)
{
await Task.Delay(100);
int bytesRead = await stream.ReadAsync(buffer, cts);
string receivedMessage;
if (radio_save_ascii.Checked)
{
receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Invoke(() =>
{
LogBox.AppendText($"Received message: {receivedMessage}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
else if (radio_save_hex.Checked)
{
receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Invoke(() =>
{
LogBox.AppendText($"Received message: {receivedMessage.StringToHexString(encode)}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
else
{
receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Invoke(() =>
{
LogBox.AppendText($"Received message: {receivedMessage}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
}
}, cts);
// 等待发送和接收任务完成
await Task.WhenAny(senderTask, receiverTask, Task.Delay(-1, cts));
}
}
catch (SocketException e)
{
MessageBox.Show("连接出错");
}
catch (Exception e)
{
throw e;
}
}
}
//TCPServer方法
public async Task StartTcpServer(int port, CancellationToken cts)
{
try
{
// 创建一个新的TcpListener实例来监听连接
IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
//注意这里
IPAddress ip = host.AddressList.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
IPEndPoint localEndPoint = new IPEndPoint(ip, port);
using (TcpListener server = new TcpListener(localEndPoint))
{
server.Start();
LogBox.AppendText($"Server started on {ip}:{port}".FormatStringLog());
while (!cts.IsCancellationRequested)
{
// 等待客户端连接
TcpClient client = await server.AcceptTcpClientAsync();
LogBox.AppendText($"Client connected from {((IPEndPoint)client.Client.RemoteEndPoint).Address}:{((IPEndPoint)client.Client.RemoteEndPoint).Port}".FormatStringLog());
// 获取网络流
using (NetworkStream stream = client.GetStream())
{
// 初始化通道
_messageChannel = Channel.CreateUnbounded<string>(new UnboundedChannelOptions
{
SingleWriter = true,
SingleReader = true
});
// 开始接收来自客户端的消息
Task receiverTask = Task.Run(async () =>
{
byte[] buffer = new byte[1024];
while (!cts.IsCancellationRequested)
{
await Task.Delay(100);
int bytesRead = await stream.ReadAsync(buffer, cts);
string receivedMessage;
if (radio_save_ascii.Checked)
{
receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Invoke(() =>
{
LogBox.AppendText($"Received message: {receivedMessage}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
else if (radio_save_hex.Checked)
{
receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Invoke(() =>
{
LogBox.AppendText($"Received message: {receivedMessage.StringToHexString(encode)}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
else
{
receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Invoke(() =>
{
LogBox.AppendText($"Received message: {receivedMessage}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
}
}, cts);
// 开始监听通道中的数据并发送到客户端
Task senderTask = Task.Run(async () =>
{
await foreach (var message in _messageChannel.Reader.ReadAllAsync(cts))
{
await Task.Delay(100);
byte[] data = Encoding.ASCII.GetBytes(message);
await stream.WriteAsync(data, cts);
if (radio_send_ascii.Checked)
{
Invoke(() =>
{
LogBox.AppendText($"Sent message: {message}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
else
{
Invoke(() =>
{
LogBox.AppendText($"Sent message: {message.StringToHexString(encode)}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
}
}, cts);
// 等待发送和接收任务完成
await Task.WhenAny(senderTask, receiverTask, Task.Delay(-1, cts));
}
// 关闭连接
client.Close();
}
}
}
catch (SocketException e)
{
MessageBox.Show("Server socket error" + e.Message);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
//UDP方法
public async Task StartUdpClient(string ipAddress, int port, CancellationToken cts)
{
try
{
// 创建一个新的 UdpClient 实例
using (UdpClient client = new UdpClient())
{
// 设置远程端点
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port);
// 初始化通道
_messageChannel = Channel.CreateUnbounded<string>(new UnboundedChannelOptions
{
SingleWriter = true,
SingleReader = true
});
// 开始监听通道中的数据并发送
Task senderTask = Task.Run(async () =>
{
await foreach (var message in _messageChannel.Reader.ReadAllAsync(cts))
{
byte[] data = Encoding.ASCII.GetBytes(message);
await client.SendAsync(data, data.Length, remoteEndPoint);
Invoke(() =>
{
LogBox.AppendText($"Sent message: {message} to {ipAddress}:{port}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
}, cts);
// 接收响应
Task receiverTask = Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
{
UdpReceiveResult result = await client.ReceiveAsync(cts);
string receivedMessage = Encoding.ASCII.GetString(result.Buffer, 0, result.Buffer.Length);
Invoke(() =>
{
LogBox.AppendText($"Received response: {receivedMessage} from {result.RemoteEndPoint}".FormatStringLog());
if (_autoScroll)
{
LogBox.SelectionStart = LogBox.Text.Length;
LogBox.ScrollToCaret();
}
});
}
}, cts);
// 等待发送和接收任务完成
await Task.WhenAny(senderTask, receiverTask, Task.Delay(-1, cts));
}
}
catch (SocketException e)
{
MessageBox.Show("UDP Socket error occurred.");
}
}
//选择了TCPClient
private void TCPClient_Radio_CheckedChanged(object sender, EventArgs e)
{
if (TCPClient_Radio.Checked)
{
this.textbox_port.Enabled = true;
this.textbox_localPort.Enabled = false;
}
}
//选择了TCPClient
private void TcpServer_Radio_CheckedChanged(object sender, EventArgs e)
{
if (TcpServer_Radio.Checked)
{
textbox_port.Enabled = false;
textbox_localPort.Enabled = true;
}
}
//选择了UDP
private void UDP_Radio_CheckedChanged(object sender, EventArgs e)
{
if (UDP_Radio.Checked)
{
textbox_port.Enabled = true;
textbox_localPort.Enabled = false;
}
}
//发送数据
private void btn_send_Click(object sender, EventArgs e)
{
string message = textbox_send.Text;
if (!string.IsNullOrEmpty(message)|| _ischeckRandom)
{
if (_messageChannel is not null)
{
if (_ischeckRandom)
{
if (_RdbtnIsclick)
{
_messageChannel.Writer.TryWrite(rd.Next(22, 400).ToString());
}
}
else
{
_messageChannel.Writer.TryWrite(message);
//Console.WriteLine("Message added to channel: {0}", message);
}
}
else
{
MessageBox.Show("请先连接");
}
}
}
private void CheckBox3_autoscroll_CheckedChanged(object sender, EventArgs e)
{
if (CheckBox3_autoscroll.Checked)
{
_autoScroll = true;
}
else
{
_autoScroll = false;
}
}
//循环发送数据
private bool _RdbtnIsclick = false;
private CancellationTokenSource _ctsSendRd = new CancellationTokenSource();
private void btn_random_Click(object sender, EventArgs e)
{
_ctsSendRd = new CancellationTokenSource();
_RdbtnIsclick = !_RdbtnIsclick;
if (_RdbtnIsclick)
{
btn_random.Text = "关闭循环发送";
Task.Run(async () =>
{
while (!_ctsSendRd.Token.IsCancellationRequested)
{
var time = TextBox_time.Text.ToInt();
await Task.Delay(time);
btn_send_Click(sender, e);
}
}, _ctsSendRd.Token);
}
else
{
_ctsSendRd?.Cancel();
btn_random.Text = "循环发送";
}
}
//随机数
private void CheckBox_random_CheckedChanged(object sender, EventArgs e)
{
_ischeckRandom = !_ischeckRandom;
}
private void CheckBox_savetofill_CheckedChanged(object sender, EventArgs e)
{
_log = !_log;
if (_log)
{
timer1.Start();
}
else
{
timer1.Stop();
}
}
//LogBox值改变后
private void LogAppend()
{
// 确保文件操作在后台线程中进行,避免阻塞UI线程
var logContent = LogBox.Text;
try
{
using (StreamWriter writer = new StreamWriter(logFilePath))
{
// 如果文件非空,则在内容前加上换行符
if (File.Exists(logFilePath) && new FileInfo(logFilePath).Length > 0)
{
writer.WriteLine();
}
// 写入当前LogBox的内容
writer.Write(logContent);
}
}
catch (Exception)
{
throw;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (_log)
{
LogAppend();
}
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/sdfafdsafasdf/Communication-Tools.git
git@gitee.com:sdfafdsafasdf/Communication-Tools.git
sdfafdsafasdf
Communication-Tools
多功能通信工具
master

搜索帮助