【问题标题】:Android TCP sending dataAndroid TCP发送数据
【发布时间】:2016-02-19 09:13:51
【问题描述】:

假设我想与服务器建立一个 Socket 连接,用于接收和发送数据。创建该套接字后,我想继续通过它发送数据并同时接收。我当前的代码不起作用,将不胜感激代码示例。谢谢。我当前的代码:

public static PrintWriter outToServer;
private static Socket clientSocket;
public static BufferedReader inFromServer;
public static void register(InetAddress ip, int port, String name) {
try {
    clientSocket = new Socket(ip, port);
    outToServer = new PrintWriter(clientSocket.getOutputStream(),true);
    inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

      new Thread(new Runnable() {
        @Override
        public void run() {
            receive();
        }
    }).start();
    send("reg:" + name);
    }   catch (Exception e) {
       e.printStackTrace();
   }
 }
 //That method is called many times after "send("reg:" + name);"
public static void send(String str) {
        outToServer.println(str);
}
private static void receive() {
   try{
    while (true) {
      String str = inFromServer.readLine();
   }
  } catch(Exception e) {
  e.printStackTrace();
  }
}

服务器代码:

   class TCPServer {
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);
 }
}
}

【问题讨论】:

  • 你怎么能确定你收到了什么? receive() 方法中没有输出。另外,我不相信这会编译。当您打电话给new Thread().start 时没有()。 inFromServer.readLine() 也应该能够抛出 IOException
  • 已修复。我想先让发送工作,然后处理接收。
  • readLine()返回null时需要停止阅读。
  • @EJP 如果收到的话,会做这项工作吗?还有这怎么会导致发送问题
  • 当然if 可以完成这项工作,或者更常见的是while:while ((line = in.readLine()) != null)。我不记得说过这可能会导致发送问题。它是作为评论发布的,而不是作为答案发布的。

标签: android sockets tcp send


【解决方案1】:

我认为您在发送消息后错过了对 flush() 的调用。

试试这个:

public static void send(String str) {
    outToServer.println(str);
    outToServer.flush();
}

这是一个完整的例子:

private boolean _run = false;
private PrintWriter _bufferOut;
private BufferedReader _bufferIn;

public static void register(InetAddress ip, int port, String name) {
    _run = true;
    new Thread(new Runnable() {
        public void run() {
            while(_run) {
                try {
                    Socket socket = new Socket(ip, port);
                    try {
                        OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
                        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
                        _bufferOut = new PrintWriter(new BufferedWriter(osw), true);
                        _bufferIn = new BufferedReader(isr);
                        sendMessage("reg:" + name);
                        while (_run) {
                            String msg = _bufferIn.readLine();
                            // do whatever with the message
                        }
                    } catch (Exception e) { socket.close(); continue; }
                    socket.close();
                    break;
                } catch (Exception e) {}
            }
        }
    }).start();
}

public void stop() {
    _run = false;
    if (_bufferOut != null) { _bufferOut.flush(); _bufferOut.close(); }
    _bufferIn = null; _bufferOut = null;
}

public void sendMessage(String msg) {
    if (_bufferOut == null || _bufferOut.checkError()) return;
    _bufferOut.println(msg); _bufferOut.flush();
}

更新

服务器:

class TCPServer {
    public static void main(String argv[]) throws Exception {
        ServerSocket welcomeSocket = new ServerSocket(9876);
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        while (true) {
            System.out.println("Received: " + inFromClient.readLine());
        }
    }
}

多用户服务器:

class TCPServer {
    public static void main(String argv[]) throws Exception {
        ServerSocket welcomeSocket = new ServerSocket(9876);
        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            new Thread(new Runnable() {
                public void run() {
                    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                    while (true) {
                        System.out.println("Received: " + inFromClient.readLine());
                    }
                }
            });
        }
    }
}

【讨论】:

  • 感谢您的快速答复!不幸的是,就像我当前的代码一样,只收到了sendMessage("reg:" + name);。我在发送其他人时(sendMessage("reg:"+name) 之后)在 android studio 中看到了一些流量活动,但服务器没有收到任何流量...
  • 他在代码 docs.oracle.com/javase/7/docs/api/java/io/… 中使用了这个构造函数,它将 autoflush 设置为 true。
  • 你能发布服务器的代码吗?可能是服务器没有正确接收...我发布的代码我已经在另一个项目中成功使用了。
  • 我相信问题出在服务器上。语句“Socket connectionSocket = welcomeSocket.accept();”阻塞,直到您获得新的连接。您已在 while 循环中添加了这一行。因此,您的代码只会收到第一条消息。相反,请尝试将其移出循环。如果要启用多个连接,请为每个传入连接启动一个线程。
  • 我添加了上面的修改;)
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2015-08-25
  • 2011-09-13
  • 2012-12-17
  • 1970-01-01
  • 2023-03-23
  • 2016-02-17
相关资源
最近更新 更多