- Java核心技术·卷Ⅱ:高级特性(原书第10版)
- (美)凯S.霍斯特曼
- 929字
- 2024-12-20 22:36:09
4.2.1 服务器套接字
一旦启动了服务器程序,它便会等待某个客户端连接到它的端口。在我们的示例程序中,我们选择端口号8189,因为所有标准服务都不使用这个端口。ServerSocket类用于建立套接字。在我们的示例中,下面这行命令:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/198-i.jpg?sign=1739552827-WWPArQa18SugSAtA0GoPIpoGT1gMyIGK-0-a18b44dbbfd24e07db9160de7d4fee76)
用于建立一个负责监控端口8189的服务器。以下命令:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/198-2-i.jpg?sign=1739552827-qMUWX9seDdyKyfA2tVV4j64V4G14TUHo-0-01d3174db2f9ff9e0d4bf94a773c8712)
用于告诉程序不停地等待,直到有客户端连接到这个端口。一旦有人通过网络发送了正确的连接请求,并以此连接到了端口上,该方法就会返回一个表示连接已经建立的Socket对象。你可以使用这个对象来得到输入流和输出流,代码如下:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/198-3-i.jpg?sign=1739552827-K2z5RaVaQlHjrqMQLgsFTmPZploaaBvj-0-5617211c69856749d1bbb95f945cdb2b)
服务器发送给服务器输出流的所有信息都会成为客户端程序的输入,同时来自客户端程序的所有输出都会被包含在服务器输入流中。
因为在本章的所有示例程序中,我们都要通过套接字来发送文本,所以我们将流转换成扫描器和写入器。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/198-4-i.jpg?sign=1739552827-vA3JLnmGwawspnv8yIoGWONyMqF1mZ0O-0-e75ad48c26ed58613ff2a8cea9f6781b)
以下代码将给客户端发送一条问候信息:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/198-5-i.jpg?sign=1739552827-4fxye6Ls1J7vKy0GebmSCuk8GOSpR82s-0-d3603b8a85556a963140d032e2da3ebd)
当使用telnet通过端口8189连接到这个服务器程序时,将会在终端屏幕上看到上述问候信息。
在这个简单的服务器程序中,它仅仅只是读取客户端输入,每次读取一行,并回送这一行。这表明程序接收到了客户端的输入。当然,实际应用中的服务器都会对输入进行计算并返回处理结果。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/199-i.jpg?sign=1739552827-crKpU3lfzv8F5BAkmck6xSxSHlP0lpPb-0-6edc361296dcfeea097d33ca1d817f45)
在代码的最后,我们关闭了连接进来的套接字。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/199-2-i.jpg?sign=1739552827-k6GgWg26Y1SblsSiWeQ7JXOHePfRKfgS-0-78ae32c8dc1311bba565a38c48583ced)
这就是整个示例代码的大致情况。每一个服务器程序,比如一个HTTP Web服务器,都会不间断地执行下面这个循环:
1)通过输入数据流从客户端接收一个命令(“get me this information”)。
2)解码这个客户端命令。
3)收集客户端所请求的信息。
4)通过输出数据流发送信息给客户端。
程序清单4-3给出了这个程序的完整代码。
程序清单4-3 server/EchoServer.java
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/199-3-i.jpg?sign=1739552827-W6kdYmpMNf9UE70njSq4IxHmBOkWKbJz-0-269c337bb889c89b3c3e160afed77f5d)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/200-i.jpg?sign=1739552827-Dbdz5ghX60fJ21jXcDP9gikGLNbmZ0By-0-3723829723edd3aeedc0f4c769585417)
想要试一下这个例子,就请编译并运行这个程序。然后使用telnet连接到服务器localhost(或IP地址127.0.0.1)和端口8189。
如果你直接连接到因特网上,那么世界上任何人都可以访问到你的回送服务器,只要他们知道你的IP地址和端口号。
当你连接到该端口时,将看到如图4-4所示的信息:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/200-2-i.jpg?sign=1739552827-MNjqpYtFPFN9GvWthqCR1gY3XwzJOjLm-0-9aaf1a0f760b76c5e7b52e1c420fa0d3)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/4a4-i.jpg?sign=1739552827-xjy6fFSr2BWCzUfkDWiwVEcVf5sDIRIO-0-502ebcd864f2439f698fccce2673e972)
图4-4 访问一个回送服务器
可以随意键入一条信息,然后观察屏幕上的回送信息。输入BYE(全为大写字母)可以断开连接,同时,服务器程序也会终止运行。
java.net.ServerSocket 1.0
·ServerSocket(int port)
创建一个监听端口的服务器套接字。
·Socket accept()
等待连接。该方法阻塞(即,使之空闲)当前线程直到建立连接为止。该方法返回一个Socket对象,程序可以通过这个对象与连接中的客户端进行通信。
·void close()
关闭服务器套接字。