首页 > 代码库 > [Java聊天室服务器]实战之二 监听类

[Java聊天室服务器]实战之二 监听类

前言

学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境微笑:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比如最近在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)


项目源码:Socket_Chat

目录

      • [Java聊天室服务器]实战之一 开篇介绍(已完成)
      • [Java聊天室服务器]实战之二 监听类(已完成)
      • [Java聊天室服务器]实战之三 接收循环(已完成)
      • [Java聊天室服务器]实战之四 线程类(未完成)
      • [Java聊天室服务器]实战之五 读写循环(服务端)(未完成)
      • [Java聊天室服务器]实战之六 去除死链接(未完成)
      • [Java聊天室服务器]实战之七 客户端类(未完成)
      • [Java聊天室服务器]实战之七 读写循环(客户端)(未完成)

正文

服务器端做什么事情?


在我们讲解监听类之前,我们先讲解服务器端。这么做有一个时间上的前提,因为运行系统时,服务器端必须在任何一个客户端连接它之前先启动。


我们的服务器端是一个单独的程序 -- 运行在自己机器上单一的Java线程。它运行支持软件仅仅是Java虚拟机。而且它不需要Web 服务器或者应用服务器,尽管Web 服务器或者应用服务器被经常用作客户端的服务器。


更多高级的服务器系统经常在大型架构中嵌入一些服务端代码。这个架构可能提供负载均衡,处理大量的客户端准备专门的库,进程迁移和数据库服务功能。然而我们的例子有自己的位置。它关心的事所有关于自身的网络响应。正如我们看到的,这并不是很难。

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

监听端口

我们首先要多的是准备接受传入的连接。要做到,我们必须要监听端口。


端口可以认为是计算机的一个地址。要记住,同一时间,一台计算机可以作为Web服务器,聊天服务器,FTP服务器和其他种类的服务器。正因为如此,连接上一台服务器不仅要识别该机器地址,还有机器内部的特有服务。内部地址就是所说的端口,它用整数表示,1到65535。


许多标准的服务有专用的端口号。例如,telnet 是23,FTP是20和21,Web服务器,默认上使用的80。由于我们的聊天系统不很出名,我们使用可分配端口号中的一个。


我们用端口5000.也就是说我们的服务器在端口5000监听。当我们的客户端连接上服务端时,会识别服务器机器上的端口号5000。这样一来,客户端和服务器端就可以通信了。

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

套接字


客户端和服务器端的通信是通过叫做套接字的Java对象建立的。套接字不完全是Java特有的;该术语直接来自于IP(Internet协议)网络编程。在Java编程中,套接字对象简单封装了底层套接字,多年以来Internet程序员一直使用。用Java语言提取是非常简洁,所以Java中的套接字编程会比在C语言中桁架愉快。


最重要的事情是知道套接字对象包含两种流(尤其)。一种用于读取传入的数据,另一种是传输数据。换句话说,套接字对象有输入流和输出流。


(如果你对流不熟悉,只要理解他们是用于读取和输出数据的对象,数据通常是字节流。如果你还不知道他们,你应该看看java.io包获取更多信息)

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

监听类


现在我们开始7个组件中的第一个功能点,监听类。我们称之Server.java


接下来的章节会展示该类的必要元素:构造器和main()程序

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

构造器

服务器端的构造器需要一个参数 -- 端口号。它告诉当我们准备启动接收连接时监听什么端口。构造器代码如下所示:


// 构造函数和接收循环一体化
public Server( int port ) throws IOException {
// 我们需要做的是监听
listen( port );
}

注意 listen() 函数负责服务器端剩下的工作。我们在下一节中讲解。

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

main() 函数


我们写main() 程序可以让服务器端独立运行。事实上,一旦你有了mian()程序,可以嵌入基本的服务器代码在某些更大的场合上使用。但对于我们的目的来说,服务器一直在那里启动。main()代码如下所示:


// Main程序
// 使用方法: java Server >port<
static public void main( String args[] ) throws Exception {
// 从命令行中得到端口号
int port = Integer.parseInt( args[0] );
// 初始化服务器对象,它会自动运行并接收连接
new Server( port );
}

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

结束语

现在我们已经准备好监听,我们会在下一节中接续讲解怎么接收新的连接和用它哪些事情。

参考文献

[1]. Building  a Java chart server

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

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