首页 »博文摘选 » 网络编程入门:【基于.NET平台网络编程入门实战系列 3】------搭建世界上最简陋的服务器【附源码下载】 »正文
网络编程入门:【基于.NET平台网络编程入门实战系列 3】------搭建世界上最简陋的服务器【附源码下载】
来源: 发布时间:星期六, 2010年1月9日 浏览:0次 评论:0
【基于.NET平台网络编程入门实战系列 3】------搭建世界上最简陋 ![](/icons/95342de.gif) 服务器【附源码下载】
服务器是干啥子用滴?监听客户端 ![](/icons/95342dou.gif) 响应客户端用滴!
虽然是世界上最简陋 ![](/icons/95342de.gif) 服务器 ![](/icons/95342dou.gif) 但是也有几个注意点:
1. ![](/icons/95342yinwei.gif) 要 ![](/icons/95342yi.gif) 个死循环监听客户端响应 ![](/icons/95342dou.gif) 也就是说无法和用户进行交互了 ![](/icons/95342dou.gif) 所以防止前台假死就要为监听新起 ![](/icons/95342yi.gif) 个线程;
2.要把新起 ![](/icons/95342de.gif) 线程td.IsBackground = true;设置为后台线程 ![](/icons/95342dou.gif) 这样 ![](/icons/95342de.gif) 话线程才会随着应用 ![](/icons/95342chengxu.gif) ![](/icons/95342de.gif) 关闭而关闭 ![](/icons/95342dou.gif) 不然 ![](/icons/95342de.gif) 话关了窗体 ![](/icons/95342dou.gif) 它还在运行;
3.跨线程问题 ![](/icons/95342dou.gif) 在新 ![](/icons/95342de.gif) 线程里改变UI会报跨线程改变UI ![](/icons/95342de.gif) ![](/icons/95342cuowu.gif) ![](/icons/95342dou.gif) 所以要用Invoke;
4.在监听 ![](/icons/95342de.gif) 死循环中加入 Thread.Sleep(1);这样可以提高应用 ![](/icons/95342chengxu.gif) 性能 ![](/icons/95342dou.gif) 不要担心当服务 ![](/icons/95342de.gif) 线程正在Sleep ![](/icons/95342de.gif) 时候来了个请求服务器会收不到 ![](/icons/95342dou.gif) 其实是收得到 ![](/icons/95342de.gif)
加入Thread.Sleep(1) ![](/icons/95342de.gif) CPU如图:
![](http://CrazyCoder.cn/WebFiles/20101/031eda24-1cc8-453a-a8b7-7fe4d15231d8.png)
不加Thread.Sleep(1) ![](/icons/95342de.gif) CPU如图:
![](http://CrazyCoder.cn/WebFiles/20101/a5920d60-b2a3-4a40-8dc5-3c46aeaa5f25.png)
所以 ![](/icons/95342yi.gif) 定要加!
所以服务器端代码如下:
1 using ; 2 using .Collections.Generic; 3 using .ComponentModel; 4 using .Data; 5 using .Drawing; 6 using .Linq; 7 using .Text; 8 using .Windows.Forms; 9 10 using .Threading;11 using .Net;12 using .Net.Sockets;13 14 15 Server16 {17 public partial Form1 : Form18 {19 public Form1 20 {21 InitializeComponent ;22 }23 24 private void button1_Click(object sender, EventArgs e)25 {26 Thread td = 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, str);34 public void ChangeRichTextBox(RichTextBox rtb, str)35 {36 rtb.AppendText(str);37 }38 private void Listen 39 {40 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName )[0];41 port = Int32.Parse(this.textBox1.Text.Trim );42 TcpListener tl = TcpListener(ip, port);43 tl.Start ;44 while(true)45 {46 (tl.Pending )47 {48 Socket Socket = tl.AcceptSocket ; 49 ![](/icons/95342byte.gif) buff = [9];50 length= Socket.Receive(buff);51 command = Encoding.Default.GetString(buff);52 (command "conServer") 53 {54 Invoke( ChangeRickBoxHandler(ChangeRichTextBox),this.richTextBox1,"有客户端连接了我");55 }56 }57 Thread.Sleep(1);58 }59 }60 }61 }62
客户端代码:
1 using ; 2 using .Collections.Generic; 3 using .ComponentModel; 4 using .Data; 5 using .Drawing; 6 using .Linq; 7 using .Text; 8 using .Windows.Forms; 9 10 using .Net;11 using .Net.Sockets;12 using .Threading;13 14 Client15 {16 public partial Form1 : Form17 {18 public Form1 19 {20 InitializeComponent ;21 }22 23 private void button1_Click(object sender, EventArgs e)24 {25 TcpClient tcpClient = TcpClient ;26 tcpClient.Connect( Dns.GetHostAddresses(Dns.GetHostName )[0], Convert.ToInt32(this.textBox1.Text.Trim .![](/icons/95342ToString.gif) ));27 NetworkStream nwStream = tcpClient.GetStream ;28 cmd = "conServer" ;29 Byte s = Encoding.Default.GetBytes(cmd.ToCharArray );30 nwStream.Write( s, 0, s.Length); 31 }32 }33 }34
源码下载 =>/Files/zhanglei644213943/世界上最简陋 服务器.rar
相关文章
读者评论
发表评论
|
|