gpt4 book ai didi

java - Android 从 Socket 读取内容卡在第二个读取循环上

转载 作者:行者123 更新时间:2023-12-02 07:26:57 24 4
gpt4 key购买 nike

我必须在我的应用程序中实现聊天。与服务器的连接是使用套接字建立的。我应该注册到该服务器,服务器会通过回复来确认这一点。

我在一个方法中实现了这一点,我使用 BufferedWriter 发送命令,然后开始从输入流读取,直到它告诉我没有更多数据。

我正确阅读了服务器回复。但是,我从未从第二个 in.read 调用中获得负值,因此我的方法在 while 循环中保持阻塞(在我进行该调用的条件语句中)。

如何使用套接字来完成此操作?我通常对文件或其他输入流执行此操作,不会出现任何问题。

如果我应该只读取我应该读取的字节,这是否意味着我必须:

  • 提前知道服务器响应的长度?
  • 或者让服务器发送一个代码来通知它已完成发送响应?

目前我正在执行以下操作:

private String sendSocketRequest(String request, boolean skipResponse) throws ChatException {
if (!isConnected()) openConnection();

try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()), 2048);
out.append(request);
out.flush();
out = null;
} catch (IOException e) {
LogHelper.error("Unable to send socket request: " + request, e);
throw new ChatException("Unable to send socket request: " + request, e);
}

try {
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()), 2048);
StringBuffer response = new StringBuffer();
char[] buffer = new char[2048];
int charsRead = -1;

// >>>>>>>> This is where it gets blocked <<<<<<<<<

while ((charsRead = in.read(buffer)) >= 0) {
if (charsRead > 0) response.append(new String(buffer, 0, charsRead));
}
return response.toString();
} catch (IOException e) {
LogHelper.error("Unable to read socket response: " + request, e);
throw new ChatException("Unable to read socket response: " + request, e);
}
}

通过以下方法连接到服务器:

public synchronized void openConnection() throws ChatException {
try {
socket = new Socket(Constants.API_CHAT_SERVER_ADDRESS, Constants.API_CHAT_SERVER_PORT);
socket.setKeepAlive(true);

LogHelper.debug("CHAT >> Connected to the chat server: " + Constants.API_CHAT_SERVER_ADDRESS);
} catch (UnknownHostException e) {
LogHelper.error("Unable to open chat connection", e);
throw new ChatException("Unable to open chat connection", e);
} catch (IOException e) {
LogHelper.error("Unable to open chat connection", e);
throw new ChatException("Unable to open chat connection", e);
}
}

最佳答案

通过基于套接字的连接发送/接收的数据量取决于协议(protocol),并且 TCP/IP 堆栈不知道,而仅应用程序层知道。

所使用的协议(protocol)取决于开发人员......;-)所以来回答你的问题:

If I should read only the bytes I am supposed to read, does that mean that I either have to:

  • Know in advance the length of the server response?

是的,这是一种可能性。

  • or make the server send a code to notify it has finished to send its response?

也是的,因为这是另一种可能性。常见标记为 \n\r\nNUL/'\0' 字符也可能有意义。

第三个选项是为每个数据 block 添加固定数量的字节作为前缀,描述即将到来的字节数。

关于java - Android 从 Socket 读取内容卡在第二个读取循环上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13453233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com