
4.2.1 服务器套接字
一旦启动了服务器程序,它便会等待某个客户端连接到它的端口。在我们的示例程序中,我们选择端口号8189,因为所有标准服务都不使用这个端口。ServerSocket类用于建立套接字。在我们的示例中,下面这行命令:

用于建立一个负责监控端口8189的服务器。以下命令:

用于告诉程序不停地等待,直到有客户端连接到这个端口。一旦有人通过网络发送了正确的连接请求,并以此连接到了端口上,该方法就会返回一个表示连接已经建立的Socket对象。你可以使用这个对象来得到输入流和输出流,代码如下:

服务器发送给服务器输出流的所有信息都会成为客户端程序的输入,同时来自客户端程序的所有输出都会被包含在服务器输入流中。
因为在本章的所有示例程序中,我们都要通过套接字来发送文本,所以我们将流转换成扫描器和写入器。

以下代码将给客户端发送一条问候信息:

当使用telnet通过端口8189连接到这个服务器程序时,将会在终端屏幕上看到上述问候信息。
在这个简单的服务器程序中,它仅仅只是读取客户端输入,每次读取一行,并回送这一行。这表明程序接收到了客户端的输入。当然,实际应用中的服务器都会对输入进行计算并返回处理结果。

在代码的最后,我们关闭了连接进来的套接字。

这就是整个示例代码的大致情况。每一个服务器程序,比如一个HTTP Web服务器,都会不间断地执行下面这个循环:
1)通过输入数据流从客户端接收一个命令(“get me this information”)。
2)解码这个客户端命令。
3)收集客户端所请求的信息。
4)通过输出数据流发送信息给客户端。
程序清单4-3给出了这个程序的完整代码。
程序清单4-3 server/EchoServer.java


想要试一下这个例子,就请编译并运行这个程序。然后使用telnet连接到服务器localhost(或IP地址127.0.0.1)和端口8189。
如果你直接连接到因特网上,那么世界上任何人都可以访问到你的回送服务器,只要他们知道你的IP地址和端口号。
当你连接到该端口时,将看到如图4-4所示的信息:


图4-4 访问一个回送服务器
可以随意键入一条信息,然后观察屏幕上的回送信息。输入BYE(全为大写字母)可以断开连接,同时,服务器程序也会终止运行。
java.net.ServerSocket 1.0
·ServerSocket(int port)
创建一个监听端口的服务器套接字。
·Socket accept()
等待连接。该方法阻塞(即,使之空闲)当前线程直到建立连接为止。该方法返回一个Socket对象,程序可以通过这个对象与连接中的客户端进行通信。
·void close()
关闭服务器套接字。