欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-10 09:02:02
所使用的:多线程 委托 socket 键值队个人跟着视频做的一个小练习,有兴趣的可以去看一下对于初学者来讲是比较有帮助的连接:https://www.bilibili.com/video/bv1bz4...

所使用的:多线程 委托 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协议的资料请关注其它相关文章!

相关标签: c# tcp udp