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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Sockets - Fatal编程技术网

Java 基于事件的网络

Java 基于事件的网络,java,sockets,Java,Sockets,我已经设置了一个简单的服务器和客户机,其中服务器等待客户机发送内容,然后发送响应。但缺点是两者都必须监听套接字才能接收到某些内容。如果我想让它在交流中更灵活些呢?我在想一些基于事件的东西,所以每次套接字收到一些东西时,它都会调用一个方法来处理它,而不是暂停程序等待socket.nextLine() 以下是我的服务器代码: try{ ss = new ServerSocket(port); s = ss.accept(); in = new Scanner(s.getIn

我已经设置了一个简单的服务器和客户机,其中服务器等待客户机发送内容,然后发送响应。但缺点是两者都必须监听套接字才能接收到某些内容。如果我想让它在交流中更灵活些呢?我在想一些基于事件的东西,所以每次套接字收到一些东西时,它都会调用一个方法来处理它,而不是暂停程序等待socket.nextLine()

以下是我的服务器代码:

try{
    ss = new ServerSocket(port);
    s = ss.accept();

    in = new Scanner(s.getInputStream());
    out = new PrintWriter(s.getOutputStream(), true);
    while(!s.isClosed()){
        String input = in.nextLine();
        handleInput(input);
    }
} catch (Exception e){}

在handleInput()中,我向客户机发送一个响应。

如果您希望在服务器发送数据包时,客户机执行某些操作,则使用多线程

Thread t = new Thread(new Runnable() {
    public void run() {
        someMethod(in.nextLine());
    }
});
t.start();
您必须在中在封闭类中创建一个字段

这将导致您的程序执行,当它收到数据包时,它将调用
someMethod()


当然,这会带来许多与多线程相关的问题,但这确实是实现所需的唯一方法。

您可以看看SocketChannel()。我不确定它是否正是你想要的。但它们非常有效。你现在甚至在做驱动型网络——你在做任何事情之前都在等待输入。我建议您创建一个完整的单独类(threadit)来处理连接。每次你接受一个连接时,把它传递给那个类,然后启动一个线程,这样你的服务器就可以继续监听。这是一个很难在文章中提出的主题,因为你可以在架构上做很多事情。这里有一个关于使用选择器的教程,您可以检查哪些套接字已准备好读/写。