服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 使用Tcp/Udp协议的示例代码

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

2022-09-29 16:23寻梦人i C#

这篇文章主要介绍了C# 使用Tcp/Udp协议的示例,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
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协议的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/xunmengrenli/p/13377971.html

延伸 · 阅读

精彩推荐
  • C#C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    这篇文章主要给大家总结介绍了关于C#中如何将MongoDB->RunCommand结果映射到业务类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一...

    波斯码5132022-02-23
  • C#C#在WinForm中使用WebKit传递js对象实现与网页交互的方法

    C#在WinForm中使用WebKit传递js对象实现与网页交互的方法

    这篇文章主要介绍了C#在WinForm中使用WebKit传递js对象实现与网页交互的方法,涉及针对WebBroswer控件及WebKit控件的相关使用技巧,需要的朋友可以参考下...

    lyflcear10032021-11-15
  • C#WPF字体或内容模糊的解决方法

    WPF字体或内容模糊的解决方法

    WPF下开发的程序字体模糊,这个问题或许大家都有遇到过,为了解决WPF字体模糊,查阅了各种资料,结果偶然发现是自己疏忽了一些细节造成的,具体是什...

    王旭9722021-12-13
  • C#在C#项目中如何使用NHibernate详解

    在C#项目中如何使用NHibernate详解

    NHibernate的设计思想和Hibernate的设计思想基本相同,都是为了避免频繁的编写sql脚本,使用面向对象的方式使用hql语句进行查询。下面这篇文章主要给大家介...

    灵动生活12032022-02-22
  • C#在C#中使用二叉树实时计算海量用户积分排名的实现详解

    在C#中使用二叉树实时计算海量用户积分排名的实现详解

    这篇文章主要介绍了在C#中使用二叉树实时计算海量用户积分排名的实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考...

    balahoho6162022-08-16
  • C#利用C#实现最基本的小说爬虫示例代码

    利用C#实现最基本的小说爬虫示例代码

    最近在学习c#,碰巧遇到个小说站不错,就索性当个练习,所以这篇文章主要给大家介绍了关于利用C#实现最基本的小说爬虫的相关资料,文中给出了详细的...

    XinYiBuFang6682022-01-24
  • C#C#如何使用Bogus创建模拟数据示例代码

    C#如何使用Bogus创建模拟数据示例代码

    这篇文章主要给大家介绍了关于C#如何使用Bogus创建模拟数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价...

    Lamond Lu8322022-07-21
  • C#WPF简单的数据库查询实例

    WPF简单的数据库查询实例

    下面小编就为大家分享一篇WPF简单的数据库查询实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    happy多乐4792022-02-12