客户端套接字作为监听器?

时间:2016-12-01 22:28:33

标签: java sockets groovy server client

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

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

以下是我可以在客户端/服务器端使用的套接字连接的示例,但我需要知道客户端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);
        }
    }
 }

有人可以帮忙回答这些问题吗?

1 个答案:

答案 0 :(得分:1)

第一:你的客户是什么?浏览器中的Java客户端或网页?

第二:如果它是JavaClient,它只能是ServerSocket来监听你的服务器会告诉你什么,服务器必须知道每个客户端的IP和端口才能做到这一点。

第三:对于Java客户端实际上,带有Topic的JMS可用于执行此类任务。服务器发布消息,而客户端则监听并处理所需的消息。

和Forth: 如果它是一个网页,只有一种方式 - 从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上的监听。Mayb它就够了吗?你可以将你可能需要的任何东西作为单独的输入字段传递,它们可以隐藏,整个形式也可以隐藏......

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

重点是避免从服务器到后台java的直接通信。所有通过浏览器,所以没有IP,端口,代理,安全等痛苦。网页上的浏览器和JavaScript负责所有...