简体   繁体   English

Android中的TCP-ObjectOutputStream writeObject失败

[英]TCP in Android - ObjectOutputStream writeObject failure

I'm trying to send an Object from my phone to my PC(Windows) using a TCP socket via WiFi. 我正在尝试通过WiFi使用TCP套接字将对象从手机发送到PC(Windows)。 When I try the same code between two PCs, it works without any error. 当我尝试两台PC之间的相同的代码,它的工作没有任何错误。 But when I put the client code to the android device, it fails to send date using writeObject method. 但是,当我将客户端代码放入android设备时,它无法使用writeObject方法发送日期。 But writeUTF command works. 但是writeUTF命令有效。 It gives the "Software caused connection abort: recv failed" error. 它给出了“软件引起的连接中止:接收失败”错误。 Below is the Code. 以下是代码。 Please help.. 请帮忙..

Server(in PC): 服务器(在PC中):

public class Test {

public static void main(String arg[]) {
    ServerSocket serverSocket = null;
    Socket socket = null;
    ObjectInputStream in = null;
    ObjectOutputStream out = null;


    try {
        serverSocket = new ServerSocket(8888);
        System.out.println("Listening :8888");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    while (true) {
        try {
            socket = serverSocket.accept();
            in = new ObjectInputStream(socket.getInputStream());
            out = new ObjectOutputStream(socket.getOutputStream());
            out.flush();

            System.out.println("ip: " + socket.getInetAddress());
            Message msg = (Message) in.readObject();  //Message captured from chat client.
            System.out.println(msg.type + " message received from " + msg.sender + " Containing " + msg.content);
            out.writeObject(new Message("Ack", "Server", "Message Received", "Client"));
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } 



        finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
}

Client (in Android Device): 客户端(在Android设备中):

public class MainActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button bb=(Button)findViewById(R.id.button1);

    bb.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            new Send().execute();

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
 private class Send extends AsyncTask<Void, Void, Void> {
        Socket socket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;

     protected Void doInBackground(Void... arg0) {

            try {
                socket = new Socket("192.168.43.92", 8888); //use the IP address of the server
                out = new ObjectOutputStream(socket.getOutputStream());
                out.flush();

                out.writeObject(new Message("Chat", "Server", "Hello World", "Server")); //This method is used to write something to the server.
                out.flush();

                Message msg = (Message) in.readObject();
                System.out.println(msg.type + " message received from " + msg.sender + " Containing " + msg.content);


            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

            finally {

                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }            





         return null;            
     }

     protected void onProgressUpdate(Integer... progress) {
         //setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         //showDialog("Downloaded " + result + " bytes");
     }
 }

}

Message(in Both Sides): 消息(双方):

public class Message implements Serializable{

private static final long serialVersionUID = 1L;
public String type, sender, content, recipient;

public Message(String type, String sender, String content, String recipient){
    this.type = type; this.sender = sender; this.content = content; this.recipient = recipient;
}

@Override
public String toString(){
    return "{type='"+type+"', sender='"+sender+"', content='"+content+"', recipient='"+recipient+"'}";
}
}

Is the network between the client and server setup properly via your WiFi? 客户端和服务器之间的网络是否通过WiFi正确设置? Download one of those ping & telnet test apps and use it to test your network connection. 下载其中一个ping&telnet测试应用程序,然后使用它来测试您的网络连接。

Telnet is a useful TCP debugging app. Telnet是有用的TCP调试应用程序。 If you have a server listening on 11.22.33.44 port 1234, you should be able to telnet 11.22.33.44 1234 如果您的服务器在11.22.33.44端口1234上侦听,则应该能够telnet 11.22.33.44 1234

Maybe, you need to add this functions into Message class: 也许您需要将此函数添加到Message类中:

private void writeObject(java.io.ObjectOutputStream stream)
         throws IOException {
     stream.writeObject(type);
     stream.writeObject(sender);
     stream.writeObject(content);
     stream.writeObject(recipient);
 }


 private void readObject(java.io.ObjectInputStream stream)
         throws IOException, ClassNotFoundException {
     type = (String) stream.readObject();
     sender = (String) stream.readObject();
     content = (String) stream.readObject();
     recipient = (String) stream.readObject();

 }

http://developer.android.com/reference/java/io/Serializable.html http://developer.android.com/reference/java/io/Serializable.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM