.NET中Socket编程的简单示例(2)
点击次数:24 次 发布日期:2008-11-26 12:21:23 作者:源代码网
|
源代码网推荐 源代码网推荐 Client: 源代码网推荐 源代码网推荐 using System.Net; 源代码网推荐 源代码网推荐 using System.Net.Sockets; 源代码网推荐 源代码网推荐 using System.Threading; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 namespace MySocketClient1 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 public partial class Form1 : Form 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 private IPAddress serverIP = IPAddress.Parse("127.0.0.1"); 源代码网推荐 源代码网推荐 private IPEndPoint serverFullAddr; 源代码网推荐 源代码网推荐 private Socket sock; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 public Form1() 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 InitializeComponent(); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 private void btConnect_Click(object sender, EventArgs e) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 serverFullAddr = new IPEndPoint(serverIP, 1000); 源代码网推荐 源代码网推荐 sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 源代码网推荐 源代码网推荐 ProtocolType.Tcp); 源代码网推荐 源代码网推荐 sock.Connect(serverFullAddr);//建立与远程主机的连接 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 //启动新线程用于接收数据 源代码网推荐 源代码网推荐 Thread t = new Thread(new ThreadStart(ReceiveMsg)); 源代码网推荐 源代码网推荐 t.Name = "Receive Message"; 源代码网推荐 源代码网推荐 //一个线程或者是后台线程或者是前台线程。后台线程与前台线程类似,区别是后台线//程不会防止进程终止。一旦属于某一进程的所有前台线程都终止,公共语言运行库就//会通过对任何仍然处于活动状态的后台线程调用 Abort 来结束该进程。 源代码网推荐 源代码网推荐 t.IsBackground = true; 源代码网推荐 源代码网推荐 t.Start(); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 catch(Exception ex) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 MessageBox.Show(ex.Message); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 private void ReceiveMsg() 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 while (true) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 byte[] byteRec = new byte[100]; 源代码网推荐 源代码网推荐 this.sock.Receive(byteRec); 源代码网推荐 源代码网推荐 string strRec = System.Text.Encoding.UTF8.GetString(byteRec); 源代码网推荐 源代码网推荐 if (this.rtbReceive.InvokeRequired) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 this.rtbReceive.Invoke(new EventHandler(ChangeRtb), new object[] 源代码网推荐 源代码网推荐 { strRec, EventArgs.Empty }); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 catch(Exception ex) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 MessageBox.Show("Receive Message Error"+ex.Message); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 private void ChangeRtb(object obj, EventArgs e) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 string s = System.Convert.ToString(obj); 源代码网推荐 源代码网推荐 this.rtbReceive.AppendText(s + Environment.NewLine); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 private void btSend_Click(object sender, EventArgs e) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 byte[] byteSend = 源代码网推荐 源代码网推荐 System.Text.Encoding.UTF8.GetBytes(this.tbSend.Text.ToCharArray()); 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 this.sock.Send(byteSend); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 catch 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 MessageBox.Show("Send Message Error"); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 private void btClose_Click(object sender, EventArgs e) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 this.sock.Shutdown(SocketShutdown.Receive); 源代码网推荐 源代码网推荐 this.sock.Close(); 源代码网推荐 源代码网推荐 Application.Exit(); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 catch 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 MessageBox.Show("Exit Error"); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 不解之处: 源代码网推荐 源代码网推荐 Client端红色标注语句:this.sock.Shutdown(SocketShutdown.Receive),如改成 源代码网推荐 源代码网推荐 this.sock.Shutdown(SocketShutdown.Both);或this.sock.Shutdown(SocketShutdown.Send); 源代码网推荐 源代码网推荐 则当点击Cloce按钮时,CPU使用率疯涨到100%,而使用this.sock.Shutdown(SocketShutdown.Receive); 源代码网推荐 源代码网推荐 或不调用Shutdown()方法则没有这个问题。难道客户端不应该用Shutdown()? 源代码网推荐 源代码网推荐 http://www.cnblogs.com/KissKnife/archive/2006/08/13/475707.html 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
