Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 转发传入TCP“;“命令”;去参加一个活动?_Java_Sockets - Fatal编程技术网

Java 转发传入TCP“;“命令”;去参加一个活动?

Java 转发传入TCP“;“命令”;去参加一个活动?,java,sockets,Java,Sockets,在Java中,如何设置一个套接字侦听器来侦听表示命令的一系列字节的套接字,并在接收时调用解析传入数据并调用相应命令的方法 澄清: 我的问题不是处理命令(也可能是错误代码或对来自服务器的命令的响应),而是创建套接字并侦听它 更多澄清: 我要做的是模仿下面一行.Net(C#)代码: 其中: _流是从套接字创建的网络流 _数据是长度为9的字节数组 this.StreamHandler是一个委托(函数指针),在读取数据时执行 我正在将一个库从C#重写为Java,我目前正在编写的组件通过TCPIP将命

在Java中,如何设置一个套接字侦听器来侦听表示命令的一系列字节的套接字,并在接收时调用解析传入数据并调用相应命令的方法

澄清:

我的问题不是处理命令(也可能是错误代码或对来自服务器的命令的响应),而是创建套接字并侦听它

更多澄清:

我要做的是模仿下面一行.Net(C#)代码:

其中:

  • _流是从套接字创建的网络流
  • _数据是长度为9的字节数组
  • this.StreamHandler是一个委托(函数指针),在读取数据时执行
我正在将一个库从C#重写为Java,我目前正在编写的组件通过TCPIP将命令传递给服务器,但还必须能够将事件/响应冒泡到它上面的层

在C#中,这似乎是微不足道的,而在Java中,它看起来越来越不重要。

我会的

  • 将每个命令放入自己的
    ,其中每个类实现一个特定的
    接口
    (例如
    命令

  • 创建一个
    映射
    ,其中包含从每个命令字符串到实现该命令的类实例的查找表


  • 使用一个小的main方法来设置套接字并侦听传入的连接。将每个连接传递给工作对象(可能在其自己的线程中)

    worker对象应该有两个API:服务器和客户端。客户端API获取连接并从中读取数据,服务器API获取连接并向其中写入数据

    我喜欢将这两个类放在一个类中,因为这样可以更简单地保持这两个类的同步。使用助手类对数据进行编码/解码以进行传输,这样您就可以单点决定如何传输整数、命令、选项等


    如果您想更进一步,请定义一个命令类并编写代码将其序列化到套接字连接并从中读取。这样,工作对象只需声明它们处理的命令类,服务器/客户端API就变得更加简单(以命令类为代价)。

    TCP连接为您提供了一对一。您可以在专用线程上连续轮询
    InputStream
    ,以获取下一个命令(及其输入)。可能有助于将字节解释为字符、整数、长字符等。您还可以使用传递对象。

    这应该会有所帮助。
    任何幼稚的方法都很可能无法很好地扩展


    考虑在合适的小型web服务器上使用REST方法。Jetty通常是一个不错的选择。

    要以非常简单的方式创建侦听套接字:

        mServerSocket = new ServerSocket(port);
    
        listening = true;
    
        while (listening) {
    
          // This call blocks until a connection is made
          Socket socket = serverSocket.accept();
    
          OutputStream out = socket.getOutputStream();
          InputStream in = socket.getInputStream();
    
          // Here you do your magic, reading and writing what you need from the streams
          // You would set listening to true if you have some command to close the server
          // remotely
    
          out.close();
          in.close();
          socket.close();
       }
    
    通常,将输入流的处理委托给其他线程是一个好主意,这样您就可以回答下一个请求。否则,您将连续回答所有请求

    您还需要为输入和输出流上的字节定义某种协议,但从您的问题来看,您似乎已经有了一种协议。

    :您请求的特定部分是“Magic goes here”一节中的部分。有很多种方法可以做到,但有一种方法是:

    final InputStream in = socket.getInputStream();
    // This creates a new thread to service the request.
    new Thread(new Runnable(){
      public void run(){
        byte[] retrievedData= new byte[ITEM_LENGTH];
        in.read(retrievedData, 0, ITEM_LENGTH);
        in.close();
    
        // Here call your delegate or something to process the data
        callSomethingWithTheData(retrievedData);
      }
    }).start();
    

    您可以创建一个枚举,每个命令有一个成员

    interface Comamnd {
        // whatever you expect all command to know to perform their function
        void perform(Context context);
    }
    
    enum Commands implements Command{
       ACTIONONE() {
            void perform(Context context) {
                 System.out.println("Action One");
            }
       },
       ACTIONTWO() {
            void perform(Context context) {
                 System.out.println("Action Two");
            }
       }
    }
    
    // initialise
    DataInputStream in = new DataInputStream(socket.getInputStream());
    
    // in a loop
    byte[] retrievedData= new byte[ITEM_LENGTH];
    in.readFully(retrievedData);
    String command = new String(retrievedData, 0);
    Commands.valueOf(command).perform(context);
    

    他谈到了字节序列——表明该协议已经存在,并且不是基于Java序列化的!我认为这是一个接近答案,因为我将得到感谢。
    interface Comamnd {
        // whatever you expect all command to know to perform their function
        void perform(Context context);
    }
    
    enum Commands implements Command{
       ACTIONONE() {
            void perform(Context context) {
                 System.out.println("Action One");
            }
       },
       ACTIONTWO() {
            void perform(Context context) {
                 System.out.println("Action Two");
            }
       }
    }
    
    // initialise
    DataInputStream in = new DataInputStream(socket.getInputStream());
    
    // in a loop
    byte[] retrievedData= new byte[ITEM_LENGTH];
    in.readFully(retrievedData);
    String command = new String(retrievedData, 0);
    Commands.valueOf(command).perform(context);