Java Server产生不一致的输出

时间:2016-03-08 02:57:02

标签: java multithreading server host socketserver

我想为我创建的二十一点游戏集成一个服务器和多个客户端,因此我开始使用java中的服务器进行练习。我创建了一个线程,当运行时,强制服务器监听输入并产生输出。然后我添加了一个功能来停止服务器。但是,服务器随机生成正确的输出,有时无法连接。以下是用户托管服务器的代码:

st = new ServerThread();  //this is a field of type ServerThread
st.start();  //this runs the server concurrently as a new thread

以下是关闭服务器的代码:

st.stopThread();

最后,这是serverThread的源代码:

public class ServerThread extends Thread {

private volatile boolean isRunning = true;
private Socket socket;
private static final int PORTNUM = 1342;

@Override
public void run() {
    while (isRunning) {  //should run only when the
        try {
            ServerSocket serverSocket = new ServerSocket(PORTNUM);  //uses the same port number, which I made a constant
            //Reading the an object of type Information from the client
            socket = serverSocket.accept();
            ObjectInputStream serverInputStream = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream serverOutputStream = new ObjectOutputStream(socket.getOutputStream());
            Information i = (Information) serverInputStream.readObject();
            //arbitrarily changes the data stored in the information object to verify connection with server
            i.setI(100);
            i.setS("new string");
            i.setD(4.4);
            //sends the modified object back to the client
            serverOutputStream.writeObject(i);
            serverInputStream.close();
            serverOutputStream.close();
            socket.close();
        } catch (IOException e) {
            //System.out.println("IOException");
            //e.printStackTrace();
        } catch (ClassNotFoundException e) {
            //System.out.println("ClassNotFoundException");
            //e.printStackTrace();
        } finally {
            try {
                if (socket != null) {  //avoid null pointer if no connections have been established
                    socket.close();
                }
            } catch (IOException ex) {
                //Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

public void stopThread() {
    isRunning = false;
}

}

欢迎任何有关使我的代码正确且一致地执行的编辑建议。感谢。

1 个答案:

答案 0 :(得分:0)

我会将socket定义从实例变量中移开,即

while (isRunning) { 
  Socket socket = null;
  try {
  ...