从套接字读取数据时出现问题
Posted
技术标签:
【中文标题】从套接字读取数据时出现问题【英文标题】:Issue while reading data from a socket 【发布时间】:2018-10-31 08:10:11 【问题描述】:我正在尝试将数据发送到我的服务器并在另一端接收它,但似乎我无法传输数据 这是我的客户端代码:
public void SendMessage(string MessageToSend)
MessageToSend += "#-*!!|#";
byte[] buffer = Encoding.ASCII.GetBytes(MessageToSend);
clientSocket.BeginSend(buffer, 0, buffer.Length, 0, new AsyncCallback(SendCallback), clientSocket);
private void SendCallback(IAsyncResult ar)
Socket client = (Socket)ar.AsyncState;
int bytesSent = client.EndSend(ar);
Console.WriteLine("Sent 0 bytes to server.", bytesSent);
这是我的服务器
private void ReceiveCallBack(IAsyncResult ar)
StateObject state = (StateObject)ar.AsyncState;
int received = state.workSocket.EndReceive(ar);
if (received > 0)
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, received));
content = state.sb.ToString();
Console.WriteLine("RECEIVED : " + Encoding.UTF8.GetString(state.buffer, 0, received));
if (content.IndexOf("#-*!!|#") != -1)
StaticVariables.ReqHandler.Requests.Add(content.Substring(0, content.Length - 7));
state.workSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state);
state.sb.Clear();
return;
else
state.workSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state);
问题是我永远无法进入 if 块,如果传入消息已完成,我会查看该块。有人可以告诉我我哪里出错了吗?
更新:当我使用断点并检查“内容”变量时,我看到很多 \0\0\0\0\0\0\0 并继续正常查看时为空,这可能是因为我的缓冲区大小或有关编码的东西?
更新 2:当我在这一行设置断点时,我刚刚意识到
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, received));
我的 state.buffer 完全是空的。我将编写代码的开头以及如何调用“ReceiveCallBack”。也许我在代码的前一部分做错了什么。
public void StartServer()
serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
serverSocket.Listen(10);
serverSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
private void AcceptCallBack(IAsyncResult ar)
Socket socket = serverSocket.EndAccept(ar);
clientSockets.Add(socket);
StateObject State = new StateObject();
State.workSocket = socket;
socket.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallBack), State);
serverSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
这就是我启动服务器的方式。我用它来调用 StartServer
StaticVariables.SocketObject = new SocketConnection();
Thread ServerThread = new Thread(() => StaticVariables.SocketObject.StartServer());
ServerThread.Start();
【问题讨论】:
控制台是否曾经显示RECEIVED : ...
?它与您发送的数据相符吗?
我只看到空虚,但我现在知道为什么了,但我仍然不知道如何解决它。我会更新我的帖子
而且服务器确实显示“Sent 0 bytes to server.”?
这一行 Console.WriteLine("Sent 0 bytes to server.", bytesSent);产生这个:向服务器发送 38 个字节。
是的,控制台正在写 RECEIVED :就是这样。只有空虚。当我使用断点查看变量内部时,我看到变量内部充满了\0
【参考方案1】:
客户端使用 ASCII 编码,服务器端使用 UTF8。您是否尝试过使用相同的编码?
【讨论】:
我可能写错了,是的,但它仍然应该只影响我在控制台上的输出。如果我有任何数据,程序应该进入 if 块【参考方案2】:我刚刚发现出了什么问题。在这一行:
socket.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallBack), State);
我使用的是名为“buffer”的变量,这是正常的。这意味着数据将进入此变量。但后来在 ReceiveCallBack 我使用这个
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, received));
我没有填充 state.buffer,所以我只是编码一个空字节数组,这就是我无法检索数据的原因。我不敢相信我几个小时都没有看到这个。
不管怎样,我这样改变了我的 beginreceive :
socket.BeginReceive(State.buffer, 0, State.buffer.Length, 0, new AsyncCallback(ReceiveCallBack), State);
所以现在我可以将数据填充到 State 对象中并在 Callback 上使用它..
简而言之,请确保您在哪里填写传入数据:|
【讨论】:
它必须不在您最初发布的代码中,很高兴您发现了问题!以上是关于从套接字读取数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
查询 oracle 多维数据集时出现 java.sql.SqlRecoverableException
从 Access 数据库中读取字段时出现 IndexOutOfRangeException
使用 pandas Python (pandas.io.parsers.TextFileReader) 从文件中读取数据时出现问题