1

WiFi経由でTCPソケットを使用して、携帯電話からPC(Windows)にオブジェクトを送信しようとしています。2 台の PC 間で同じコードを試してみると、エラーなく動作します。しかし、クライアント コードを Android デバイスに配置すると、writeObject メソッドを使用して日付を送信できません。しかし、writeUTF コマンドは機能します。「ソフトウェアが原因で接続が中止されました: recv に失敗しました」というエラーが表示されます。以下はコードです。助けてください..

サーバー (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();
                }
            }
        }
    }
}
}

クライアント (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");
     }
 }

}

メッセージ (両面):

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+"'}";
}
}
4

2 に答える 2

0

クライアントとサーバー間のネットワークは、WiFi 経由で適切に設定されていますか? これらの ping & telnet テスト アプリのいずれかをダウンロードし、それを使用してネットワーク接続をテストします。

Telnet は便利な TCP デバッグ アプリです。11.22.33.44 ポート 1234 でリッスンしているサーバーがある場合は、次のことができるはずです。telnet 11.22.33.44 1234

于 2013-12-04T05:41:40.090 に答える