java - 客户端Socket作为监听者?

标签 java sockets groovy server client

我需要连接到服务器的所有客户端都成为套接字监听器。服务器将尝试连接到特定客户端并通过套接字消息指示其执行各种任务。所以我的问题是,我的Java客户端可以作为ServerSocket并监听服务器请求吗?客户端计算机上加载的网页是否也可以知道客户端的 IP 地址来发送消息。我们的服务器上运行一个应用程序,该应用程序连接了许多客户端,当按下客户端网页上的按钮时,它将尝试与该客户端连接并向其发送消息。大多数情况下,服务器都是监听者,但在我们的例子中,我们需要与客户端相反的监听者等待服务器请求。但是服务器需要知道客户端 IP 地址是什么才能建立连接,因为我们的客户端是通过 DHCP 连接的。

顺便说一句, 我们所有的客户基本上都在我们的服务器上运行网页,每个客户都有自己的电脑。我需要做的是控制每台客户端计算机上的 USB 设备。我可以控制网站软件,因此我的目标是使用套接字来执行此操作,因为远程控制客户端外部硬件非常困难。因此,我要做的是编写一个 Java 应用程序,它在客户端计算机上运行,​​充当监听器,当有人按下网页上的按钮时,服务器将尝试连接到客户端计算机并向其发送消息。我只是不确定如何从服务器端处理这个问题,所以它也知道它正在谈论哪个客户端,因为我不想将消息广播给所有客户端,而只是按下按钮的那个客户端,请记住每个客户端都通过 DHCP 寻址连接,因此我无法对主机 ID 进行硬编码。我可以将 java/groovy 或 ajax 脚本附加到服务器端的按钮事件,但我不确定如何在服务器上设置套接字协议(protocol)来实现此操作。

这是我可以在客户端/服务器端使用的套接字连接示例,但我需要知道客户端 DHCP IP 地址才能使其正常工作。

服务器端请求客户端任务

public void requestSocket() 
{ 
 Socket socket = null;
 private BufferedReader in = null;
 private PrintWriter out = null;

//Create socket connection for server
    String serverAddress = "localhost"; // Needs to be the client DHCP IP address.
    try
    {
        socket = new Socket(serverAddress, 4444);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    catch (UnknownHostException e)
    {
        System.out.println("Unknown host: " + serverAddress);
        System.exit(1);
    }
    catch  (IOException e)
    {
        System.out.println(e);
        System.out.println("No I/O");
        System.exit(1);
    }
}

充当服务器的客户端监听器

public void listenSocket()
{ 
    int portNumber = 4444;
    ServerSocket server = null;
    Socket client = null;
    BufferedReader in = null;
    PrintWriter out = null;

    try
    {
          client = new ServerSocket(portNumber);
    }
    catch (IOException e)
    {
        System.out.println("Could not listen on port " + portNumber);
        System.exit(-1);
    }

    try
    {
          server = client.accept();
    }
    catch (IOException e)
    {
        System.out.println("Accept failed :" + portNumber);
        System.exit(-1);
    }

    try
    {
        in = new BufferedReader(new InputStreamReader(server.getInputStream()));
        out = new PrintWriter(server.getOutputStream(), true);
    } catch (IOException e) {
        System.out.println("Read failed");
        System.exit(-1);
    }

    while(true)
    {
        try
        {
            line = in.readLine();
            //Send data back to client
            out.println(line);
        }
        catch (IOException e)
        {
            System.out.println("Read failed");
            System.exit(-1);
        }
    }
 }

谁能帮忙回答一下这些问题吗?

最佳答案

首先:您的客户是什么? Java 客户端还是浏览器中的网页?

第二:如果是JavaClient,则只能使用其中的ServerSocket来监听服务器将告诉的内容,并且服务器必须知道每个客户端的IP和端 Eloquent 能做到这一点。

第三:对于Java客户端来说,实际上JMS with Topic就是用于此类任务的。服务器发布消息,而客户端则监听消息并根据需要执行操作。

及四: 如果它是一个网页,则只有一种方法 - 从 JavaScript(或自动刷新机制)浏览器可以定期(通过计时器)向服务器询问新消息。对于 HTML,服务器无法在客户端浏览器上发起任何操作。 它始终是请求-响应。

更新: 尝试这样的事情:

<html>
<head>
    <title>Test Loop Back</title>
</head>
<body>
    <form action="http://localhost:4444" id=in_form>
    <table>
        <tr>
            <td>
                <label>IN_MSG:</label>
            </td>
            <td>
                <input type="text" name="IN_MSG" id="IN_MSG"/>
            </td>
        </tr>
    </table>
    <button type="submit" formmethod="post">Post Something</button>
   </form>  
  </body>
</html>

看看你在后台 Java 监听端口 4444 时得到了什么。也许这就足够了?您可以将您可能需要的任何内容作为单独的输入字段传递,并且它们可以隐藏,并且整个表单可以不可见......

如果您需要从服务器为后台java准备一些数据,请考虑图片上的方式,以避免从服务器到后台java的通信。 enter image description here

要点是避免从服务器到后台java的直接通信。所有内容都通过浏览器进行,因此无需担心 IP、端口、代理、安全性等问题。浏览器和网页上的 javascript 会照顾所有...

关于java - 客户端Socket作为监听者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40921559/

相关文章:

java - 处理字符串超出范围异常

java - 对于 Spring boot 中的 GET 请求,如何在单个 JSON 响应中发送 Header 中的一些特定信息和 Body 中的一些信息?

c++ - C Socket 和 Omnet++ 之间的方法名称冲突

groovy - 鸭子类型(duck typing)与静态类型相比有哪些优点?

groovy - 使用 groovy 在 Intellij 中的标签后缩进/空格布局

java - ProblemWithTheJar .jar - 图像不显示

java - 为什么我的maven模块在项目中找不到另一个模块?

javascript - 将套接字连接到特定路径

objective-c - 在 iOS 中针对不同的应用程序状态使用套接字的正确方法是什么?

javascript - Groovy:在静态作用域中找到表观变量 'classVar',但未引用局部变量、静态字段或类