0

我尝试从 android 客户端连接我的 windows 桌面 java 服务器。我正在跨平台工作。桌面服务器和桌面客户端使用相同的代码工作正常,但桌面服务器和 android 客户端有一个有趣的问题。清单权限已设置。

桌面java服务器代码

ServerSocket serverSocket = new ServerSocket(tcp_port);
Socket link = null;
while(true) {
     link = serverSocket.accept();
     PrintWriter output = new PrintWriter(link.getOutputStream(),true); // flush true
     BufferedReader input = new BufferedReader(new InputStreamReader(link.getInputStream()));
     // step 1 password auth
     String message = input.readLine(); // wait password
     if(message.equals(password)) {
           output.println("correct");

           message = null;
           message = input.readLine(); // wait udp port request
           if(message.equals("UDP")) {
                output.println(udp_port+"");
etc
.
.

安卓客户端代码

Socket link = null; 
link = new Socket(hostip,tcp_port);
PrintWriter output = new PrintWriter(link.getOutputStream(),true); // auto flush true
BufferedReader input = new BufferedReader(new InputStreamReader(link.getInputStream()));
while(true) {
     // step1 send the password wait the response
     output.println(password);
     String message = input.readLine(); // password response
     if(message.equals("correct")) {
          output.println("UDP"); // request udp
          message = null;
          message = input.readLine();
          udpport = Integer.parseInt(message);

etc
.
.

我的问题是相同的代码在 java 桌面客户端和 java 桌面服务器上工作正常但是当我尝试从 android 客户端密码身份验证部分连接 java 桌面服务器时工作正常但是

output.println(udp_port+""); 当我查看服务器端时发送数据两次它首先发送空字符串然后发送我的值有什么问题?

       message = null;
       message = input.readLine(); // wait udp port request
       if(message.equals("UDP")) {

它读取空字符串并跳转 if 语句,但如果我使用

       message = null;
       message = input.readLine(); // read empty string
       message = input.readLine(); // read my data
       if(message.equals("UDP")) {
            statement works
4

1 回答 1

0

如果您在收到数据之前尝试读取数据,这是预期的行为 - 从远程系统接收数据时更有可能发生这种情况,但您必须始终允许这种可能性。

您的应用程序必须等到收集到完整的消息,在这种情况下,可能是通过循环调用 readLine() 直到您收到非空消息。

于 2013-05-08T20:50:58.763 回答