我无法从服务器套接字

时间:2016-03-05 15:05:20

标签: java android sockets

首先,Android应用程序将连接到服务器(PC)。 然后android会发送一条消息。 最后,android应该从服务器收到一条消息。

当我将消息从android发送到服务器时,一切顺利。 但是,当从Android应用程序中的套接字读取时,我无法收到任何内容。

这是服务器代码

    ServerSocket Sock = new ServerSocket(7777);


    System.out.println("Waiting for connection...\n");

    Socket connectionSocket = Sock.accept();

    System.out.println("Client In...");

    BufferedReader inFromClint = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    PrintWriter printwriter = new PrintWriter(connectionSocket.getOutputStream());


    String txt = inFromClint.readLine();
    System.out.println(txt);

    String MsgToClient = "{\"LoginFlag\":\"N\"}";  //{"LoginFlag":"P"}


    printwriter.write(MsgToClient);
    printwriter.flush();
    printwriter.close();

    System.out.println("\nMsg Sent");

    Sock.close();

这是Android应用的示例

new Thread(new Runnable() {
    @Override
    public void run() {
       try
          {
             BufferedReader bufferedReader = null;
             PrintWriter printwriter = null;
             port = 7777;

              client = new Socket("192.168.1.2", port);
              printwriter = new PrintWriter(client.getOutputStream());

              printwriter.write(SMsgLog);
              printwriter.flush();
              printwriter.close();

              bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));

              if( bufferedReader.ready() )
              {
                  RJasonLog = bufferedReader.readLine();   //rcv as jason
              }
              else
              {
                 RJasonLog = null;
              }


              if (RJasonLog != null)
              {
                 JSONObject objectRcv = new JSONObject(RJasonLog);

                  if (objectRcv != null)
                  {
                     RMsgLog = objectRcv.getString("LoginFlag");  //Jason Key from the server
                   }
               }

               RMsgLog = "N";

               if(RMsgLog.equals("N"))
               {                                     
                  alert.showAlertDialog(Login.this, "Login failed..", "Username/Password is incorrect", false);
               }
                else
                      alert.showAlertDialog(Login.this, "Login failed..", "Please Try Again", false);


               client.close();
           }

           catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
     }
 }).start();

3 个答案:

答案 0 :(得分:2)

客户正试图读取一条线。但是服务器没有发送printwriter.write(MsgToClient);的行。更改为printwriter.write(MsgToClient + "\n");以发送一行。

答案 1 :(得分:0)

请勿在客户端代码中关闭输出流,请删除此行:

printwriter.close();

在连接处于活动状态之前,不应关闭流。完成套接字后,应该在结束时关闭它。关闭连接也将关闭与之关联的流。

以下是关于getOutputStream方法的小描述。

  

的getOutputStream

     

public OutputStream getOutputStream()throws IOException返回一个   此套接字的输出流。如果此套接字具有关联   然后,结果输出流委托它的所有   对渠道的操作。如果频道处于非阻塞模式则   输出> stream的写操作会抛出一个   IllegalBlockingModeException异常。

     

关闭返回的OutputStream将关闭相关的套接字。

     

返回:用于将字节写入此套接字的输出流。抛出:   IOException - 如果在创建输出流时发生I / O错误   或者如果插座未连接。

答案 2 :(得分:0)

我在评论的帮助下解决了这个问题。

我在客户端删除了printwriter.close();

然后我在发送消息之前在客户端和服务器中添加了\n