.NET简陋服务器
2010-01-08 17:40 【当耐特】 阅读(4104) 评论(16) 编辑 收藏 举报服务器是干啥子用滴?监听客户端,响应客户端用滴!
虽然是世界上最简陋的服务器,但是也有几个注意点:
1.因为要一个死循环监听客户端响应,也就是说无法和用户进行交互了,所以防止前台假死就要为监听新起一个线程;
2.要把新起的线程td.IsBackground = true;设置为后台线程,这样的话线程才会随着应用程序的关闭而关闭,不然的话关了窗体,它还在运行;
3.跨线程问题,在新的线程里改变UI会报跨线程改变UI的错误,所以要用Invoke;
4.在监听的死循环中加入 Thread.Sleep(1);这样可以提高应用程序性能,不要担心当服务的线程正在Sleep的时候来了个请求服务器会收不到,其实是收得到的。
加入Thread.Sleep(1)的CPU如图:
不加Thread.Sleep(1)的CPU如图:
所以一定要加!
所以服务器端代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 using System.Threading;
11 using System.Net;
12 using System.Net.Sockets;
13
14
15 namespace Server
16 {
17 public partial class Form1 : Form
18 {
19 public Form1()
20 {
21 InitializeComponent();
22 }
23
24 private void button1_Click(object sender, EventArgs e)
25 {
26 Thread td = new Thread(Listen);
27 td.IsBackground = true;
28 td.Start();
29 this.button1.Enabled = false;
30 MessageBox.Show("服务器成功开启");
31
32 }
33 public delegate void ChangeRickBoxHandler(RichTextBox rtb,string str);
34 public void ChangeRichTextBox(RichTextBox rtb,string str)
35 {
36 rtb.AppendText(str);
37 }
38 private void Listen()
39 {
40 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
41 int port = Int32.Parse(this.textBox1.Text.Trim());
42 TcpListener tl = new TcpListener(ip, port);
43 tl.Start();
44 while(true)
45 {
46 if (tl.Pending())
47 {
48 Socket newSocket = tl.AcceptSocket();
49 byte[] buff = new byte[9];
50 int length= newSocket.Receive(buff);
51 string command = Encoding.Default.GetString(buff);
52 if(command == "conServer")
53 {
54 Invoke(new ChangeRickBoxHandler(ChangeRichTextBox),this.richTextBox1,"有客户端连接了我");
55 }
56 }
57 Thread.Sleep(1);
58 }
59 }
60 }
61 }
62
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 using System.Threading;
11 using System.Net;
12 using System.Net.Sockets;
13
14
15 namespace Server
16 {
17 public partial class Form1 : Form
18 {
19 public Form1()
20 {
21 InitializeComponent();
22 }
23
24 private void button1_Click(object sender, EventArgs e)
25 {
26 Thread td = new Thread(Listen);
27 td.IsBackground = true;
28 td.Start();
29 this.button1.Enabled = false;
30 MessageBox.Show("服务器成功开启");
31
32 }
33 public delegate void ChangeRickBoxHandler(RichTextBox rtb,string str);
34 public void ChangeRichTextBox(RichTextBox rtb,string str)
35 {
36 rtb.AppendText(str);
37 }
38 private void Listen()
39 {
40 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
41 int port = Int32.Parse(this.textBox1.Text.Trim());
42 TcpListener tl = new TcpListener(ip, port);
43 tl.Start();
44 while(true)
45 {
46 if (tl.Pending())
47 {
48 Socket newSocket = tl.AcceptSocket();
49 byte[] buff = new byte[9];
50 int length= newSocket.Receive(buff);
51 string command = Encoding.Default.GetString(buff);
52 if(command == "conServer")
53 {
54 Invoke(new ChangeRickBoxHandler(ChangeRichTextBox),this.richTextBox1,"有客户端连接了我");
55 }
56 }
57 Thread.Sleep(1);
58 }
59 }
60 }
61 }
62
客户端代码:
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 using System.Net;
11 using System.Net.Sockets;
12 using System.Threading;
13
14 namespace Client
15 {
16 public partial class Form1 : Form
17 {
18 public Form1()
19 {
20 InitializeComponent();
21 }
22
23 private void button1_Click(object sender, EventArgs e)
24 {
25 TcpClient tcpClient = new TcpClient();
26 tcpClient.Connect( Dns.GetHostAddresses(Dns.GetHostName())[0], Convert.ToInt32(this.textBox1.Text.Trim().ToString()));
27 NetworkStream nwStream = tcpClient.GetStream();
28 string cmd = "conServer" ;
29 Byte[] bytes = Encoding.Default.GetBytes(cmd.ToCharArray());
30 nwStream.Write(bytes, 0, bytes.Length);
31 }
32 }
33 }
34
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 using System.Net;
11 using System.Net.Sockets;
12 using System.Threading;
13
14 namespace Client
15 {
16 public partial class Form1 : Form
17 {
18 public Form1()
19 {
20 InitializeComponent();
21 }
22
23 private void button1_Click(object sender, EventArgs e)
24 {
25 TcpClient tcpClient = new TcpClient();
26 tcpClient.Connect( Dns.GetHostAddresses(Dns.GetHostName())[0], Convert.ToInt32(this.textBox1.Text.Trim().ToString()));
27 NetworkStream nwStream = tcpClient.GetStream();
28 string cmd = "conServer" ;
29 Byte[] bytes = Encoding.Default.GetBytes(cmd.ToCharArray());
30 nwStream.Write(bytes, 0, bytes.Length);
31 }
32 }
33 }
34
源码下载===>/Files/zhanglei644213943/世界上最简陋的服务器.rar
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!