我正在寫我的android應用程序通過TCP/IP簡單的服務器。服務器超時後接收數據包TCP/IP
我面臨一個問題,即服務器只在應用程序超時後收到消息。
我的服務器端:
System.out.println("Connection accepted");
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
capitalizedSentence = "READY";
writeToUser(outToClient, "READY".getBytes());
String response = readFromUser(connectionSocket);
// Server hangs on readFromUser();
if(response.contains("IL"))
{
byte[] bytes = DatatypeConverter.parseHexBinary(foo);
writeToUser(outToClient, bytes);
}
應用程序方面:
if (ack.equals("READY")) {
ack = "";
dataOutputStream.writeBytes(command);
dataOutputStream.flush();
buf = new byte[556];
dataInputStream.read(buf);
// app hangs on read() and gets timeout
}
的問題是,服務器接收應用程序被讀取超時後,才命令。
我目前的情況是這樣的:
- 連接受理:申請接收「READY」
- 應用程序發送的命令,並試圖從服務器讀取
服務器被掛在readFromUser響應(),只有應用程序讀取超時後收到消息。
任何想法我做錯了什麼?
更新:
代碼工作,如果我使用輸入行,而不是read(BUF)(如果我沒有理解清楚的服務器掛在讀(BUF),並在等待模式插座不即使沒有更多的數據beeing發送。)
然而,這樣的方式,我必須在每個命令後添加「\ n」,而服務器只是模擬器,應用程序與不理解「\ n」的不同設備一起工作,最後會崩潰。 有沒有什麼辦法可以使這個工作,而不使用readLine()?
更新2
public void writeToUser(DataOutputStream outToClient, byte[] bytes) throws IOException
{
outToClient.write(bytes);
outToClient.flush();
String s = new String(bytes);
writeLog("Sent to client: " + s);
}
public String readFromUser(Socket socket) throws IOException, InterruptedException
{
writeLog("Reading...");
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientSentence = inFromClient.readLine();
writeLog("Received: " + clientSentence);
return clientSentence;
}
以上readFromUser()
方法作品一樣的預期。但是,這需要在客戶端應用程序發送的每個命令上添加"\n"
。而我必須與之交流的真實設備並不瞭解"\n"
,並將該命令視爲無法識別......我僅僅爲了測試目的而編寫此服務器,並且希望它儘可能接近真實。
以前我只是想獲得它不"\n"
使用inFromClient.read(cbuf);
代替readLine()
和服務器始終得到了掛在讀取每個命令完成,接收到的命令套接字在客戶端關閉之後。儘管我知道客戶端發送了命令並正在等待響應。
問題是如何在客戶端不使用readLine();
和"\n"
來接收命令。
你如何閱讀客戶端中的'ack'?你確定超時不是在閱讀'ack'嗎?這對我來說會更有意義。 – EJP
不可以超時。請查看有關問題的更新。問題是服務器沒有收到數據。那麼它正在接收數據,但它會在讀取時掛起,並等待更多數據來臨。並且只有在套接字關閉之後,該命令才從讀取(buf)中恢復。 – Datenshi
那麼readFromUser()和writeToUser()會做什麼? – EJP