Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让两个客户互相聊天?_Java_Networking - Fatal编程技术网

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

Java 如何让两个客户互相聊天?,java,networking,Java,Networking,这不是我的家庭作业(我的家庭作业只是与客户机和服务器进行聊天,尤其是在您的帮助下[:-)] 但是我想让两个客户互相聊天,我不知道当我收到第一个客户的短信时,我如何才能将该短信发送给另一个客户。你能帮我吗?谢谢 public class MainServer { static Socket client = null; static ServerSocket server = null; public static void main(String[] args) { System

这不是我的家庭作业(我的家庭作业只是与客户机和服务器进行聊天,尤其是在您的帮助下[:-)] 但是我想让两个客户互相聊天,我不知道当我收到第一个客户的短信时,我如何才能将该短信发送给另一个客户。你能帮我吗?谢谢

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);
    }
}}
看一看

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

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

在服务器上,您可以保留一组当前连接到服务器的所有客户端。服务器应该侦听消息(可以使用,而客户端连接正常)。每次服务器接收到消息时,它都会将该消息发送回集合中的所有客户端,并且客户端会显示该消息


编辑:这适用于客户机-服务器系统,其中客户机连接到中央服务器,而不是直接彼此连接。如果你想直接使用客户端到客户端,其中一个只需充当服务器,你需要在两者中都实现一个聊天用户界面。

除非你想使用非常复杂的P2P发现协议,否则你必须有一个服务器来充当中介

为了建立直接的客户端到客户端连接,客户端需要知道彼此的IP地址。要做到这一点,每个客户机将首先连接并向中央服务器“注册”

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


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

基本上,有两种方法:

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

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

    剩下的事情很简单:客户端可以发送一条新的聊天信息,服务器将接收并发送给所有连接的客户端


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

    这里有一个非常简单的100行GUI。

    因此不需要设置服务器套接字将文本发送到哪个客户端?我的意思是客户端a将文本发送到服务器,服务器应将文本发送到客户端B,服务器应该知道哪个客户端。我要说的是你之前关于让客户端与服务器对话的问题。。。看来你的家庭作业遇到了麻烦。试着一步一步地做。1) 客户端向服务器发送消息(按下客户端按钮)2)服务器向客户端发送消息(将其作为发送内容的客户端的回显进行测试…在处理消息客户端->服务器的代码中,保存行并将其重新发送给客户端)3)当1和2起作用时,然后尝试在两个不同的客户端之间发送。假定每个客户端都通过套接字连接到服务器,这样服务器中就可以有一个映射,将名称或任何内容映射到相应的套接字。如果您从客户端向服务器发送消息,请定义格式(例如:target\u client(\n)message(\n),这是一个简单的开始)@Johanna:请在编写/编辑帖子时开始查看预览。单行换行无效。这就是为什么你的消息显示时没有任何格式…@helios:我明白你的意思,你能在这个服务器代码上做些什么让我更容易理解吗?谢谢-可能会有帮助Bonjour使用jmdns非常简单。@Thorbjørn-我以前没有用Bonjour做过任何事情,但是,如果你认为这对他所做的事情有意义的话,你应该把它作为一个回答。