0

基本上我想做的是开发一个聊天程序(介于即时通讯程序和 IRC 之间)来提高我的 Java 技能。

但是到目前为止我遇到了一个大问题:如果有多个客户端,我不知道如何正确设置流。客户端和服务器之间的 1:1 聊天很容易,但我只是不知道要做什么,所以在同一个聊天中可以有超过 1 个客户端与服务器。

这就是我得到的,但我怀疑它是否会很有帮助,因为它只是往返于服务器的 1 个永久流。

private void connect() throws IOException {
        showMessage("Trying to connect \n");
        connection = new Socket(InetAddress.getByName(serverIP),27499);
        showMessage("connected to "+connection.getInetAddress().getHostName());

    }

    private void streams() throws IOException{
        output = new ObjectOutputStream(connection.getOutputStream());
        output.flush();
        input = new ObjectInputStream(connection.getInputStream());
        showMessage("\n streams working");

    }
4

3 回答 3

0

ServerSocket(int port)我已经用and做过几次了Socket ServerSocket.accept()。这可以很简单,让它监听您希望聊天服务器客户端监听的一个端口。主线程将阻塞等待下一个客户端连接,然后将 Socket 对象返回给该特定客户端。通常您会希望将它们放在一个列表中,以便一般处理 n 个客户端。

而且,是的,您可能希望确保每个Socket线程都在不同的线程中,但这完全取决于您作为程序员。

请记住,无需重定向到服务器上的另一个端口,因为客户端使用不同的源端口,唯一的 5 元组(SrcIP、SrcPort、DstIP、DstPort、TCP/UDP/其他 IP 协议)将允许重新使用一个服务器端口。因此,为什么我们都使用 stackoverflow.com 端口 80。

快乐编码。

于 2012-08-13T01:24:33.410 回答
0

要在一个程序中读取多个流,您将不得不使用多线程。因为从流中读取是同步的,所以您需要为每个线程从一个流中读取。有关多线程的更多信息,请参阅线程上的 java 教程。

于 2012-08-13T00:18:48.677 回答
0

几个月前做了类似的事情。基本上我使用了一个单独的ServerSocketThread每个客户端服务器端。当客户端连接时,您将该端口的输入和输出流注册到固定池并阻塞,直到输入发送。然后将输入复制到其他每个客户端并发送。这是从命令行运行的基本程序: 服务器代码:

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;

    public class ChatServer {

        static int PORT_NUMBER = 2012;

        public static void main(String[] args) throws IOException {


            while (true) {
                try (ServerSocket ss = new ServerSocket(PORT_NUMBER)) {
                    System.out.println("Server waiting @" + ss.getInetAddress());
                    Socket s = ss.accept();
                    System.out.println("connection from:" + s.getInetAddress());

                    new Worker(s).start();
                }
            }

        }

        static class Worker extends Thread {

            final static  ArrayList<PrintStream> os = new ArrayList(10);
            Socket clientSocket;
            BufferedReader fromClient;

            public Worker(Socket clientSocket) throws IOException {
                this.clientSocket = clientSocket;
                PrintStream toClient=new PrintStream(new BufferedOutputStream(this.clientSocket.getOutputStream()));
                toClient.println("connected to server");
                os.add(toClient);
                fromClient = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

            }
            @Override
            public void run() {

                while (true) {
                    try {
                        String message = fromClient.readLine();
                        synchronized (os) {


                            for (PrintStream toClient : os) {
                                toClient.println(message);
                                toClient.flush();
                            }
                        }

                    } catch (IOException ex) {
                        //user discnnected
                        try {
                            clientSocket.close();
                        } catch (IOException ex1) {

                        }
                    }

                }
            }
        }

}

客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args) throws IOException {

        final BufferedReader fromUser = new BufferedReader(new InputStreamReader(System.in));
        PrintStream toUser = System.out;
        BufferedReader fromServer;
        final PrintStream toServer;
        Socket s = null;

        System.out.println("Server IP Address?");


        String host;
        String port = "";


        host = fromUser.readLine();

        System.out.println("Server Port Number?");

        port = fromUser.readLine();

        s = new Socket(host, Integer.valueOf(port));

        int read;
        char[] buffer = new char[1024];


        fromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
        toServer = new PrintStream(s.getOutputStream());
        new Thread() {

            @Override
            public void run() {
                while (true) {
                    try {
                        toServer.println(">>>" + fromUser.readLine());

                        toServer.flush();
                    } catch (IOException ex) {
                        System.err.println(ex);
                    }
                }
            }
        }.start();
        while (true) {
            while ((read = fromServer.read(buffer)) != -1) {
                toUser.print(String.valueOf(buffer, 0, read));
            }
            toUser.flush();

        }
    }
}
于 2012-08-13T00:24:38.897 回答