繁体   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