• 多任务处理:一客户一线程


    一客户一线程

     在一客户一线程(thread-per-client)的服务器中,为每个连接都创建了一个新的线程来处理。服务器循环执行一些任务,在指定端口上侦听连接,反复接收客户端传入的连接请求,并为每个连接创建一个新的线程来对其进行处理。 

    TCPEchoServerThread.java实现了这种一客户一线程的服务器结构。它与迭代服务器非常相似,也是用一个循环来接收和处理客户端的请求。主要不同点在于这种服务器为每个连接创建了一个新的线程来处理,而不是直接处理。(这是可行的,因为EchoProtocol类实现 Runnable接口。)因此,当多个客户端几乎同时连接服务器时,后请求的客户端不需要等服务器对前面的客户端处理结束后才获得服务,相反,它们看起来是同时接受的服务(虽然比对单一客户端进行服务要稍微慢一些)。 

    TCPEchoServerThread.java

    0 import java.io.IOException;

    1 import java.net.ServerSocket;

    2 import java.net.Socket;

    3 import java.util.logging.Logger;

    4

    5 public class TCPEchoServerThread {

    6

    7 public static void main(String[] args) throws

    IOException {

    8

    9 if (args.length != 1) { // Test for correct # of args

    10 throw new IllegalArgumentException("Parameter(s):

    <Port>");

    11 }

    12

    13 int echoServPort = Integer.parseInt(args[0]); // Server

    port

    14

    15 // Create a server socket to accept client connection

    requests

    16 ServerSocket servSock = new

    ServerSocket(echoServPort);

    17

    18 Logger logger = Logger.getLogger("practical");

    19

    20 // Run forever, accepting and spawning a thread for each

    connection

    21 while (true) {

    22 Socket clntSock = servSock.accept(); // Block waiting

    for connection

    23 // Spawn thread to handle new connection

    24 Thread thread = new Thread(new EchoProtocol(clntSock,

    logger));

    25 thread.start();

    26 logger.info("Created and started Thread " +

    thread.getName());

    27 }

    28 /* NOT REACHED */

    29 }

    30 }

      

    TCPEchoServerThread.java 

    1.参数解析和服务器套接字/日志记录器创建:第9-18 

    2.一直反复循环,处理传入的连接请求:第21-27

    接收传入的连接请求:第22

    创建一个新的Thread实例来处理新的连接:第24

    由于EchoProtocol类实现了Runnable接口,所有我们可以将其新实例作为参数传递给Thread类的构造函数,当调用Threadstart()方法时,新线程将执行EchoProtocolrun()方法(run()方法里面调用的是handleEchoClient()方法)。

    为连接开始执行新的线程并记录日志:第25-26 

    Thread 类的getName()方法返回一个包含新线程名字的String实例。

    相关下载:

    Java_TCPIP_Socket编程(doc)

    http://download.csdn.net/detail/undoner/4940239

     

    文献来源:

    UNDONER(小杰博客) :http://blog.csdn.net/undoner

    LSOFT.CN(琅软中国) :http://www.lsoft.cn

  • 相关阅读:
    JUnit5依赖注入与测试接口
    Python如何设计面向对象的类(下)
    JUnit5参数化测试的几种方式
    JUnit5的条件测试、嵌套测试、重复测试
    熬夜肝了一份 C++/Linux 开发学习路线
    适合普通大学生的 Java 后端开发学习路线
    二本,拿腾讯,阿里 offer 了
    适合普通大学生的前端学习路线
    41道计算机网络高频面试题(附带答案)
    在Rancher中修改K8S服务参数的万金油法则
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301070.html
Copyright © 2020-2023  润新知