流和套接字

时间:2017-01-05 17:56:41

标签: java multithreading sockets

我正在尝试编写游戏服务器,这是我第一次使用套接字。

在双方(客户端和服务器)上,我想创建两个并行线程:

1)第一个是重复(通过while-loop和Thread.sleep())向所有连接的用户发送(服务器)和读取(客户端)DefaultListModel对象。我分别为服务器和客户端使用ObjectOutputStream和ObjectInputStream。

2)第二个是String交换(用于确定调用哪个方法)。我使用BufferedReader和PrintWriter(这些线程是客户端和服务器的main()线程)。

我的问题是:所有流都搞乱了。客户端在期望String时接收DefaultModelList,反之亦然。

最后我的问题是:有没有办法将这两个过程分开?让一个流只占一个类并忽略其他类?

我的代码:

// when server wakes up
//Server:
Thread listChangesChecker = new Thread(new ListUpdater());
    listChangesChecker.start();

// now client starts dialog
Client:
writer.println("old");
writer.flush();
showLoginDialog();

//Server:
String userStart = reader.readLine();
if (userStart.equals("old")) { checkOldPlayer(); }

//Client:
String password = tfPassword.getText();
writer.println(login + " " + password); 
writer.flush();               

//Server:
loginPassword = reader.readLine();
if(userIsOk) {
// first and last time list sends inside main()
objectWriter.writeUnshared(playersLoginList);
}

//Client:  
playersList = (DefaultListModel) objectReader.readObject();
// client second thread starting
Thread t = new Thread(new ListChangeListener());
t.start();

服务器第二线程的代码:

private class ListUpdater implements Runnable {

    @Override
    public void run() {

        while (true) {
            try {
                Thread.sleep(1000);

                if(!objectWriters.isEmpty()) {
                    System.out.println("Sent new model");

                    for (int i = 0; i < objectWriters.size(); i++) {
                        ObjectOutputStream ous = objectWriters.get(i);
                        ous.writeUnshared(playersLoginList);
                        ous.reset();
                    }

                    Thread.sleep(5000);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

客户第二线程的代码

private class ListChangeListener implements Runnable {

    @Override
    public  void run() {
        try {
            DefaultListModel<String> newList;

            while (true) {

                    newList = (DefaultListModel<String>) objectReader.readUnshared();
                    playersList = newList;
                    jList.setModel(playersList);
            }

        } catch (Exception e) {e.printStackTrace();}
    }

}

0 个答案:

没有答案