代码改变世界

.NET简陋服务器

2010-01-08 17:40  【当耐特】  阅读(4094)  评论(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 

 

 

 

客户端代码:

 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 

 

 

源码下载===>/Files/zhanglei644213943/世界上最简陋的服务器.rar