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><summary></span> <span> 25</span> <span>///</span><span> 用于UDP发送的网络服务类 </span><span> 26</span> <span>///</span> <span></summary></span> <span> 27</span> <span>private</span><span> UdpClient udpcSend; </span><span> 28</span> <span>///</span> <span><summary></span> <span> 29</span> <span>///</span><span> 用于UDP接收的网络服务类 </span><span> 30</span> <span>///</span> <span></summary></span> <span> 31</span> <span>private</span><span> UdpClient udpcRecv; </span><span> 32</span> <span> 33</span> <span>///</span> <span><summary></span> <span> 34</span> <span>///</span><span> 按钮:发送数据 </span><span> 35</span> <span>///</span> <span></summary></span> <span> 36</span> <span>///</span> <span><param name="sender"></param></span> <span> 37</span> <span>///</span> <span><param name="e"></param></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><summary></span> <span> 56</span> <span>///</span><span> 发送信息 </span><span> 57</span> <span>///</span> <span></summary></span> <span> 58</span> <span>///</span> <span><param name="obj"></param></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><summary></span> <span> 70</span> <span>///</span><span> 开关:在监听UDP报文阶段为true,否则为false </span><span> 71</span> <span>///</span> <span></summary></span> <span> 72</span> <span>bool</span> IsUdpcRecvStart = <span>false</span><span>; </span><span> 73</span> <span>///</span> <span><summary></span> <span> 74</span> <span>///</span><span> 线程:不断监听UDP报文 </span><span> 75</span> <span>///</span> <span></summary></span> <span> 76</span> <span> Thread thrRecv; </span><span> 77</span> <span> 78</span> <span>///</span> <span><summary></span> <span> 79</span> <span>///</span><span> 按钮:接收数据开关 </span><span> 80</span> <span>///</span> <span></summary></span> <span> 81</span> <span>///</span> <span><param name="sender"></param></span> <span> 82</span> <span>///</span> <span><param name="e"></param></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><summary></span> <span>104</span> <span>///</span><span> 接收数据 </span><span>105</span> <span>///</span> <span></summary></span> <span>106</span> <span>///</span> <span><param name="obj"></param></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><summary></span> <span>157</span> <span>///</span><span> 关闭程序,强制退出 </span><span>158</span> <span>///</span> <span></summary></span> <span>159</span> <span>///</span> <span><param name="sender"></param></span> <span>160</span> <span>///</span> <span><param name="e"></param></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> }
|