网络数据的传输与监听
强烈建议去微软官网看文档,UI组件类未贴出,且这个乱↓↓↓
一.监听端口
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Diagnostics;
namespace Net_IP_License
{
/// <summary>
/// 考察内容
/// (1)前台线程和后台线程:
/// 应用程序必须完成所有的前台线程,才能退出
/// 应用程序退出时,不必等后台线程执行完成;程序退出时,后台程序会自动退出。
/// 应用程序默认创建的是前台程序。
/// (2)TcpListener类
/// TcpListener tcpListener = new TcpListener(ipAddresss, userport);
/// tcpListener.Start();
/// TcpClient tcpClient = tcpListener.AcceptTcpClient();
/// </summary>
/// <param name="text"></param>
delegate void UpdateDisplayDelegate(string text);
public partial class TCPReceive : Form
{
//Task tk;
string str_ListenIP;
Thread thread;
bool flag_Listen = false;
TcpListener tcpListener;
TcpClient tcpClient;
public TCPReceive()
{
InitializeComponent();
}
private void initListen()
{
IPAddress ipAddresss = IPAddress.Parse(str_ListenIP);
int userport = int.Parse(tb_ListenPort.Text);
tcpListener = new TcpListener(ipAddresss, userport);
tcpListener.Start();
}
public void userListen() //只有当检测到数据时,触发此函数。
{
try
{
while (flag_Listen) //保持线程继续运行,否则,执行一次就结束了。
{
//确认是否有挂起的连接请求, true:有连接请求
if (tcpListener.Pending() == false)
{
Thread.Sleep(500);
continue;
}
tcpClient = tcpListener.AcceptTcpClient(); //阻塞的方法,等待返回值后,才往下执行.
NetworkStream netStream = tcpClient.GetStream();
StreamReader reader = new StreamReader(netStream);
string context = reader.ReadToEnd();
Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { context });
reader.Close();
netStream.Close();
tcpClient.Close();
}
MessageBox.Show("监听线程结束!");
}
catch (Exception ex)
{
MessageBox.Show("侦听过程中触发:" + ex.Message.ToString(), "异常提示");
}
}
public void UpdateDisplay(string text)
{
tb_TextShow.Text +=string.Format("[{0}]:",DateTime.Now.ToString())+text+"\r\n";
}
private void btn_listen_Click(object sender, EventArgs e)
{
str_ListenIP = tb_listenIPAddress.Text.Trim();
if (btn_listen.Tag.ToString() == "0")
{
btn_listen.Tag = "1";
btn_listen.BackColor = Color.Brown;
flag_Listen = true;
initListen();
if (threadIsRunning() == false)
{
thread = new Thread(new ThreadStart(userListen));
thread.IsBackground = true;
thread.Start();
}
}
else
{
btn_listen.Tag = "0";
btn_listen.BackColor = Color.ForestGreen;
flag_Listen = false;
tcpListener.Stop();
}
}
private bool threadIsRunning()
{
if (thread == null) { return false; }
return thread.IsAlive;
}
private void TCPReceive_FormClosing(object sender, FormClosingEventArgs e)
{
if(tcpListener!=null)
{
flag_Listen = false;
tcpListener.Stop();
thread.Abort();
}
}
}
}
二.数据传输
1.插件(.dll)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace userDefNetLink
{
/// <summary>
/// 网络收发端
/// 1.初始化网络
/// 2.网络发送
/// 3.网络接收
/// 4.网络断开
/// </summary>
enum flag_Result{OK=0,lostIP,errSend };
public class Def_NetLink
{
private TcpClient userTCP;
//定义返回值
public int sendDatas(string hostName, string Port, byte[] bts)
{//userTCP仅能使用一次!每次都要重新初始化
byte[] userBts = bts;
if (InitNetSend(hostName, Port)==true)
{
return (int)(sendData(userBts));
}
else
{
return (int)flag_Result.lostIP;
}
}
private bool InitNetSend(string hostName, string Port)
{
try
{
userTCP = new TcpClient(hostName, int.Parse(Port));
return true;
}
catch
{
userTCP = null;
return false;
}
}
private flag_Result sendData(byte[] userBts)
{
try
{
NetworkStream netStrStream = userTCP.GetStream();
netStrStream.Write(userBts, 0, userBts.Length);
netStrStream.Close();
userTCP.Close();
return flag_Result.OK;
}
catch
{
return flag_Result.errSend;
}
}
}
}
2.主程序调用插件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using userDefNetLink;
namespace sample_Send
{
public partial class Form1 : Form
{
Def_NetLink userDefNetLink;
byte[] userBts;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
userDefNetLink = new Def_NetLink();
}
private void btn_Send_Click(object sender, EventArgs e)
{
sendData();
}
private void sendData()
{
string strIP = tb_IP.Text;
string strPort = tb_Port.Text;
string strContext = string.Empty;
strContext = tb_Context.Text;
if (string.IsNullOrWhiteSpace(strContext) == false)
{
userBts = Encoding.UTF8.GetBytes(strContext);
}
else
{
showInfo("请输入传输的内容!");
return;
}
int flag_Result = -1;
flag_Result = userDefNetLink.sendDatas(strIP, strPort, userBts);
switch (flag_Result)
{
case 0:
break;
case 1:
showInfo("无法连接到目标主机!");
break;
case 2:
showInfo("数据传输过程中出现异常!");
break;
}
}
private void linkLabel_Clear_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
this.tb_Context.Text = "";
}
private void showInfo(string str)
{
MessageBox.Show(str);
}
private void btn_GetCKCode_Click(object sender, EventArgs e)
{
string str = tb_UserData.Text;
int length = 0;
try
{
string[] strs = str.Split(' ');
length = strs.Length;
byte[] bts = new byte[length + 1];
for(int i=0;i<length;i++)
{
byte.TryParse(strs[i],System.Globalization.NumberStyles.HexNumber,null, out bts[i]);
}
bts[length] = getCheckCode(bts);
tb_Context.Text = str + " " + bts[length].ToString("X2");
}
catch
{
showInfo("特定数据的格式不正确");
}
//tb_Context.Text+=""
}
private byte getCheckCode(byte[] bts)
{//校验合格:true,否则:false
int length = bts.Length;
int sum = 0;
for (int i = 0; i < length - 1; i++)
{
sum += bts[i] * (int)Math.Pow(2,i);
}
int R = sum % (length-1);
return (byte)R;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!