簡體   English   中英

Android TCP通過一個套接字發送數據

[英]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 默認情況下,數據將一直緩存到填充整個數據包為止。 當緩沖區已滿時,將發送一個數據包。 但是,對於此協議,您希望立即發送數據,以便服務器可以響應。

https://stackoverflow.com/a/33658536/1172714

從一個套接字可以有多個OutputStreams?

該套接字只有一個輸入流和一個輸出流。

當我關閉OutputStream並嘗試在同一套接字上打開一個新的套接字時,為什么會出現socketClosed異常。

因為關閉套接字輸入或輸出流會關閉套接字,如Javadoc中所述。

注意:您發布的服務器代碼永遠不會關閉任何內容。 您發布的客戶端代碼永遠不會關閉任何內容,只會發送一條消息。

NB 2 PrintWriter會吞下異常,因此不應在網絡上使用。 使用BufferedWriter。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM