网络数据的传输与监听

强烈建议去微软官网看文档,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;
}
}
}

posted @   冲云霄  阅读(202)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示