• [Java聊天室server]实战之三 接收循环


    前言

    学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列尽管涉及的是socket相关的知识。但学习之前,更想和广大程序猿分享的是一种心境微笑:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。

    比方近期在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)


    原文地址:Building a Java chart server[1]

    项目源代码:Socket_Chat

    文件夹

    正文

    计划

    我们已经准备好从client接收网络连接。以下讲聊天室怎么样工作的。


    上面我们提到 Java语言提供了Socket类。它代表了程序到某处的连接,并且能够数据传输。


    可是首先我们如何获得socket呢?client。从定义上看,初始化连接server端。所以。server端的第一件事是等待传入的连接。

    我们须要Sockets连接上我们的client。


    如今是引入ServerSocket的时候。一个对象工作时简单的:监听端口,新的连接传入,创建一个Socket代表新的连接。

    —————————————————————————————————————————————————————————————————————————

    接收 Sockets

     记住你的程序可能会服务给非常多client整个互联网。并且这些client会连接你的server端,并且它们互相不联系。也就是说。无法控制它们的顺序,或者时间,当连接到达时。我们稍后会看到。多线程是一种处理连接杰出的方式,一旦这些连接都传入的时候。


    然而,我们仍然尽力处理它们到达的连接。


    socket提供了一种直接解决方式:serializes(序列化)传入的连接。让它们看起来是请求它们的时候。会一个一个的到达。


    这是它的样子。从大体上看:


    // 開始监听端口
    ServerSocket ss = new ServerSocket( port );
    // 始终循环
    while (true) {
    // 获得一个连接
    Socket newSocket = ss.accept();
    // 处理连接
    // ...
    }

    accept() 程序是关键所在。当ServerSocket被调用时,它会返回一个新的Socket对象,代表一个新传入的连接。

    在你处理连接之后,会调用accept()程序取得下一个连接。这样的方式下,不管你传入的连接多快,不管你机器上有多少处理器或网络接口,在某一时间你仅仅会得到一个连接。

    (假设此时没有不论什么连接。accept()程序会堵塞 -- 不返回不论什么东西 -- 知道有连接传入)

    —————————————————————————————————————————————————————————————————————————

    序列号传入的请求



    一般来说,处理同一时候发生的事情上, 序列化是一种有效的方式。

    然而。一个潜在的缺陷。它不能够并行。也就是说,序列化阻止我们节省时间在同一时间工作在多个事情上。上面的代码中,正在处理一个连接的时候。其它的连接就会挂起。


    可是序列化对于我们不是问题。由于每次一个连接传入的时候,我们会创建一个新的线程处理它。一旦新的线程创建。它就立即处理新的连接。我们的接收循环能够继续接收新的连接传入。

    假设创建新线程的行为足够快。连接就不会被挂起。

    —————————————————————————————————————————————————————————————————————————

    代码


    让我们一起看看代码。以下的代码就是我们上面说的:监听接口,接受新的连接,创建线程处理它们。之后仍然会有其它实用的事情要做。

    代码例如以下所看到的:


    private void listen( int port ) throws IOException {
    // 创建ServerSocket
    ss = new ServerSocket( port );
    // 告诉大家我已经准备好了
    System.out.println( "Listening on "+ss );
    // 始终接收连接
    while (true) {
    // 抓取下一个来的连接
    Socket s = ss.accept();
    // 告诉大家我们得到它了
    System.out.println( "Connection from "+s );
    // 为了写出数据给其它方面,创建一个DataOutputStream
    DataOutputStream dout = new DataOutputStream( s.getOutputStream() );
    // 保存该流,这样我们就不须要又一次创建它
    outputStreams.put( s, dout );
    // 为该连接创建一个新线程。之后忘记它
    new ServerThread( this, s );
    }
    }


    —————————————————————————————————————————————————————————————————————————

    结束语

    代码清单最后一行创建一个线程处理新的连接。这个线程是一个叫ServerThread的对象,它是下一节的主题。

    參考文献

    [1]. Building  a Java chart server

    [2]. Java sockets 101以及中文系列 JAVA套接字(Socket)101

    [3]. Java socket通信基本原理介绍

  • 相关阅读:
    【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)
    全球疫情爬取及展示
    两个命令配置云服务器web开发环境
    云服务器的两类系统特点整理介绍
    团队介绍和项目简介
    Navicat连接阿里云服务器上MySQL数据库
    Android_bilibili式评论及回复的简单实现
    人月神话阅读笔记02
    每日进度博客_2
    每日进度博客_1
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10899744.html
  • Copyright © 2020-2023  润新知