《互联网程序设计(Java)》——课程笔记6:多用户服务器程序设计

学会服务器支持多用户并发访问的程序设计技术。

1.多用户服务器是指服务器能同时支持多个用户并发访问服务器所提供的服务资源,如聊天服务、文件传输等。

2.TCPServer.java

服务器程序是单用户版本,每次只能和一个用户对话。(请仔细阅读TCPServer.java程序,了解其中原理,找出关键语句),只有前一个用户退出后,后面的用户才能完成服务器连接。

演示过程:

(1) 启动你的TCPServer.java程序(程序详见之前附录代码);

(2) 启动你的TCPClientThreadJFrame.java程序,完成一次对话,并保持在线;

(3) 再启动你的TCPClientThreadJFrame.java程序2次,并完成连接,尝试对话,发现无返回信息(服务器和客户端各阻塞在哪条语句?);

(4) 退出第一次启动的TCPClientThreadJFrame.java程序,发现第二次启动的客户端有返回信息了,说明在一个客户退出后,第二个客户才连接成功。

 

原因:服务器的主进程一次只能处理一个客户,但所有已连接的客户等候在监听队列中。

3.多用户服务器程序设计

    TCPServer.java程序能同时支持多个用户并发连接(TCP三次握手),但不能同时服务多用户对话。

    程序设计第一步:解决服务多用户对话问题

用一个线程专门负责和一个客户对话,即一个客户请求成功后,创建一个线程来专门负责该客户,主进程只负责监听客户请求和接受连接请求。

public class TCPThreadServer {
    private int port = 8008;
    private ServerSocket serverSocket;
    private ExecutorService executorService; //线程池
    private final int POOL_SIZE = 100; //单个CPU时线程池中工作线程的数目
    
    public TCPThreadServer() throws IOException
    {
        serverSocket = new ServerSocket(port); //打开服务器端口
        
        //创建线程池,Runtime的Availableprocessor()方法返回当前系统的CPU的数目
        //系统中CPU越多,线程池中工作线程的数目也应该越多
        executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
        
        System.out.println("多用户服务器启动");
    }
    
    public void service()
    {
        while(true)
        {
            Socket socket = null;
            try
            {
                socket = serverSocket.accept(); //监听客户请求,阻塞语句
                
                //将socket放入Members列表中
                //接受一个客户请求,从线程池中拿出一个线程专门处理该客户
                executorService.execute(new Handler(socket));
                
            }catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String args[]) throws IOException
    {
        new TCPThreadServer().service();
    }
    
    
}

//定义内部类,实现线程接口
class Handler implements Runnable
{
    private Socket socket;

    public Handler(Socket socket)
    {
        this.socket = socket;
    }
    private PrintWriter getWriter(Socket socket) throws IOException
    {
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(new OutputStreamWriter(socketOut,"GB2312"),true);
    }
    private BufferedReader getReader(Socket socket) throws IOException
    {
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn,"GB2312"));
    }
    

 

重写Runnable:

@Override
    public void run() {
       try
       {
           System.out.println("New connection accepted " + socket.getInetAddress().getHostAddress() + ":"+socket.getPort());
           
           BufferedReader br = getReader(socket);//字节流封装为字符流
           PrintWriter pw = getWriter(socket); //字节流封装为字符流
           
           String msg = null;
           while((msg = br.readLine())!= null)
           {
               pw.println("From ThreadServer: " + msg); //send to client
               
               if(msg.contains("bye".substring(0, 2)))
               {
                   System.out.println(socket.getInetAddress() + " : " + "Exit");
                   break;
               }
           }
                   
       }catch(Exception e)
       {
           e.printStackTrace();
       }finally
       {
           try
           {
               if(socket!=null)
               {
                   socket.close();
               }
           }catch(IOException e)
           {
               e.printStackTrace();
           }
       }
    }

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java语言程序设计是一门广泛应用于软件开发的高级编程语言。它具有可移植性强、语法简洁明了、面向对象和面向过程相结合的特点,因此被广泛应用于开发各种类型的软件如网站、桌面应用程序、移动应用程序等。 首先,Java语言具有跨平台性。Java程序编译后生成的字节码可以在不同的操作系统上运行,无需对源代码进行修改。这使得Java成为开发跨平台应用的首选语言。 其次,Java具有丰富的库和工具。Java开发提供了大量的库和工具,如Swing和JavaFX用于构建用户界面,JDBC用于数据库操作,Spring和Hibernate用于应用开发等。这些库和工具能够极大地提高开发效率,并增强程序的功能和性能。 另外,Java是一门面向对象的语言。面向对象编程的特点是将程序抽象成对象,通过对象之间的交互来实现功能。Java语言支持类、封装、继承和多态等面向对象的特性,使得程序更易于理解、扩展和维护。 此外,Java还具有丰富的安全性和可靠性特点。Java提供了内置的安全性机制,如自动内存管理和异常处理等,减少了内存泄漏和程序崩溃的概率。此外,Java还支持多线程编程,能够实现并发执行,提高程序的效率。 综上所述,Java语言程序设计具有跨平台性、丰富的库和工具、面向对象编程和安全可靠性等特点。它是一门值得学习和应用的编程语言,为开发者提供了无限的发展潜力和应用空间。无论是初学者还是有经验的开发者,都能够通过学习Java语言来构建高质量的软件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值