以下示例程序实现简单的Socket通信,可以开多个客户端。本机测试通过,未做联机测试。 Server: using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections; namespace MySocketServer1 { public partial class Form1 : Form { private IPAddress serverIP = IPAddress.Parse(“127.0.0.1”);//以本机作测试 private IPEndPoint serverFullAddr;//完整终端地址 private Socket sock; private System.Timers.Timer myTimer; private ArrayList alSock;//当建立了多个连接时用于保存连接 public Form1() { InitializeComponent(); } private void btStart_Click(object sender, EventArgs e) { serverFullAddr = new IPEndPoint(serverIP, 1000);//取端口号1000 //构造Socket对象,套接字类型为“流套接字”,指定五元组中的协议元 sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定五元组中的本地二元,即本地主机地址和端口号 sock.Bind(serverFullAddr); //监听是否有连接传入,指定挂起的连接队列的最大值为20 sock.Listen(20); alSock = new ArrayList(); //构造定时器,时间间隙为1秒,即每隔一秒执行一次accept()方法,以获取连接请求队列中//第一个挂起的连接请求 myTimer =new System.Timers.Timer(1000); myTimer.Elapsed +=new System.Timers.ElapsedEventHandler(myTimer_Elapsed); myTimer.Enabled = true; } private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { myTimer.Enabled = false; //执行accept(),当挂起队列为空时将阻塞本线程,同时由于上一语句,定时器将停止,直//至有连接传入 Socket acceptSock = sock.Accept(); //将accept()产生的Socket对象存入ArrayList alSock.Add(acceptSock); // 构造Threading.Timer对象,这将导致程序另启线程。线程将执行回调函数,该委托限制//函数参数须为object型。Threading.Timer构造器的第二个参数即传入回调函数的参数;第//三个参数指定调用回调函数之前的延时,取0则立即启动;最后一个参数指定调用回调函数//的时间间隔,取0则只执行一次。 System.Threading.Timer ti = new System.Threading.Timer(new TimerCallback(ReceiveMsg), acceptSock, 0, 0); myTimer.Enabled = true; } private void ReceiveMsg(object obj) { Socket acceptSock = (Socket)obj; try { while (true) { byte[] byteArray = new byte[100]; acceptSock.Receive(byteArray);//接收数据 //将字节数组转成字符串 string strRec = System.Text.Encoding.UTF8.GetString(byteArray); if (this.rtbReceive.InvokeRequired) { this.rtbReceive.Invoke(new EventHandler(this.ChangeRickTextBox), new object[] { strRec, EventArgs.Empty }); } } } catch(Exception ex) { acceptSock.Close(); MessageBox.Show(“S:Receive Message Error”+ex.Message); } } private void ChangeRickTextBox(object obj,EventArgs e) { string s = System.Convert.ToString(obj); this.rtbReceive.AppendText(s + Environment.NewLine); } private void btSend_Click(object sender, EventArgs e) { Socket sc=null; byte[] byteSend = System.Text.Encoding.UTF8.GetBytes(this.tbSend.Text.ToCharArray()); try { //同时存在若干个客户端连接时,在textBox1中输入要发送的是哪个连接 int index = int.Parse(this.textBox1.Text.Trim()); sc = (Socket)alSock[index – 1]; //发送数据 sc.Send(byteSend); } catch(Exception ex) { if(sc != null) { sc.Close(); } MessageBox.Show(“S:Send Message Error”+ex.Message); } } private void btClose_Click(object sender, EventArgs e) { try { Application.Exit(); } catch (Exception ex) { MessageBox.Show(“S:Close Socket Error” + ex.Message); } } } } == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == 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
.net中socket编程的简单示例_asp.net技巧
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » .net中socket编程的简单示例_asp.net技巧
相关推荐
-      对.net framework 反射的反思_asp.net技巧
-      .net3.5和vs2008中的asp.net ajax_asp.net技巧
-      使用asp.net ajax框架扩展html map控件_asp.net技巧
-      asp.net应用程序资源访问安全模型_asp.net技巧
-      photoshop初学者轻松绘制螺旋漩涡特效_photoshop教程
-      photoshop通道结合图层模式抠狗尾巴草_photoshop教程
-      web.config详解+asp.net优化_asp.net技巧
-      asp.net中多彩下拉框的实现_asp.net技巧