C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下
前言
- 使用C#语言进行开发,基于.NET FrameWork4
- 功能包含群聊,和私聊
界面
界面设计代码
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
|
namespace chat_server { partial class Form1 { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null ; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose( bool disposing) { if (disposing && (components != null )) { components.Dispose(); } base .Dispose(disposing); } #region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要修改 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this .textBoxIP = new System.Windows.Forms.TextBox(); this .labelIP = new System.Windows.Forms.Label(); this .labelPort = new System.Windows.Forms.Label(); this .textBoxPort = new System.Windows.Forms.TextBox(); this .buttonStart = new System.Windows.Forms.Button(); this .textBoxLog = new System.Windows.Forms.TextBox(); this .textBoxMsg = new System.Windows.Forms.TextBox(); this .buttonSend = new System.Windows.Forms.Button(); this .SuspendLayout(); // // textBoxIP // this .textBoxIP.Location = new System.Drawing.Point(145, 25); this .textBoxIP.Name = "textBoxIP" ; this .textBoxIP.Size = new System.Drawing.Size(100, 25); this .textBoxIP.TabIndex = 0; this .textBoxIP.Text = "127.0.0.1" ; // // labelIP // this .labelIP.AutoSize = true ; this .labelIP.Location = new System.Drawing.Point(90, 28); this .labelIP.Name = "labelIP" ; this .labelIP.Size = new System.Drawing.Size(31, 15); this .labelIP.TabIndex = 1; this .labelIP.Text = "IP:" ; // // labelPort // this .labelPort.AutoSize = true ; this .labelPort.Location = new System.Drawing.Point(371, 28); this .labelPort.Name = "labelPort" ; this .labelPort.Size = new System.Drawing.Size(54, 15); this .labelPort.TabIndex = 3; this .labelPort.Text = "port:" ; // // textBoxPort // this .textBoxPort.Location = new System.Drawing.Point(452, 25); this .textBoxPort.Name = "textBoxPort" ; this .textBoxPort.Size = new System.Drawing.Size(100, 25); this .textBoxPort.TabIndex = 2; this .textBoxPort.Text = "6666" ; // // buttonStart // this .buttonStart.Location = new System.Drawing.Point(718, 13); this .buttonStart.Name = "buttonStart" ; this .buttonStart.Size = new System.Drawing.Size(142, 45); this .buttonStart.TabIndex = 4; this .buttonStart.Text = "开启服务" ; this .buttonStart.UseVisualStyleBackColor = true ; this .buttonStart.Click += new System.EventHandler( this .buttonStart_Click); // // textBoxLog // this .textBoxLog.Location = new System.Drawing.Point(28, 73); this .textBoxLog.Multiline = true ; this .textBoxLog.Name = "textBoxLog" ; this .textBoxLog.Size = new System.Drawing.Size(832, 406); this .textBoxLog.TabIndex = 5; // // textBoxMsg // this .textBoxMsg.Location = new System.Drawing.Point(28, 499); this .textBoxMsg.Name = "textBoxMsg" ; this .textBoxMsg.Size = new System.Drawing.Size(653, 25); this .textBoxMsg.TabIndex = 6; // // buttonSend // this .buttonSend.Location = new System.Drawing.Point(761, 499); this .buttonSend.Name = "buttonSend" ; this .buttonSend.Size = new System.Drawing.Size(99, 43); this .buttonSend.TabIndex = 7; this .buttonSend.Text = "发送" ; this .buttonSend.UseVisualStyleBackColor = true ; this .buttonSend.Click += new System.EventHandler( this .buttonSend_Click); // // Form1 // this .AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); this .AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this .ClientSize = new System.Drawing.Size(947, 567); this .Controls.Add( this .buttonSend); this .Controls.Add( this .textBoxMsg); this .Controls.Add( this .textBoxLog); this .Controls.Add( this .buttonStart); this .Controls.Add( this .labelPort); this .Controls.Add( this .textBoxPort); this .Controls.Add( this .labelIP); this .Controls.Add( this .textBoxIP); this .Name = "Form1" ; this .Text = "服务器" ; this .Load += new System.EventHandler( this .Form1_Load); this .ResumeLayout( false ); this .PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBoxIP; private System.Windows.Forms.Label labelIP; private System.Windows.Forms.Label labelPort; private System.Windows.Forms.TextBox textBoxPort; private System.Windows.Forms.Button buttonStart; private System.Windows.Forms.TextBox textBoxLog; private System.Windows.Forms.TextBox textBoxMsg; private System.Windows.Forms.Button buttonSend; } } |
源代码
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace chat_server { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load( object sender, EventArgs e) { } // socket连接容器 Dictionary<Socket, String> userContain = new Dictionary<Socket, string >(); private void buttonStart_Click( object sender, EventArgs e) { try { //1、创建socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2、绑定ip和端口 String ip = textBoxIP.Text; int port = Convert.ToInt32(textBoxPort.Text); socket.Bind( new IPEndPoint(IPAddress.Parse(ip), port)); //3、开启监听 socket.Listen(10); //等待连接队列的最大值 //4、开始接受客户端的链接 ThreadPool.QueueUserWorkItem( new WaitCallback(connect), socket); } catch { MessageBox.Show( "启动服务器失败" ); } } private void connect( object socket) { var serverSockert = socket as Socket; //强制转换 showLog( "服务器正常启动,开始接受客户端的数据" ); byte [] data = new byte [1024]; int len; String name; //客户端的用户名 while ( true ) { try { var proxSocket = serverSockert.Accept(); //接受连接 len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None); //接受客户端的用户名 name = Encoding.Default.GetString(data, 0, len); showLog(String.Format( "客户端 {0} 用户名 {1} 连接服务器" , proxSocket.RemoteEndPoint.ToString(),name)); String msg = String.Format( "用户{0}上线了" , name); sendMsg(msg); userContain[proxSocket] = name; //把对象放入集合中 //不停的接受当前链接的客户端发送的消息 ThreadPool.QueueUserWorkItem( new WaitCallback( this .recevie), proxSocket); } catch { MessageBox.Show( "接受异常" ); break ; } } } private void recevie( object socket) { var proxSocket = socket as Socket; byte [] data = new byte [1024 * 1024]; //接受,发送数据缓冲区 String msg; int len = 0; // 数据长度 String name = userContain[proxSocket]; // 客户端名字 while ( true ) { try { len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None); } catch { msg = String.Format( "客户端{0}异常退出" , proxSocket.RemoteEndPoint.ToString()); showLog(msg); msg = String.Format( "用户{0}下线了" , name); sendMsg(msg); userContain.Remove(proxSocket); stopConnect(proxSocket); return ; } if (len <= 0) { //客户端正常退出 msg = String.Format( "客户端{0}正常退出" , proxSocket.RemoteEndPoint.ToString()); showLog(msg); msg = String.Format( "用户{0}下线了" , name); sendMsg(msg); userContain.Remove(proxSocket); stopConnect(proxSocket); return ; //结束当前接受客户端数据的异步线程 } //接受消息 msg = Encoding.Default.GetString(data, 0, len); //私聊信息格式@name:msg //name 为用户名 msg 为消息 bool flag = true ; if (msg.StartsWith( "@" )) { int index = msg.IndexOf( ":" ); String targetName = msg.Substring(1, index-1); msg = msg.Substring(index + 1); foreach (var user in userContain) { if (targetName.Equals(user.Value)&&user.Key.Connected) { msg = String.Format( "用户{0} 单独对你说:{1}" ,name,msg); data = Encoding.Default.GetBytes(msg); user.Key.Send(data, 0, data.Length, SocketFlags.None); flag = false ; break ; } } } if (flag) { msg = String.Format( "用户{0}:{1}" , name, msg); sendMsg(msg); } } } private void stopConnect(Socket socket) { try { if (socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(100); } } catch { } } private void showLog(String msg) { if (textBoxLog.InvokeRequired) { //如果是跨线程访问 textBoxLog.Invoke( new Action<String>( s => { this .textBoxLog.Text += msg+ "\r\n" ; }),msg); } else { this .textBoxLog.Text += msg; } } private void buttonSend_Click( object sender, EventArgs e) { //发送消息 String msg = String.Format( "服务器发布通知信息{0}" , textBoxMsg.Text); sendMsg(msg); } private void sendMsg(String msg) { byte [] data = new byte [1024 * 1024]; data = Encoding.Default.GetBytes(msg); foreach (var user in userContain) { if (user.Key.Connected) { user.Key.Send(data, 0, data.Length, SocketFlags.None); } } } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_41146650/article/details/105531500