2

如何使用相同的 Stream 从服务器到客户端或从客户端到服务器多次读取/写入?

我正在通过蓝牙制作回合制游戏。关于如何在 j2me 中实现这一点的任何想法?

我正在使用 RfCOM 协议。

客户端代码是

public void serviceSearchCompleted(int transID, int respCode) {
    try {
        StreamConnection SC = (StreamConnection) Connector.open(connectionURL);
        input = SC.openDataInputStream();
        output = SC.openDataOutputStream();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    while (true) {
        f.setCommandListener(new CommandListener() {

            public void commandAction(Command c, Displayable d) {
                if (c.getLabel().toString().equalsIgnoreCase("send")) {
                    try {
                        output.writeUTF("Hey server");
                        output.flush();
                        String msg = input.readUTF();
                        System.out.println(msg);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                        System.out.println("am here now " + ex);
                    }
                }
            }
        });
        synchronized (lock) {
            lock.notify();
        }

    }
}

服务器代码:

while (true) {
                StreamConnection sc = scn.acceptAndOpen();

                RemoteDevice rd = RemoteDevice.getRemoteDevice(sc);
                DataInputStream input = sc.openDataInputStream();
                DataOutputStream output = sc.openDataOutputStream();
                String inMsg = input.readUTF();
                System.out.println(inMsg + " recived at " + new Date().toString());

                output.writeUTF("Hey client Sent at " + new Date().toString());
                output.flush();
            }

流只工作一次,然后当我再次单击发送时没有任何反应

Processing CONN_INIT 4
Processing CONN_OPEN 4
Processing CONN_SEND 4
Processing CONN_RECEIVE 4
Hey client Sent at Sun Jul 22 19:47:15 GMT+02:00 2012
Processing CONN_SEND 4
Processing CONN_RECEIVE 4
4

1 回答 1

1

L2CAPConnectionNotifier.acceptAndOpen将阻塞循环并等待新的连接。

将代码从 while 主体移动到新线程。

while (true) {
    StreamConnection sc = scn.acceptAndOpen();
    final RemoteDevice rd = RemoteDevice.getRemoteDevice(sc);
    new Thread() {
        public void run() {
            treatConnection(rd);
        }
    }.start();
}

private void treatConnection(RemoteDevice rd) {
    DataInputStream input = sc.openDataInputStream();
    DataOutputStream output = sc.openDataOutputStream();
    String inMsg = input.readUTF();

    while (inMsg != null) { // not sure about this stop condition...
        System.out.println(inMsg + " recived at " + new Date().toString());
        output.writeUTF("Hey client Sent at " + new Date().toString());
        output.flush();

        inMsg = input.readUTF();
    }
}
于 2012-07-23T11:28:45.617 回答