Server:
byte[] buf = new byte[1024];
socket_client = socket_srv.Accept();
string str = "........";//str长度是3770;
socket_client.BeginSend(System.Text.Encoding.Default.GetByte(str),0,str.Length,......);
......client:
byte[] bufRecv = new byte[1024];
socket_client.BeginRecive(bufRecv,0,1024,SocketFlag.None,new AsyncCallBack(OnRecive),socket);
.....private void OnRecive(IAsyncResult ar)
{
Scoket s_client = (Socket)ar.AsyncState;
int nRecv = s_client.EndRecive(ar);
//此时nRecv为1024,显然没有收完我的数据,我要怎么做才能继续收数据。
......
}
byte[] buf = new byte[1024];
socket_client = socket_srv.Accept();
string str = "........";//str长度是3770;
socket_client.BeginSend(System.Text.Encoding.Default.GetByte(str),0,str.Length,......);
......client:
byte[] bufRecv = new byte[1024];
socket_client.BeginRecive(bufRecv,0,1024,SocketFlag.None,new AsyncCallBack(OnRecive),socket);
.....private void OnRecive(IAsyncResult ar)
{
Scoket s_client = (Socket)ar.AsyncState;
int nRecv = s_client.EndRecive(ar);
//此时nRecv为1024,显然没有收完我的数据,我要怎么做才能继续收数据。
......
}
LZ自己写的接收缓冲区大小为1024,怎么可能让它一次接受的数据大于1024Byte啊。建议LZ最好将发送的数据封装起来,规定一个格式,比如 消息头+消息长度+消息内容
当客户端接收数据时,先接受到消息头,然后根据消息长度来判断数据接收是否完整,若不完整,接着调用socket.BeginReceive(……);
代码类似这样。。private void OnRecive(IAsyncResult ar)
{
Scoket s_client = (Socket)ar.AsyncState;
int nRecv = s_client.EndRecive(ar); //根据bufRecv里面消息长度 来决定是否需要 再次 socket.BeginReceive();
if(是)
{
socket_client.BeginRecive(bufRecv,0,1024,SocketFlag.None,new AsyncCallBack(OnRecive),socket);
}
}
while(ar.IsCompleted)
{
Scoket s_client = (Socket)ar.AsyncState;
int nRecv = s_client.EndRecive(ar);
}
endrecevie里面会收到上一次2048里面的后1024字节数据吗?