C# 使用Tcp/Udp协议的示例代码

所使用的:多线程 委托 Socket 键值队

个人跟着视频做的一个小练习,有兴趣的可以去看一下对于初学者来讲是比较有帮助的

连接:https://www.bilibili.com/video/BV1bZ4y1W74q?p=3&t=358

废话不多说上代码  综合视频中的理解 有什么不对的地方希望大神指点一下

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      myAddOnlieDelegate = AddOnlie;
      myAddTextDelegate = AddTexr;
    }

    private void AddTexr(string str)
    {
      //将文字追加到文本中
      txt_centext.AppendText(str);
    }

    /// <summary>
    /// 委托方法
    /// </summary>
    /// <param name="str"></param>
    /// <param name="bl"></param>
    private void AddOnlie(string str, bool bl)
    {
      if (bl)
      {
        //如果是true的话对listbox.Item进行一个添加
        listOne.Items.Add(str);
      }
      else
      {
        //反之删除
        listOne.Items.Remove(str);
      }
    }

    //实例化Socket
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //接口
    Thread thread = null;
    //键值队
    Dictionary<string, Socket> Dic = new Dictionary<string, Socket>();
    //委托
    delegate void MyAddOnlieDelegate(string str,bool bl);
    delegate void MyAddTextDelegate(string str);
    MyAddOnlieDelegate myAddOnlieDelegate;
    MyAddTextDelegate myAddTextDelegate;
    private void button1_Click(object sender, EventArgs e)
    {
      #region 第一步获取IP和端口进行相互通信
      //获取IP
      IPAddress IP = IPAddress.Parse(txt_IP.Text.Trim());
      //把IP和端口号放在IPEndPoint中
      IPEndPoint IEnd = new IPEndPoint(IP,int.Parse(txt_port.Text.Trim()));
      try
      {
        //和socket进行关联
        socket.Bind(IEnd);
        MessageBox.Show("服务器开启成功!");
      }
      catch (Exception ex)
      {
        //失败了直接return出去
        MessageBox.Show("服务器开启失败" + ex.Message);
        return;
      }
      //socket可以对多少个客户端进行监视
      socket.Listen(10);
      #endregion
      #region 第二部开启多线程
      //开始进行多线程操作 开始执行此线程时要调用的方法的
      thread = new Thread(ListenConnectingl);
      //此线程则为后台线程
      thread.IsBackground = true;
      //启动线程
      thread.Start();
      //连接到服务器后把按钮禁用掉
      button1.Enabled = false;
      #endregion
    }

    /// <summary>
    /// 正在进行的后台线程的方法
    /// </summary>
    private void ListenConnectingl()
    {
      //线程使用时进行循环
      while (true)
      {
        //创建一个新的Socket 列:如果有一个新的客户端来连接服务器给他一个Socket
        Socket socketConnect = socket.Accept();
        //把谁连接的客户端给到skt中 字符串
        string skt = socketConnect.RemoteEndPoint.ToString();
        Dic.Add(skt, socketConnect);
        Invoke(myAddOnlieDelegate, skt, true);
        //更新设备列表 需要接受来自不同客户端的消息 接着在开一个线程
        Thread thr = new Thread(ReceiveMsg);
        thr.IsBackground = true;
        thr.Start(socketConnect);

      }
    }
    /// <summary>
    /// 开的发送接受的线程 直接从上面传递过来参数 vs中没显示用什么类型的 视频中vs显示可以使用object类型 所有类型的基类来展示 带参的
    /// </summary>
    /// <param name="socketConnect"></param>
    private void ReceiveMsg(object socketConnect)
    {
      //as:转换强转 把object转换成Socket
      Socket so = socketConnect as Socket;
      while (true)
      {
        byte[] arr = new byte[1024 * 1024 * 2];
        //定义一个变量
        int Length = -1;
        //try
        //{
          //Receive返回的是一个int类型的数据 如果没有的直接关闭掉
          Length = so.Receive(arr);
        //}
        //catch (Exception)
        //{

        //  //如果字节数没有的话把他移除掉
        //  string str = so.RemoteEndPoint.ToString();
        //  Dic.Remove(str);
        //  //引用的委托
        //  //Invoke(myAddTextDelegate, str+"下线了");
        //  Invoke(myAddOnlieDelegate, str, false);
        //  break;
        //}

        //加的if判断条件
        if (Length == 0)
        {
          //如果字节数没有的话把他移除掉
          string str = so.RemoteEndPoint.ToString();
          Dic.Remove(str);
          //引用的委托
          Invoke(myAddOnlieDelegate, str, false);
          break;
        }
        else
        {
          //如果成功把接受的byte转换成string
          string str = Encoding.UTF8.GetString(arr);
          Invoke(myAddTextDelegate, str+Environment.NewLine);

        }
      }
    }
    /// <summary>
    /// 发送消息  只能发送字节流
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
      //要发送的文字
      string str=txt_gocentext.Text.Trim();
      byte[] bt = Encoding.UTF8.GetBytes(str);
      ///
      if (listOne.SelectedItems.Count == 0)
      {
        MessageBox.Show("请选择要发送的对象");
      }
      else
      {
        foreach (String item in listOne.SelectedItems)
        {
          //send发送到指定的socket中
          Dic[item].Send(bt);
          string Msg = "[发送]" + item + " " + str+ System.Environment.NewLine;
          //使用一个委托直接写入
          Invoke(myAddTextDelegate, Msg+ Environment.NewLine);
        }
      }
    }

    private void button3_Click(object sender, EventArgs e)
    {
      Form2 form2 = new Form2();
      form2.Show();
    }
  }

以上就是C# 使用Tcp/Udp协议的示例代码的详细内容,更多关于C# 使用Tcp/Udp协议的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用C#实现基于TCP和UDP协议的网络通信程序的基本示例

    C#中使用TCP通信 TCP通信需要通信双方都在线,所以需要先启动服务端进行监听,客户端才能获得连接,服务端代码: static void Main(string[] args) { TcpClient client = null; NetworkStream stream = null; byte[] buffer = null; string receiveString = null; IPAddress localIP = IPAddress.Parse("127.0.0.1")

  • C#基于TCP协议的服务器端和客户端通信编程的基础教程

    运行在TCP之上常见的网络应用协议有比如HTTP.FTP.SMTP.POP3.IMAP. TCP是TCP/IP体系中最重要的传输协议,它提供全双工和可靠交付的服务,是大多数应用协议工作的基础. TCP是一种面向连接(连接导向)的,可靠的,基于字节流的传输层通信协议. TCP的工作过程 建立连接 传输数据 连接的终止 TCP的主要特点 1.TCP是面向连接的协议 2.是端到端的通信.每个TCP连接只能有两个端点,而且只能一对一通信,不能点对多的 的直接通信 3.高可靠性 4.全双工方式传输 5.数

  • 基于C#的UDP协议的同步通信实现代码

    一.摘要 总结基于C#的UDP协议的同步通信.  二.实验平台 Visual Studio 2010  三.实验原理 UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述. 四.实例 4.1 采用socket实现UDP 由于UDP是一种无连接的协议.因此,为了使服务器应用能够发送和接收UDP数据包,则需要做两件事情: (1) 创建一个Socket对象: (2) 将创建的套接字对象与本地IPEndPoint进行绑定. 完成上述步骤后,那么创建的套接字就能够在IPEndPoint上接收流

  • C#的Socket实现UDP协议通信示例代码

    今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层--传输层.与TCP协议同层,都是提供信息的传输服务,但与TCP最大区别就是,它是一种无连接不可靠的信息传输. 什么是无连接不可靠?直白点讲就是,发送数据的时候,直接把UDP包往网络一扔就完事了,接不接受收到发送的就不理了:接受数据的时候,有发给本地的UDP包就照单全收,收完再看是谁发的.相比TCP,少了握手建立连接

  • C# 使用Tcp/Udp协议的示例代码

    所使用的:多线程 委托 Socket 键值队 个人跟着视频做的一个小练习,有兴趣的可以去看一下对于初学者来讲是比较有帮助的 连接:https://www.bilibili.com/video/BV1bZ4y1W74q?p=3&t=358 废话不多说上代码  综合视频中的理解 有什么不对的地方希望大神指点一下 public partial class Form1 : Form { public Form1() { InitializeComponent(); myAddOnlieDelegate

  • Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例

    本文实例讲述了Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能.分享给大家供大家参考,具体如下: 由于目前工作的需要,需要在IPv4和IPv6两种网络模式下TCP和UDP的连接,要做到客户端发包,服务端收包. 前几天写了代码,但是把UDP的客户端和服务端使用TCP模式的代码了.今天在公司使用该工具的时候,发现了问题,忘记了UDP不需要验证.疏忽,疏忽.不过刚刚接触编程,可以原谅. 现在在家,已经把代码改好了.经测试可以使用. 先运行客户端: python Mini

  • QT5实现UDP通信的示例代码

    目录 前言 一.UDP通信概述 二.UDP单播模式 1.接收数据 2.发送数据 总结 代码h文件 代码c文件 前言 该例程经过实际验证可以正常使用,只简单的使用UDP中的单播模式(一对一),其余模式将在后期逐步说明...... 所用测试系统在同一局域网,其中: QT版本:5.12 PC端UDP模式:单播 UDP通信目标:基于STM32F4+LWIP协议的以太网接口 一.UDP通信概述 UDP是轻量的.不可靠的.面向数据报.无连接的协议,它可以用于对可靠性要求不高的场合,和TCP通信不同,两个程序

  • C#中使用async和await实现异步Udp通讯的示例代码

    目录 C/S架构 客户端实现 客户端主流程和实现 客户端发送消息实现 客户端监听消息实现 服务器实现 服务器主流程和实现 服务器发送消息实现 服务器监听消息实现 总结 在之前的C#版本中, 如果我们想要进行异步的Udp, 需要单开线程接收消息, C#7.1开始, 我们可以使用async/await关键字来编写异步代码, 我们今天一起来探索怎么实现. C/S架构 我们要实现两个app, 一个客户端和一个服务器, 各自都可以发消息和收消息.发消息很简单, 收消息的话需要一直在端口上监听. udp相比

  • Qt实现UDP通信的示例代码

    目录 服务器端-单线程 客户端 测试结果-单线程 服务器端-多线程 测试结果-多线程 设想有如下场景:若干的客户端与服务器端建立连接,建立连接后,服务器端随机发送字符串给客户端,客户端打印输出.该节案例使用TCP编程. 服务器端-单线程 头文件 #pragma once // //tcp服务端-单线程处理客户端连接 #include <QAbstractSocket> #include <QObject> class QTcpServer; class SimpleTcpSocke

  • python实现一个简单的udp通信的示例代码

    什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. python创建套接字 socket.socket([family[, type[, proto]]]) 参数解析: family: AF_UNIX(适用跨机通信) 或 AF_INET(IPv4)(适用本机通信) type: 套接字类型,可以根据是面向连接的还是非连接分为 SOCK_STREAM(TCP) 或 SO

  • Python基于socket模块实现UDP通信功能示例

    本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import socket #使用IPV4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定端口和端口号,空字符串表示本机任何可用IP地址 s.bind(('', 5000)) while True: data, addr=s.recvfrom(1024) #显示接收到的内容 print(

  • linux shell 脚本实现tcp/upd协议通讯(重定向应用)

    前几天发了重定向以及管道相关使用方法,今天这里发些很有趣的例子.通过重定向实现基于tcp/udp协议的软件通讯. linux 设备里面有个比较特殊的文件: /dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口.如果主机以及端口存在,就建立一个socket 连接.将在,/proc/self/fd目录下面,有对应的文件出现. 一.测试下:/dev/tcp/host/post文件 [chengmo@centos5  sh

  • SpringBoot Webflux创建TCP/UDP server并使用handler解析数据

    目录 1.pom依赖 引用spring-boot-starter-webflux依赖 2.创建UDP/TCPServer 3.数据解析handler(具体解析根据协议来) 解析UDP数据handler 解析TCP数据handler 4.测试工具 推荐使用SocketTool调试TCP/UDP协议 1.pom依赖 引用spring-boot-starter-webflux依赖 <?xml version="1.0" encoding="UTF-8"?> &

随机推荐