TCP多线程服务器并不完全有效

时间:2011-11-14 14:57:53

标签: java network-programming

嗯,说实话,它只适用于一个客户,不知道为什么。客户端也会收到两到三次。 [我使用telnet作为客户端。当我启动另一个telnet会话时,它会保留,但它不会提供任何输出]。 如果需要,我会添加gui代码。

public static void main(String args[]) throws IOException {
    String s;
    initGUI();
    try {
        hostServer = new ServerSocket(port);
        socket = hostServer.accept();
        area.append(" "+socket+" connection\n");
        changeStatusTS(CONNECTED, true);
    } catch (IOException e) {
        cleanUp();
        changeStatusTS(DISCONNECTED, false);
    }
    while (true) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        while(true) {
            multi ml = new multi(socket);
            ml.start();
        }
    }
}

static class multi extends Thread{

    public multi(Socket c) throws IOException {
        socket = c;
    }
    public void run(){
        String s;
        switch (connectionStatus) {
            case CONNECTED:
                try {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    out = new PrintWriter(socket.getOutputStream(), true);
                    if (toSend.length() != 0) {
                        out.print(toSend); out.flush();
                        toSend.setLength(0);
                        changeStatusTS(NULL, true);
                    }
                    if (in.ready()) {
                        s = in.readLine();
                       if ((s != null) &&  (s.length() != 0)) {
                          if(s.equals("test")==true){
                          out.print("bazinga"); 
                          out.flush();
                      }

                     if (s.equals(END_CHAT_SESSION)) {
                        changeStatusTS(DISCONNECTING, true);
                     }
                     else {
                        appendToChatBox("INCOMING: " + s + "\n");
                        changeStatusTS(NULL, true);
                     }
                  }
               }
            }
            catch (IOException e) {
               cleanUp();
               changeStatusTS(DISCONNECTED, false);
            }
            break;

         case DISCONNECTING:

            out.print(END_CHAT_SESSION); 
            out.flush();

            cleanUp();
            changeStatusTS(DISCONNECTED, true);
            break;

         default: break; 
         }
    }
    }   
    }

3 个答案:

答案 0 :(得分:1)

我没有查看整个代码,但一个直接的问题似乎是你的服务器没有在循环中调用accept()。我会将您的main更改为以下内容:

public static void main(String args[]) throws IOException {
    String s;
    initGUI();
    hostServer = new ServerSocket(port);
    while (true) {
        try {
            // wait for the next client to connect
            socket = hostServer.accept();
        } catch (IOException e) {
            cleanUp();
            changeStatusTS(DISCONNECTED, false);
            break;
        }
        area.append(" " + socket + " connection\n");
        // you probably don't want this or you want this to be per client?
        changeStatusTS(CONNECTED, true);
        // start a multi thread on the accepted socket
        Multi ml = new Multi(socket);
        ml.start();
    }
}

当客户端调用连接时,服务器的accept()调用将返回,您的代码应创建一个新的Multi线程来处理该连接。然后服务器应该循环并再次调用accept(),等待下一个客户端连接。

希望这有帮助。

答案 1 :(得分:0)

带有sleep()的两个循环完全没有意义......

while (true) {
     try {
 Thread.sleep(10);
     }
     catch (InterruptedException e) {
     System.out.println(e);
     }

     while(true){

 multi ml = new multi(socket);
 ml.start();


       }
      }
   }

您应该学习一些简单开源服务器 - 客户端代码。这可能是一个好的开始: http://www.cn-java.com/download/data/book/socket_chat.pdf

另一个提示:不要开始使用处理线程进行混合表示(Swing GUI)。你会搞砸一切。首先尝试在没有任何GUI的情况下实现您的服务器。

答案 2 :(得分:0)

在没有评论您的代码(似乎有一些问题)的情况下,您应该在以下的Executor服务的javadocs中查看非常简单的套接字服务器示例:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html