无法通过套接字android从服务器接收消息

时间:2011-10-11 02:52:34

标签: android sockets

我写了一个函数来发送和接收来自服务器的消息,如下所示:

//Send mess to server through socket
public boolean send_Message_service(String mess) throws IOException{
    Log.i("debug", "Connection status: "+String.valueOf(this.clientSocket.isBound()));
    boolean rs=false;
    //Send mess toi server
    BufferedReader in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(this.clientSocket.getOutputStream())), true);
    out.println(mess);      
    //Receive mess from server

    String mess_From_Server=in.readLine();

    if(mess_From_Server.equalsIgnoreCase("success")){
        rs=true;
    }
    else{
        rs=false;
    }

    return rs;
}   

该功能可以向服务器发送消息但无法从服务器接收消息,当我用手机运行时,需要很长时间并强制关闭!

这是logcat:

10-11 12:17:35.201: INFO/global(279): Default buffer size used in BufferedWriter constructor. It would be better to be explicit if an 8k-char buffer is required.
10-11 12:21:26.321: DEBUG/SntpClient(61): request time failed: java.net.SocketException: Address family not supported by protocol

这是服务器代码(在Java而不是Android上运行):

int receiveMsgSize;//Size of received message
    byte[] receiveBuf= new byte[100]; //Receive Buffer
try {
        ObjectOutputStream oos = new  ObjectOutputStream(this.clientSocket.getOutputStream());
                    InputStream in;
        in = this.clientSocket.getInputStream();

        while((receiveMsgSize=in.read(receiveBuf))!=-1){

            String mess=new String(receiveBuf,0,receiveMsgSize);
            System.out.println(mess.length());
            System.out.println(mess);                                           
            }                                                               
            oos.writeObject("success");
        }                           
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:2)

  1. 您的服务器通过ObjectOutputStream.writeObject发送响应。
  2. 您的客户端通过BufferedReader.readLine()读取响应。
  3. 这永远不会起作用。

    如果一端有ObjectOutputStream,则必须在另一端有一个ObjectInputStream。

    如果你的一端有writeObject(),你必须在另一端有readObject()。

    如果你在一端有writeXXX(),你必须在另一端有readXXX(),对于我能想到的所有XXX。

    或者相反,如果你在一端有BufferedReader.readLine(),你必须在另一端有BufferedWriter.write(),然后是BufferedWriter.newLine()。

    不要在网络上使用PrintStream或PrintWriter,因为它们会吞下您需要了解的异常。