Android在ServerSocket的同一个套接字中读/写

时间:2016-02-04 12:37:01

标签: android sockets inputstream serversocket outputstream

我有一个Android应用程序,它将创建 ServerSocket 并接受套接字。 我希望它可以与远程设备进行通信(读/写)。

我的示例代码如下:

mListenSocket = new ServerSocket();
mListenSocket.setReuseAddress(true);
mListenSocket.bind(new InetSocketAddress(DOCK_PORT));
mSocket = mListenSocket.accept();

Thread {
    loop {
    outputStream = mSyncSocket.getOutputStream();
    inputStream = mSyncSocket.getInputStream();
    ...
    inputStream.read(data)
    outputStream.write(data);
    ...
    }
}

它可以从客户端读取正确的inputStream数据,但是在outputStream的第一次写入数据之后,read()第二次总是返回-1。

我不知道这个问题。 有人可以给我一些提示吗?非常感谢。

=============================================== =======================

我想我需要更清楚地表达我的问题。

有两个设备(A,B),其工作流程如下:

类型1任务:
1.向B
发送命令 2. B收到命令和回复消息给A
3.收到消息,完成。

类型2任务:
1.向B发送命令,完成。

上述任务是异步的。

我的旧方法是分别在A和B设备上创建一个ServerSocket来处理A-> B和B-> A通信。
我想也许一个套接字可以解决上面的任务,但是一个套接字会遇到读-1问题。
有人可以给我更多建议吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

read()返回-1,因为对等方已关闭连接。您应该这样做,并停止阅读,并完全停止处理连接。它已经完成了。

答案 1 :(得分:-1)

我使用这样的东西:

final DataOutputStream dos = new DataOutputStream(s.getOutputStream());   
final BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8"));

// Send the login data.
final JSONObject login = new JSONObject();

// Send the login message.
dos.write((login.toString() + "\r\n").getBytes());

// Wait until we receive something from the server.
String receivedMessage;
while ((receivedMessage = in.readLine()) != null) {
    Log.i(TAG, "Received data: " + receivedMessage);
    processMessagesFromServer(dos, receivedMessage);
}

我使用普通套接字而不是ServerSocket。 有关详细信息,请查看此thread