C#监听指定端口发回的数据 这段时间在研究一个应用程序返回image data的问题,用ethereal监听也没发现什么有价值东西,各位大侠谁能提供一个简短的c#监听指定端口(port:6100,能自己设定更好)的程序,最好是不间断监听,我自己也在研究多线程监听,实现是太郁闷了,在两台计算机之间传输数据,ethreal竟然没有监测到,谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 GOOGLE出来的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(newTimerCallback(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), newobject[] { 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"); } } }} (求助)c#音频处理,离散傅立叶变换,关于wav文件数据和FFT变换的参数 wcf连接oracle jquery gridview更新数据问题 用excel做输入窗口,用什么语言好?? 用c#开发软件,需要什么基础的知识 当别的控件改变一个textbox的值时,如何能激发TextChanged事件? 如何把数据库里的数据导入DropDownList中! C#甘特图控件 水晶报表的问题。 .NET C#中能不能调用C++的Dll?怎么调用? 如何实现Datagridview敲回车跳到下一输入框? WF工作流如何调用OpenFileDialog()
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货