0%

C#使用UdpClient发送和接收UDP数据示例 - 无网不进 - 博客园

Excerpt

C#使用UdpClient发送和接收UDP数据示例


复制代码

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
<span>  1</span> <span>using</span><span> System;
</span><span> 2</span> <span>using</span><span> System.Collections.Generic;
</span><span> 3</span> <span>using</span><span> System.ComponentModel;
</span><span> 4</span> <span>using</span><span> System.Data;
</span><span> 5</span> <span>using</span><span> System.Drawing;
</span><span> 6</span> <span>using</span><span> System.Linq;
</span><span> 7</span> <span>using</span><span> System.Text;
</span><span> 8</span> <span>using</span><span> System.Threading.Tasks;
</span><span> 9</span> <span>using</span><span> System.Windows.Forms;
</span><span> 10</span>
<span> 11</span> <span>//</span><span>本段代码中需要新增加的命名空间</span>
<span> 12</span> <span>using</span><span> System.Net.Sockets;
</span><span> 13</span> <span>using</span><span> System.Net;
</span><span> 14</span> <span>using</span><span> System.Threading;
</span><span> 15</span>
<span> 16</span> <span>namespace</span><span> WinForm1
</span><span> 17</span> <span>{
</span><span> 18</span> <span>public</span> <span>partial</span> <span>class</span><span> Form1 : Form
</span><span> 19</span> <span> {
</span><span> 20</span> <span>public</span><span> Form1()
</span><span> 21</span> <span> {
</span><span> 22</span> <span> InitializeComponent();
</span><span> 23</span> <span> }
</span><span> 24</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 25</span> <span>///</span><span> 用于UDP发送的网络服务类
</span><span> 26</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 27</span> <span>private</span><span> UdpClient udpcSend;
</span><span> 28</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 29</span> <span>///</span><span> 用于UDP接收的网络服务类
</span><span> 30</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 31</span> <span>private</span><span> UdpClient udpcRecv;
</span><span> 32</span>
<span> 33</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 34</span> <span>///</span><span> 按钮:发送数据
</span><span> 35</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 36</span> <span>///</span> <span>&lt;param name="sender"&gt;&lt;/param&gt;</span>
<span> 37</span> <span>///</span> <span>&lt;param name="e"&gt;&lt;/param&gt;</span>
<span> 38</span> <span>private</span> <span>void</span> btnSend_Click(<span>object</span><span> sender, EventArgs e)
</span><span> 39</span> <span> {
</span><span> 40</span> <span>if</span> (<span>string</span><span>.IsNullOrWhiteSpace(txtSendMssg.Text))
</span><span> 41</span> <span> {
</span><span> 42</span> MessageBox.Show(<span>"</span><span>请先输入待发送内容</span><span>"</span><span>);
</span><span> 43</span> <span>return</span><span>;
</span><span> 44</span> <span> }
</span><span> 45</span>
<span> 46</span> <span>//</span><span> 匿名发送
</span><span> 47</span> <span>//</span><span>udpcSend = new UdpClient(0); </span><span>//</span><span> 自动分配本地IPv4地址
</span><span> 48</span> <span>//</span><span> 实名发送</span>
<span> 49</span> IPEndPoint localIpep = <span>new</span> IPEndPoint(IPAddress.Parse(<span>"</span><span>127.0.0.1</span><span>"</span>), <span>12345</span>); <span>//</span><span> 本机IP,指定的端口号</span>
<span> 50</span> udpcSend = <span>new</span><span> UdpClient(localIpep);
</span><span> 51</span> Thread thrSend = <span>new</span><span> Thread(SendMessage);
</span><span> 52</span> <span> thrSend.Start(txtSendMssg.Text);
</span><span> 53</span> <span> }
</span><span> 54</span>
<span> 55</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 56</span> <span>///</span><span> 发送信息
</span><span> 57</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 58</span> <span>///</span> <span>&lt;param name="obj"&gt;&lt;/param&gt;</span>
<span> 59</span> <span>private</span> <span>void</span> SendMessage(<span>object</span><span> obj)
</span><span> 60</span> <span> {
</span><span> 61</span> <span>string</span> message = (<span>string</span><span>)obj;
</span><span> 62</span> <span>byte</span>[] sendbytes =<span> Encoding.Unicode.GetBytes(message);
</span><span> 63</span> IPEndPoint remoteIpep = <span>new</span> IPEndPoint(IPAddress.Parse(<span>"</span><span>127.0.0.1</span><span>"</span>), <span>8848</span>); <span>//</span><span> 发送到的IP地址和端口号</span>
<span> 64</span> <span> udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep);
</span><span> 65</span> <span> udpcSend.Close();
</span><span> 66</span> <span> ResetTextBox(txtSendMssg);
</span><span> 67</span> <span> }
</span><span> 68</span>
<span> 69</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 70</span> <span>///</span><span> 开关:在监听UDP报文阶段为true,否则为false
</span><span> 71</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 72</span> <span>bool</span> IsUdpcRecvStart = <span>false</span><span>;
</span><span> 73</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 74</span> <span>///</span><span> 线程:不断监听UDP报文
</span><span> 75</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 76</span> <span> Thread thrRecv;
</span><span> 77</span>
<span> 78</span> <span>///</span> <span>&lt;summary&gt;</span>
<span> 79</span> <span>///</span><span> 按钮:接收数据开关
</span><span> 80</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span> 81</span> <span>///</span> <span>&lt;param name="sender"&gt;&lt;/param&gt;</span>
<span> 82</span> <span>///</span> <span>&lt;param name="e"&gt;&lt;/param&gt;</span>
<span> 83</span> <span>private</span> <span>void</span> btnRecv_Click(<span>object</span><span> sender, EventArgs e)
</span><span> 84</span> <span> {
</span><span> 85</span> <span>if</span> (!IsUdpcRecvStart) <span>//</span><span> 未监听的情况,开始监听</span>
<span> 86</span> <span> {
</span><span> 87</span> IPEndPoint localIpep = <span>new</span> IPEndPoint(IPAddress.Parse(<span>"</span><span>127.0.0.1</span><span>"</span>), <span>8848</span>); <span>//</span><span> 本机IP和监听端口号</span>
<span> 88</span> udpcRecv = <span>new</span><span> UdpClient(localIpep);
</span><span> 89</span> thrRecv = <span>new</span><span> Thread(ReceiveMessage);
</span><span> 90</span> <span> thrRecv.Start();
</span><span> 91</span> IsUdpcRecvStart = <span>true</span><span>;
</span><span> 92</span> ShowMessage(txtRecvMssg, <span>"</span><span>UDP监听器已成功启动</span><span>"</span><span>);
</span><span> 93</span> <span> }
</span><span> 94</span> <span>else</span> <span>//</span><span> 正在监听的情况,终止监听</span>
<span> 95</span> <span> {
</span><span> 96</span> thrRecv.Abort(); <span>//</span><span> 必须先关闭这个线程,否则会异常</span>
<span> 97</span> <span> udpcRecv.Close();
</span><span> 98</span> IsUdpcRecvStart = <span>false</span><span>;
</span><span> 99</span> ShowMessage(txtRecvMssg, <span>"</span><span>UDP监听器已成功关闭</span><span>"</span><span>);
</span><span>100</span> <span> }
</span><span>101</span> <span> }
</span><span>102</span>
<span>103</span> <span>///</span> <span>&lt;summary&gt;</span>
<span>104</span> <span>///</span><span> 接收数据
</span><span>105</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span>106</span> <span>///</span> <span>&lt;param name="obj"&gt;&lt;/param&gt;</span>
<span>107</span> <span>private</span> <span>void</span> ReceiveMessage(<span>object</span><span> obj)
</span><span>108</span> <span> {
</span><span>109</span> IPEndPoint remoteIpep = <span>new</span> IPEndPoint(IPAddress.Any, <span>0</span><span>);
</span><span>110</span> <span>while</span> (<span>true</span><span>)
</span><span>111</span> <span> {
</span><span>112</span> <span>try</span>
<span>113</span> <span> {
</span><span>114</span> <span>byte</span>[] bytRecv = udpcRecv.Receive(<span>ref</span><span> remoteIpep);
</span><span>115</span> <span>string</span> message = Encoding.Unicode.GetString(bytRecv, <span>0</span><span>, bytRecv.Length);
</span><span>116</span> ShowMessage(txtRecvMssg,<span>string</span>.Format(<span>"</span><span>{0}[{1}]</span><span>"</span><span>, remoteIpep, message));
</span><span>117</span> <span> }
</span><span>118</span> <span>catch</span><span> (Exception ex)
</span><span>119</span> <span> {
</span><span>120</span> <span> ShowMessage(txtRecvMssg, ex.Message);
</span><span>121</span> <span>break</span><span>;
</span><span>122</span> <span> }
</span><span>123</span> <span> }
</span><span>124</span> <span> }
</span><span>125</span>
<span>126</span> <span>//</span><span> 向RichTextBox中添加文本</span>
<span>127</span> <span>delegate</span> <span>void</span> ShowMessageDelegate(RichTextBox txtbox, <span>string</span><span> message);
</span><span>128</span> <span>private</span> <span>void</span> ShowMessage(RichTextBox txtbox, <span>string</span><span> message)
</span><span>129</span> <span> {
</span><span>130</span> <span>if</span><span> (txtbox.InvokeRequired)
</span><span>131</span> <span> {
</span><span>132</span> ShowMessageDelegate showMessageDelegate =<span> ShowMessage;
</span><span>133</span> txtbox.Invoke(showMessageDelegate, <span>new</span> <span>object</span><span>[] { txtbox, message });
</span><span>134</span> <span> }
</span><span>135</span> <span>else</span>
<span>136</span> <span> {
</span><span>137</span> txtbox.Text += message + <span>"</span><span>\r\n</span><span>"</span><span>;
</span><span>138</span> <span> }
</span><span>139</span> <span> }
</span><span>140</span>
<span>141</span> <span>//</span><span> 清空指定RichTextBox中的文本</span>
<span>142</span> <span>delegate</span> <span>void</span><span> ResetTextBoxDelegate(RichTextBox txtbox);
</span><span>143</span> <span>private</span> <span>void</span><span> ResetTextBox(RichTextBox txtbox)
</span><span>144</span> <span> {
</span><span>145</span> <span>if</span><span> (txtbox.InvokeRequired)
</span><span>146</span> <span> {
</span><span>147</span> ResetTextBoxDelegate resetTextBoxDelegate =<span> ResetTextBox;
</span><span>148</span> txtbox.Invoke(resetTextBoxDelegate, <span>new</span> <span>object</span><span>[] { txtbox });
</span><span>149</span> <span> }
</span><span>150</span> <span>else</span>
<span>151</span> <span> {
</span><span>152</span> txtbox.Text = <span>""</span><span>;
</span><span>153</span> <span> }
</span><span>154</span> <span> }
</span><span>155</span>
<span>156</span> <span>///</span> <span>&lt;summary&gt;</span>
<span>157</span> <span>///</span><span> 关闭程序,强制退出
</span><span>158</span> <span>///</span> <span>&lt;/summary&gt;</span>
<span>159</span> <span>///</span> <span>&lt;param name="sender"&gt;&lt;/param&gt;</span>
<span>160</span> <span>///</span> <span>&lt;param name="e"&gt;&lt;/param&gt;</span>
<span>161</span> <span>private</span> <span>void</span> Form1_FormClosing(<span>object</span><span> sender, FormClosingEventArgs e)
</span><span>162</span> <span> {
</span><span>163</span> Environment.Exit(<span>0</span><span>);
</span><span>164</span> <span> }
</span><span>165</span> <span> }
</span><span>166</span> }

复制代码