Server端代码:
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
|
class Program { static SocketListener listener; public static void Main( string [] args) { //实例化Timer类,设置间隔时间为5000毫秒; System.Timers.Timer t = new System.Timers.Timer(5000); t.Elapsed += new System.Timers.ElapsedEventHandler(CheckListen); //到达时间的时候执行事件; t.AutoReset = true ; t.Start(); listener = new SocketListener(); listener.ReceiveTextEvent += new SocketListener.ReceiveTextHandler(ShowText); listener.StartListen(); Console.ReadKey(); } private static void ShowText( string text) { Console.WriteLine(text); } private static void CheckListen( object sender, System.Timers.ElapsedEventArgs e) { if (listener != null && listener.Connection != null ) { Console.WriteLine( "连接数:" + listener.Connection.Count.ToString()); } } } public class Connection { Socket _connection; public Connection(Socket socket) { _connection = socket; } public void WaitForSendData( object connection) { try { while ( true ) { byte [] bytes = new byte [1024]; string data = "" ; //等待接收消息 int bytesRec = this ._connection.Receive(bytes); if (bytesRec == 0) { // ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接关闭..."); break ; } data += Encoding.UTF8.GetString(bytes, 0, bytesRec); ReceiveText( "收到消息:" + data); string sendStr = "服务端已经收到信息!" ; byte [] bs = Encoding.UTF8.GetBytes(sendStr); _connection.Send(bs, bs.Length, 0); } } catch (Exception) { ReceiveText( "客户端[" + _connection.RemoteEndPoint.ToString() + "]连接已断开..." ); Hashtable hConnection = connection as Hashtable; if (hConnection.Contains(_connection.RemoteEndPoint.ToString())) { hConnection.Remove(_connection.RemoteEndPoint.ToString()); } } } public delegate void ReceiveTextHandler( string text); public event ReceiveTextHandler ReceiveTextEvent; private void ReceiveText( string text) { if (ReceiveTextEvent != null ) { ReceiveTextEvent(text); } } } public class SocketListener { public Hashtable Connection = new Hashtable(); public void StartListen() { Agine: try { //端口号、IP地址 //int port = 8889; //string host = "127.0.0.1"; //IPAddress ip = IPAddress.Parse(host); //IPEndPoint ipe = new IPEndPoint(ip, port); string ip = string .Empty; System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); for ( int i = 0; i != IpEntry.AddressList.Length; i++) { if (!IpEntry.AddressList[i].IsIPv6LinkLocal) { ip = IpEntry.AddressList[i].ToString(); } } IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 6000); //创建一个Socket类 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Bind(ipend); //绑定2000端口 s.Listen(0); //开始监听 ReceiveText( "启动Socket监听..." ); while ( true ) { Socket connectionSocket = s.Accept(); //为新建连接创建新的Socket ReceiveText( "客户端[" + connectionSocket.RemoteEndPoint.ToString() + "]连接已建立..." ); Connection gpsCn = new Connection(connectionSocket); gpsCn.ReceiveTextEvent += new Connection.ReceiveTextHandler(ReceiveText); Connection.Add(connectionSocket.RemoteEndPoint.ToString(), gpsCn); //在新线程中启动新的socket连接,每个socket等待,并保持连接 Thread thread = new Thread(gpsCn.WaitForSendData); thread.Name = connectionSocket.RemoteEndPoint.ToString(); thread.Start(Connection); } } catch (ArgumentNullException ex1) { ReceiveText( "ArgumentNullException:" + ex1); } catch (SocketException ex2) { ReceiveText( "SocketException:" + ex2); } goto Agine; } public delegate void ReceiveTextHandler( string text); public event ReceiveTextHandler ReceiveTextEvent; private void ReceiveText( string text) { if (ReceiveTextEvent != null ) { ReceiveTextEvent(text); } } } |
Client端代码:
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
|
class Program { static void Main( string [] args) { Socket c; //int port = 4029; // 避免使用127.0.0.1,我在本机测试是不能运行的 //string host = "127.0.0.1"; //IPAddress ip = IPAddress.Parse(host); //IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例 string ip = string .Empty; System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); for ( int i = 0; i != IpEntry.AddressList.Length; i++) { if (!IpEntry.AddressList[i].IsIPv6LinkLocal) { ip = IpEntry.AddressList[i].ToString(); } } IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 6000); c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建一个Socket try { c.Connect(ipend); //连接到服务器 Console.WriteLine( "连接到Socket服务端..." ); Console.WriteLine( "发送消息到服务端..." ); string sendStr = "m s g" ; byte [] bs = Encoding.UTF8.GetBytes(sendStr); c.Send(bs, bs.Length, 0); string recvStr = "" ; byte [] recvBytes = new byte [1024]; int bytes; bytes = c.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回信息 recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes); Console.WriteLine( "服务器返回信息:" + recvStr); } catch (ArgumentNullException ex1) { Console.WriteLine( "ArgumentNullException:{0}" , ex1); } catch (SocketException ex2) { Console.WriteLine( "SocketException:{0}" , ex2); } Console.ReadKey(); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/luming666/article/details/79140990