问题描述
服务器端根据游戏结果,可能向客户端连续发两条数据(甚至更多条),这是客户端需要作出相应,改变界面,例如更新某个label的text,可是有时服务器发送第一条数据后客户端能正确响应,服务器紧接发第二条时(这是客户端还在做相应第一条的动作,例如播放声音,或者利用循环改变某个picturebox的图像等),客户端就没有反应了,怎么解决?服务器端简化代码:privateVoidSendMessage(stringMsg;{byte[]msgByte=newbyte[65535];stringmsgStr=msg+"rn";msgByte=System.Text.Encoding.BigEndianUnicode.GetBytes(msgStr.ToCharArray());if(socket.Connected)socket.Send(msgByte);}publicbutton1_click(){if(X1<10&&X2>100){SendMessage("login|"+X1.ToString()+"|");SendMessage("welcome|"+X2.ToString()+"|");}else{SendMessage("logout|"+(X2-X1).ToString()+"|");}}客户端:privatevoidbutton1_Click(){ClientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);ClientSocket.Connect(ServerInfo);ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(this.ReceiveCallBack),null);}privatevoidReceiveCallBack(IAsyncResultAR){intREnd=ClientSocket.EndReceive(AR);if(REnd==0)return;stringRec=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,newAsyncCallback(ReceiveCallBack),null);}当服务器端发送SendMessage("logout|"+(X2-X1).ToString()+"|");客户端能够响应,可是服务器连续发送SendMessage("login|"+X1.ToString()+"|");SendMessage("welcome|"+X2.ToString()+"|");时客户端就处理不了第二条指令了,怎么解决这个问题??
解决方案
解决方案二:
在接收的时候可能因为网络问题你2次发送的时候是在一起异步接收的。。。。所以只接收1次建议发送的时候吧缓冲区填满发送这个样子可以避免2次发送在一次接收里面
解决方案三:
你的判断是否有处理指令!!
解决方案四:
并发的问题。还是多线程的问题。
解决方案五:
To:Deathsign怎么填满?To:yagebu1983处理指令?我对发送过来的数据都进行处理To:liuqian4243我想是多线程的问题我只是在Form_Load中加入了System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;没有使用委托。难道是这出了问题???如果定义委托,每个控件都需要定义,而且对每个控件操作有很多可能,例如移动一个label位置,也可能对label进行赋值,这个委托如何定义啊???
解决方案六:
客户端使用线程处理接收信息
解决方案七:
遇到同样的问题,帮顶啊