如何使用TCP连接同时接受多个客户端?

时间:2014-05-21 23:52:05

标签: java sockets tcp

我有一台服务器通过Socket与客户端创建TCP连接。由于我的应用程序应该是聊天,我需要服务器使用相同的端口同时接受多个客户端,以便他们可以实时通信。 我的服务器端是Java应用程序,我的客户端是Android应用程序。

可以这样做吗?如果是,我该怎么办?

这是我的服务器代码:

public class Server {

public static void main(String[] args){

    ServerClass server = new ServerClass();
    server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    server.inizia();
     }
}




public class ServerClass extends JFrame {

JTextArea testoarea;
String messaggio;
ObjectOutputStream output;
DataInputStream input;
ServerSocket server;
Socket connessione;

public ServerClass(){
    super("Server in Ascolto");
    testoarea = new JTextArea();
    add(new JScrollPane(testoarea));
    setSize(600, 700);
    setVisible(true);


}
public void inizia()
{
    try {

        server = new ServerSocket(7100);
        while(true)
        {
            try {

                iniziaConnessione();
                sistemaCanali();
                chatta();
                //closeCrap();

            } catch (EOFException eofException) {
                // TODO: handle exception
                showMessage("Il Server ha perso la connessione..\n");
            }
        }
    } catch (IOException ioException) {
        // TODO: handle exception
        ioException.printStackTrace();
    }


}

private void iniziaConnessione() throws IOException {
    // TODO Auto-generated method stub
    showMessage("Aspetto qualcuno per connettermi.... \n");
    connessione = server.accept();
    showMessage("Mi sono connesso a qalcuno... \n");

}

private void sistemaCanali() throws IOException {
    // TODO Auto-generated method stub
    output = new ObjectOutputStream(connessione.getOutputStream());
    output.flush();
    input = new DataInputStream(connessione.getInputStream());
    showMessage("I canali sono apposto...  \n");
}


private void chatta() throws IOException {
    // TODO Auto-generated method stub

    String messaggio = "Sei connesso e pronto a chattare... \n";
    showMessage(messaggio);
    messaggio = (String) input.readUTF();
    showMessage("Client - " + messaggio);
    sendData(messaggio);


}
private void sendData(String messaggio2) {
    // TODO Auto-generated method stub
    try {
        output.writeUTF(messaggio2);
        output.flush();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        showMessage("ERRORE: non riesco a inviare il messaggio...  \n");
    }
}
private void showMessage(final String text) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {
                        testoarea.append(text);
                    }
                }
            );
} 


}

1 个答案:

答案 0 :(得分:2)

一旦您接受了客户端,请使用另一个线程来管理它的通信。不要在运行accept()循环的同一个线程中管理您的通信。然后,您的客户端线程可以根据需要在客户端之间来回传递数据,而不会干扰服务器同时接受新客户端的能力。