socket 服务端接收 我的socket服务端用死循环监听,接收到数据的话就起个线程处理数据。这是我的思路。可是我发现当客户端向我的端口发送信息时 我只能接收到第一个数据,要想再次接收时 ,只能客户端与我断开,再连接, 才能接受。不知道哪出问题了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 还有这回事?要是对单客户机的话,根本没有必要用线程啊 private void button1_Click(object sender, EventArgs e) { IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); m_mainsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_mainsocket.Bind(ipep); m_mainsocket.Listen(10); m_mainsocket.BeginAccept(new AsyncCallback(Accept), null); } void Accept(IAsyncResult iar) { try { m_memsocket[m_clientnum] = m_mainsocket.EndAccept(iar); string str = "connected with" + m_clientnum.ToString() + "#"; // label1.Invoke(new myeventhandler(SetLabelText), new object[] { str }); waitfordata(m_memsocket[m_clientnum]); // m_clientnum++; m_mainsocket.BeginAccept(new AsyncCallback(Accept), null); } // catch (ObjectDisposedException e) { } } public class socketpacket { public Socket m_currentsocket; public byte[] data = new byte[1024]; } void waitfordata(Socket s) { socketpacket theSockPkt = new socketpacket(); theSockPkt.m_currentsocket = s; s.BeginReceive(theSockPkt.data, 0, theSockPkt.data.Length, SocketFlags.None, new AsyncCallback(ReceiveData), theSockPkt); } void ReceiveData(IAsyncResult iar) { socketpacket socketdata = (socketpacket)iar.AsyncState; try { int recv = socketdata.m_currentsocket.EndReceive(iar); //listBox1.Items.Add(Encoding.ASCII.GetString(socketdata.data,0,recv)); //data process //... //DataProc(socketdata);socketdata.data,socketdata.m_currentsocket; //... //listBox1.Invoke(new myeventhandler(AddListBoxItem), new object[] { Encoding.ASCII.GetString(socketdata.data, 0, recv) }); } catch (SocketException e) { return; } waitfordata(socketdata.m_currentsocket); } 补充一点,上面那个例子好像是多客户机的?俩个成员:Socket m_mainsocket;Socket[] m_memsocket = new Socket[10]; 客户端有很多个。。1楼 在哪设置继续接收数据 listener.Bind(ipe); while (true) { listener.Listen(5); Socket handler = listener.Accept(); mythread thread = new mythread(handler); }这样感觉应该可以了吧 你为每个链接新开的线程中应该WHILE(true){ clientSckHandler.Reveice();}死循环接受数据 1个是死循环接受客户端连接当1个新的连接进来,为这个连接新开1个线程,在这个线程里面死循环接受数据。注意,这里的客户端SOCKET和你的监听的SOCKET不是同一个。 建议使用.NET异步SOCKET模型,开多线程这种顶多1000线。(但貌似就算是异步模型这种也上不了10000线)。用C++基于完成端口的方式据说可以支持10000线。另外你也要根据你的实际情况来说,说不定你根本不需要长连接这种形式啊。不过上万个用户,说实话,怎么整压力都有点大,你可以采用考虑下实现集群。 啊。。每个客户端间隔1~3min发送一次哎。。额滴 神呢。。 1-3分发送?那就用短连接就行了。太不频繁了。类似于HTTP,连接,发送数据,断开连接 请教各位了。 请教一个加密问题。 有关时间的一个问题? <!-- WinForm C#连接ACCESS数据库 未处理的“System.Data.OleDb.OleDbException”类型的异常出现在 system.data.dll 中 帮帮我啊 关于excel表格倒入dataGrid的问题 动态添加的控件闪烁问题 页面调用js问题 连接SQL2008出错 Grid控件中如何实现对输入数据的合法性进行验证? WinForm怎么传递一个字符串值给webForm? 急:一个关于表中删除数据的问题 页面传值问题
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
m_mainsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_mainsocket.Bind(ipep);
m_mainsocket.Listen(10);
m_mainsocket.BeginAccept(new AsyncCallback(Accept), null);
}
void Accept(IAsyncResult iar)
{
try
{
m_memsocket[m_clientnum] = m_mainsocket.EndAccept(iar);
string str = "connected with" + m_clientnum.ToString() + "#";
//
label1.Invoke(new myeventhandler(SetLabelText), new object[] { str });
waitfordata(m_memsocket[m_clientnum]);
//
m_clientnum++;
m_mainsocket.BeginAccept(new AsyncCallback(Accept), null);
}
//
catch (ObjectDisposedException e)
{ }
}
public class socketpacket
{
public Socket m_currentsocket;
public byte[] data = new byte[1024];
}
void waitfordata(Socket s)
{
socketpacket theSockPkt = new socketpacket();
theSockPkt.m_currentsocket = s;
s.BeginReceive(theSockPkt.data, 0, theSockPkt.data.Length, SocketFlags.None, new AsyncCallback(ReceiveData), theSockPkt); }
void ReceiveData(IAsyncResult iar)
{
socketpacket socketdata = (socketpacket)iar.AsyncState;
try
{
int recv = socketdata.m_currentsocket.EndReceive(iar);
//listBox1.Items.Add(Encoding.ASCII.GetString(socketdata.data,0,recv));
//data process
//...
//DataProc(socketdata);socketdata.data,socketdata.m_currentsocket;
//...
//listBox1.Invoke(new myeventhandler(AddListBoxItem), new object[] { Encoding.ASCII.GetString(socketdata.data, 0, recv) });
}
catch (SocketException e)
{
return;
}
waitfordata(socketdata.m_currentsocket);
}
俩个成员:
Socket m_mainsocket;
Socket[] m_memsocket = new Socket[10];
listener.Bind(ipe);
while (true)
{
listener.Listen(5);
Socket handler = listener.Accept();
mythread thread = new mythread(handler);
}
这样感觉应该可以了吧
WHILE(true)
{
clientSckHandler.Reveice();
}
死循环接受数据
当1个新的连接进来,为这个连接新开1个线程,在这个线程里面死循环接受数据。
注意,这里的客户端SOCKET和你的监听的SOCKET不是同一个。
用C++基于完成端口的方式据说可以支持10000线。另外你也要根据你的实际情况来说,说不定你根本不需要长连接这种形式啊。不过上万个用户,说实话,怎么整压力都有点大,你可以采用考虑下实现集群。
类似于HTTP,连接,发送数据,断开连接