繁体   English   中英

串行服务客户端的Java套接字服务器

[英]Java Socket Server that services clients serially

有没有一种方法可以实现串行服务客户端的套接字服务器。
通常,实践是将连接的客户端分派到服务请求和响应的新线程,但是在服务器端每个客户端总计一个线程。

我不想这样做,因为以后我想将该应用程序移植到Java ME,这可能会限制某个时间点运行的并发线程数。

我想知道如何解决这个问题?

当然,只是不要触发后台线程来处理客户端。

编辑

似乎您真正想要的是使大量客户端能够连接,而不创建线程负载。 由于似乎不支持NIO,因此如何使用两个线程:

  • 一个线程循环接受连接,将连接的Socket传递给第二个线程,该线程仅将其添加到连接的套接字列表中(这需要同步)
  • 第二个线程循环遍历其内部活动连接列表,并依次对每个线程进行“一些工作”。

以较小的值调用socket.setSoTimeout()可以防止第二个线程在一个连接上等待太长时间。

通常,服务器处理如下所示:

    ServerSocket s;
    Socket newSocket;
    while (newSocket = s.accept()) {
        new SocketHandlingThread(newSocket).start();
    }

SocketHandlingThread()是您创建的一个类,用于执行套接字会话的服务器端应做的任何事情。

有两种基本方法可以执行您要执行的操作(即同步处理套接字)。 首先是简单地加入处理程序线程,然后再返回到accept(),就像这样

    while (newSocket = s.accept()) {
        SocketHandlingThread thread = new SocketHandlingThread(newSocket);
        thread.start();
        thread.join();
    }

如下面的注释中所指出的,您可以像这样调用线程的run方法来避免加入

 thread.run(); 

代替开始和加入电话。

另一种方法是获取SocketHandlingThread的run方法中的任何代码,然后将其直接移动到循环中。

您可以使用非阻塞套接字。 如果这样做,则不需要为每个客户端使用线程。 Java已经通过NIO支持了一段时间。 我不确定Java ME是否支持此功能。 如今,Java ME不断发展壮大,以至于它包含了JSE的许多功能。 在Java ME环境中需要服务许多客户端连接的服务器端功能可能有点不寻常。

在您的情况下,流量是否仍未通过服务器路由? 如果是这样,则没有理由让J2ME环境无法通过与服务器的单个套接字连接来接收来自许多其他客户端或对等方的消息(如果要对其进行调用)。

有一个很好的服务器端套接字处理示例,包括可在此处找到的缓冲池。

但是请考虑一下,您实际上可能并不需要池-我从一台服务器为800个并发客户端提供服务,每个客户端都有自己的专用套接字线程,这没有问题。

您可以在接受套接字上设置SO_TIMEOUT。 这将强制接受调用是非阻塞的。 这样,您可以等待一点时间,然后提供以前接受的连接之一,然后再接受新的连接,依此类推。 该代码隐约看起来像这样:

do(
  try{
    socket.setSoTimeout(200);
    Socket connected = socket.accept()
  } catch (SocketTimeoutException e){//just ignore}
  //handle your other threads/connections here
} while (!shutDown)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM