做个局域网游戏,服务器用TCPlistener,客户端用Socket,当服务器连续向客户端发送数据时,客户端响应不过来,怎么解决?

ILYYLM521125 2009-01-16 09:28:52
服务器端根据游戏结果,可能向客户端连续发两条数据(甚至更多条),这是客户端需要作出相应,改变界面,例如更新某个label的text,可是有时服务器发送第一条数据后客户端能正确响应,服务器紧接发第二条时(这是客户端还在做相应第一条的动作,例如播放声音,或者利用循环改变某个picturebox的图像等),
客户端就没有反应了,怎么解决?

服务器端简化代码:

private Void SendMessage(string Msg;
{
byte[] msgByte = new byte[65535];
string msgStr = msg + "\r\n";
msgByte = System.Text.Encoding.BigEndianUnicode.GetBytes(msgStr.ToCharArray());
if (socket.Connected)
socket.Send(msgByte);
}
public button1_click()
{
if(X1<10&&X2>100)
{
SendMessage("login|"+X1.ToString()+"|");
SendMessage("welcome|"+X2.ToString()+"|");
}
else
{
SendMessage("logout|"+(X2-X1).ToString()+"|");
}
}

客户端:
private void button1_Click()
{
ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

ClientSocket.Connect(ServerInfo);
ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,new AsyncCallback(this.ReceiveCallBack),null);
}

private void ReceiveCallBack(IAsyncResult AR)
{
int REnd=ClientSocket.EndReceive(AR);
if(REnd==0)
return;
string Rec=Encoding.BigEndianUnicode.GetString(MsgBuffer,0,REnd);
string [] cmdparams=Rec.Split('|');
switch(cmdparams[0])
{
case "login":
showmessage('loginok');
playmusic("hello");
break;
case "welcome"
showmessage('welcomed);
playmusic("welcome");
break;

case "logout":
showmessage("logoutok");
playmusic("byebye");
break;
}
ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,new AsyncCallback(ReceiveCallBack),null);
}

当服务器端发送SendMessage("logout|"+(X2-X1).ToString()+"|");客户端能够响应,
可是服务器连续发送
SendMessage("login|"+X1.ToString()+"|");
SendMessage("welcome|"+X2.ToString()+"|");
时客户端就处理不了第二条指令了,怎么解决这个问题??
...全文
425 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojin0710 2009-01-17
  • 打赏
  • 举报
回复
遇到同样的问题,帮顶啊
zhujiechang 2009-01-17
  • 打赏
  • 举报
回复
客户端使用线程处理接收信息
ILYYLM521125 2009-01-17
  • 打赏
  • 举报
回复
To:Deathsign 怎么填满?

To:yagebu1983 处理指令?我对发送过来的数据都进行处理


To:liuqian4243 我想是多线程的问题

我只是在Form_Load中加入了System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;

没有使用委托。难道是这出了问题???

如果定义委托,每个控件都需要定义,而且对每个控件操作有很多可能,例如移动一个label位置,也可能对label进行赋值,这个委托如何定义啊???
Ny-6000 2009-01-16
  • 打赏
  • 举报
回复
并发的问题。

还是多线程的问题。
yagebu1983 2009-01-16
  • 打赏
  • 举报
回复
你的判断是否有处理指令!!
Deathsign 2009-01-16
  • 打赏
  • 举报
回复
在接收的时候 可能因为网络问题
你2次发送的时候是在一起异步接收的。。。。
所以只接收1次

建议发送的时候吧缓冲区填满 发送 这个样子可以避免 2次发送在一次接收里面

111,130

社区成员

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

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

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