桌面服务器和android客户端本地连接

时间:2013-05-08 20:28:57

标签: java android sockets tcp

我尝试从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
.
.

Android客户端代码

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客户端密码auth部件连接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

1 个答案:

答案 0 :(得分:0)

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

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