如何让两个客户互相聊天?

时间:2010-01-18 15:44:23

标签: java networking

这不是我的作业(我的作业只是与客户端和服务器聊天,它可以正常工作,特别是在您的帮助下[:-)] 但是我想让两个客户互相聊天,我不知道当我从第一个客户那里得到文本时如何将该文本发送给另一个客户。请你帮助我。谢谢。

public class MainServer {

static Socket client = null;
static ServerSocket server = null;



public static void main(String[] args) {
    System.out.println("Server is starting...");
    System.out.println("Server is listening...");

    try {
        server = new ServerSocket(5050);
    } catch (IOException ex) {
        System.out.println("Could not listen on port 5050");
        System.exit(-1);

    }
    try {
        boolean done = false;
        while (!done) {

            client = server.accept();
            System.out.println("Client Connected...");
            BufferedReader streamIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter streamOut = new PrintWriter(client.getOutputStream(),true);
            String line = streamIn.readLine();
            if (line.equalsIgnoreCase("bye")) {
                streamIn.close();
                client.close();
                server.close();
                done = true;
            } else {
                System.out.println(line);
                streamOut.println(line);
            }
        }

    } catch (IOException e) {
        System.out.println("IO Error in streams " + e);
    }
}}

6 个答案:

答案 0 :(得分:3)

就是这样,你的两个“客户”将充当客户端和服务器: 听取套接字上的传入内容并通过其他套接字发送内容。

答案 1 :(得分:2)

在服务器上,您可以保留当前连接到服务器的所有客户端的集合。服务器应该监听消息(可以使用ServerSocket执行此操作,并且客户端可以使用正常Sockets进行连接。每次服务器收到消息时,它都会将此消息发送回Set中的所有客户端,客户端将显示该消息。

编辑:这适用于客户端 - 服务器系统,客户端连接到中央服务器而不是直接相互连接。如果您想直接从客户端到客户端,其中一个只需要充当服务器,您就需要在两者中实现聊天UI。

答案 2 :(得分:2)

这是一个非常简单的~100行GUI chat program

答案 3 :(得分:0)

查看Building an Internet chat system

这解释了如何使用Java编写简单的客户端和服务器。

答案 4 :(得分:0)

除非你想进入真正复杂的P2P发现协议,否则你必须让服务器至少作为中间人。

为了建立客户端连接的直接客户端,客户端需要知道彼此的IP地址。为此,每个客户端首先连接并“注册”自己与中央服务器。

当客户想要与另一个客户端通信时,它会从服务器请求该客户端的地址,然后直接与该客户端建立连接。因此,每个客户端既充当客户端(与服务器和其他客户端建立连接)又充当服务器(接受来自其他客户端的连接)。

理论上似乎很简单,但在实践中它变得更加复杂。例如,如果要连接的客户端位于防火墙后面,该怎么办?你可能在防火墙上有一个漏洞,可以让传入的连接通过,或者你可以回退到让通信通过服务器,或者如果其中一个客户端在防火墙后面,而另一个客户端不在,则服务器可以调解相反方向的连接。

答案 5 :(得分:0)

基本上,有两种方法:

  1. 一个聊天服务器,它接收所有消息并将它们分发/转发给客户端(xmpp / jabber以这种方式工作)
  2. 一台直接连接客户端的服务器。就像在点对点网络上一样
  3. 回顾你之前的工作,我认为,第一种方法更可行。

    服务器将提供一个新客户端可以连接的端口。在客户端请求参与/使用服务器之后,服务器会在不同(可用)的端口号上生成一个带有服务器套接字的工作线程,并告诉客户端该端口号。这是该客户端与服务器的保留通信通道。

    其余的非常简单:客户端可以发送新的聊天消息,服务器会将其接收并发送给所有连接的客户端。

    如果客户端断开连接,工作线程将关闭套接字,将其返回池并终止。