2.4 练习

1.对于TCPEchoServer.java,我们在构造函数中显式地指定了套接字的端口号。我们说过,一个套接字要进行通信,必须有一个端口号,但在TCPEchoClient.java中并没有指定端口号。这个回馈客户端中的套接字端口是如何赋值的呢?

2.打电话的时候,通常是被呼叫的人说“你好”。要实现这个机制,我们的客户端和服务器端例子需要作什么改变?

3.如果一个TCP服务器一直不调用accept()会产生什么后果?如果一个TCP客户端向一个还没有被服务器端接收的套接字发送数据,又会产生什么后果?

4.服务器总是不停地长时间运行,因此,它们必须设计为对客户端的任何行为都能提供好的服务。检查前面的服务器端示例程序(TCPEchoServer.java和UDPEchoServer.java),列出任何你能想到的能够导致服务器为其他客户端提供低效服务的客户端行为,并为修改这些问题提出建议。

5.修改TCPEchoServer.java示例程序,使其每次只读写一个字节,并在读写每个字节之间暂停1秒钟。验证TCPEchoClient.java程序需要执行多次读操作以完整接收整个回馈信息,即使该回馈信息只通过一次write()方法调用来发送。

6.修改TCPEchoServer.java示例程序,使其读写一个字节后关闭套接字。此时如果TCPEchoClient向这个服务器发送了一个多字节字符串信息,将产生什么后果?什么正在发生?(注意响应信息能被操作系统改变。)

7.修改UDPEchoServer.java示例程序,使其隔一个数据报文发送一次回馈信息。验证UDPEchoClientTimeout.java程序将方法发送数据报文,直到它收到了回馈信息或超过了指定重发次数。

8.修改UDPEchoServer.java示例程序,将ECHOMAX设置得更小(如5字节)。然后使用UDPEchoClientTimeout.java程序向其发送一个过长的回馈字符串,会发生什么?

9.通过实验验证使用DatagramPacket所能发送和接收的最大消息的长度。

10.在UDPEchoServer.java示例程序中,我们在构造函数中显式指定了本地地址和端口号,而在UDPEchoClientTimeout.java示例程序中,我们没有指定本地端口号。UDP回馈客户端的套接字将怎样设置端口号?提示:对于TCP的情况,答案则不同。