在现实生活中,有些重要的服务机构的电话是固定的,这有助于人们方便地记住电话和获得服务,比如众所周知的电话110、120和119分别是报警、急救和火警电话。同样,在网络上有些通用的服务有着固定的端口,表3对常见的服务以及相应的协议和端口做了介绍。
表3 应用层的一些通用服务使用的端口
服务 |
端口 |
协议 |
文件传输服务 |
21 |
FTP |
远程登入服务 |
23 |
TELNET |
传输邮件服务 |
25 |
SMTP |
用于万维网(WWW)的超文本传输服务 |
80 |
HTTP |
访问远程服务器上的邮件服务 |
110 |
POP3 |
互联网消息存取服务 |
143 |
IMAP4 |
安全的超文本传输服务 |
443 |
HTTPS |
安全的远程登入服务 |
992 |
TELNETS |
安全的互联网消息存取服务 |
993 |
IMAPS |
五、用Java编写客户/服务器程序
本文介绍的Java网络程序都建立在TCP/IP协议基础上,致力于实现应用层。传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传输细节,应用层的程序通过Socket来建立与远程主机的连接以及进行数据传输。
站在应用层的角度,两个进程之间的一次通信过程从建立连接开始,接着交换数据,到断开连接结束。套接字可看做是通信线路两端的收发器,进程通过套接字来收发数据,如图17所示。

图17 套接字可看过是通信连接两端的收发器
在Java中,有三种套接字类:java.net.Socket、java.net.ServerSocket和DatagramSocket。其中Socket和ServerSocket类建立在TCP协议基础上,DatagramSocket类建立在UDP协议基础上。Java网络程序都采用客户/服务通信模式。
本节以EchoServer和EchoClient为例,介绍如何用ServerSocket和Socket来编写服务器程序和客户程序。
1.创建EchoServer
服务器程序通过一直监听端口,来接收客户程序的连接请求。在服务器程序中,需要先创建一个ServerSocket对象,在构造方法中指定监听的端口:
ServerSocket server=new ServerSocket(8000); //监听8000端口
ServerSocket的构造方法负责在操作系统中把当前进程注册为服务器进程。服务器程序接下来调用ServerSocket对象accept()方法,该方法一直监听端口,等待客户的连接请求,如果接收到一个连接请求,accept()方法就会返回一个Socket对象,这个Socket对象与客户端的Socket对象形成了一条通信线路:
Socket socket=server.accept(); //等待客户的连接请求
|