socket 服务端接收

lansecheng 2010-04-29 02:52:04
我的socket服务端用死循环监听,接收到数据的话就起个线程处理数据。这是我的思路。可是我发现当客户端向我的端口发送信息时 我只能接收到第一个数据,要想再次接收时 ,只能客户端与我断开,再连接, 才能接受。不知道哪出问题了
...全文
94 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lansecheng 2010-04-29
  • 打赏
  • 举报
回复
我拜你为师了
jiezi316 2010-04-29
  • 打赏
  • 举报
回复
1-3分发送?那就用短连接就行了。太不频繁了。
类似于HTTP,连接,发送数据,断开连接
lansecheng 2010-04-29
  • 打赏
  • 举报
回复
啊。。。。。每个客户端间隔1~3min发送一次。。。哎。。额滴 神呢。。
jiezi316 2010-04-29
  • 打赏
  • 举报
回复
建议使用.NET异步SOCKET模型,开多线程这种顶多1000线。(但貌似就算是异步模型这种也上不了10000线)。
用C++基于完成端口的方式据说可以支持10000线。

另外你也要根据你的实际情况来说,说不定你根本不需要长连接这种形式啊。

不过上万个用户,说实话,怎么整压力都有点大,你可以采用考虑下实现集群。
lansecheng 2010-04-29
  • 打赏
  • 举报
回复
恩 明白了,但是我的客户单得上万个,那开上1万多个线程 服务器处理很难 有没有解决的办法
jiezi316 2010-04-29
  • 打赏
  • 举报
回复
1个是死循环接受客户端连接
当1个新的连接进来,为这个连接新开1个线程,在这个线程里面死循环接受数据。
注意,这里的客户端SOCKET和你的监听的SOCKET不是同一个。
lansecheng 2010-04-29
  • 打赏
  • 举报
回复
我那个好像就是死循环接收的,接收到一个通信,到一个线程里处理。。。
jiezi316 2010-04-29
  • 打赏
  • 举报
回复
你为每个链接新开的线程中应该
WHILE(true)
{
clientSckHandler.Reveice();
}
死循环接受数据
lansecheng 2010-04-29
  • 打赏
  • 举报
回复
客户端有很多个。。1楼 在哪设置继续接收数据
listener.Bind(ipe);
while (true)
{
listener.Listen(5);
Socket handler = listener.Accept();
mythread thread = new mythread(handler);
}
这样感觉应该可以了吧
upc_xiaowei 2010-04-29
  • 打赏
  • 举报
回复
补充一点,上面那个例子好像是多客户机的?
俩个成员:
Socket m_mainsocket;
Socket[] m_memsocket = new Socket[10];
upc_xiaowei 2010-04-29
  • 打赏
  • 举报
回复
还有这回事?要是对单客户机的话,根本没有必要用线程啊

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);
}
ginni215 2010-04-29
  • 打赏
  • 举报
回复
新起的的线程里面没有处于一直的监听状态,需要根据连接状态循环监听,并接收数据~
Alden 2010-04-29
  • 打赏
  • 举报
回复
处理完数据后,你需要设定继续接收数据。
不知道你用的是哪一个类,给关键代码大家看看。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧