c# - 从套接字读取数据时出现问题
问题描述
我正在尝试将数据发送到我的服务器并在另一端接收它,但似乎我无法传输数据这是我的客户端代码:
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();
解决方案
我只是弄清楚出了什么问题。在这条线上:
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 上使用它。
简而言之,请确保您在哪里填写传入数据:|
推荐阅读
- google-cloud-platform - 如何禁用 Firebase 功能版本控制
- html - 如何为我的第一个表单获取正确的格式?
- visual-studio-2017 - 如何使 Visual Studios 在我键入新行时始终使用 Unix 行尾但不与其他行尾混淆?
- javascript - Reactjs:未捕获的类型错误:回调不是函数
- spring-boot - Spring JPA H2 数据库获取 org.h2.jdbc.JdbcSQLSyntaxErrorException 架构“MYSCHEMA”未找到
- java - 当我尝试更新用户并且无法使用 SpringBoot 显示我的用户角色时出现错误
- linux - Linux 用户访问控制
- php - 为什么 PHP 函数在实时服务器上不起作用?
- ios - 将图像添加到 UIActivityController
- webdriver - 如何在geckodriver中单击并按住一个元素一段时间?