[英]Android TCP send data trough one socket
具有以下代碼:
public static PrintWriter outToServer;
private static Socket clientSocket;
public static void register(InetAddress ip, int port, String name) {
try {
Utils.ip = ip;
Utils.port = port;
Utils.name = name;
clientSocket = new Socket(Utils.ip, Utils.port);
outToServer = new PrintWriter(clientSocket.getOutputStream(),true);
send("reg:" + name);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void send(String str) {
outToServer.println(str);
}
在應用程序啟動時,我一次調用了register
方法。 在我使用send
方法將數據發送到服務器之后。 問題在於只有從register
調用的第一個send
才從服務器正確接收。 其他所有郵件都已發送但未收到(或者,如果沒有,我看不到它們被顯示)。 我的服務器代碼:
public static void main(String argv[]) throws Exception {
String clientSentence;
ServerSocket welcomeSocket = new ServerSocket(9876);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
clientSentence = inFromClient.readLine();
System.out.println("Received: " + clientSentence);
}
}
好的,但是當我從客戶端嘗試此代碼時,它通過發送更多的流量來工作(我不想要這樣)。
public static PrintWriter outToServer;
private static Socket clientSocket;
public static void register(InetAddress ip, int port, String name) {
try {
Utils.ip = ip;
Utils.port = port;
Utils.name = name;
send("reg:" + name);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void send(final String str) {
new Thread(new Runnable() {
@Override
public void run() {
try {
clientSocket = new Socket(Utils.ip, Utils.port);
outToServer = new PrintWriter(clientSocket.getOutputStream(), true);
outToServer.println(str);
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
我需要對此做一些解釋。
從一個套接字可以有多個OutPutStreams?
當我關閉OutPutStream並嘗試在同一套接字上打開一個新的套接字時,為什么會出現socketClosed
異常。 我僅在立即send
定義outToServer
:
public static void send(final String str) {
new Thread(new Runnable() {
@Override
public void run() {
try {
PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(), true);
outToServer.println(str);
outToServer.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
}
您需要在套接字上設置TCP_NODELAY 。 默認情況下,數據將一直緩存到填充整個數據包為止。 當緩沖區已滿時,將發送一個數據包。 但是,對於此協議,您希望立即發送數據,以便服務器可以響應。
從一個套接字可以有多個OutputStreams?
該套接字只有一個輸入流和一個輸出流。
當我關閉OutputStream並嘗試在同一套接字上打開一個新的套接字時,為什么會出現socketClosed異常。
因為關閉套接字輸入或輸出流會關閉套接字,如Javadoc中所述。
注意:您發布的服務器代碼永遠不會關閉任何內容。 您發布的客戶端代碼永遠不會關閉任何內容,只會發送一條消息。
NB 2 PrintWriter會吞下異常,因此不應在網絡上使用。 使用BufferedWriter。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.