25.4 TCP程序设计基础

Java中的TCP网络程序设计是指利用Socket类编写通信程序。TCP程序设计的一个过程是:服务器的套接字等待客户机连接请求,并创建新的套接字,使其与客户机的套接字连接,而本身继续等待其他客户机的连接请求。

25.4.1 如何设计TCP的程序

下面看看几个与TCP程序设计有关的类。

1.与IP相关的InetAddress类应用

InetAddress是与IP地址相关的类。利用此类可以获取IP地址、主机地址等信息。InetAddress类的常用方法如下所示。

❑public static InetAddress getByName(String host):获取与host相对应的InetAddress对象。

❑public String getHostAddress():返回主机地址的字符串表示。

❑public String getHostName():返回主机名的字符串表示。

❑public synchronized static InetAddress getLocalHost():返回本地主机的InetAddress对象。

【实例25.1】下面分析一个实例,通过这个实例能够清楚以上几个方法的用法。


01 import java.net.*;

02 ///创建一个InetAddress类对象ip

03 ///通过getHostName方法获得主机名

04 ///通过getHostAddress方法获得主机的IP地址

05 ///通过getLocalHost().getHostAddress方法获取本机的IP地址

06 public class tcptest

07 {

08 public static void main(String[]args)

09 {

10 InetAddress ip=null;

11 try

12 {

13 ip=InetAddress.getByName("Jason");

14 System.out.println("主机名:"+ip.getHostName());

15 System.out.println("主机IP地址:"+ip.getHostAddress());

16 System.out.println("本机IP地址:"+InetAddress.getLocalHost().getHostAddress());

17 }

18 catch(Exception e)

19 {

20 System.out.println(e);

21 }

22 }

23 }


【代码说明】第13行指定机器名,这里笔者的机器名是Jason,第14~16行分别获取主机名、IP地址等。说明 读者在演示此实例时,需要在代码中将机器名更改成自己的。

【运行效果】


主机名:Jason

主机IP地址:127.0.0.1

本机IP地址:127.0.0.1


总结这个类:要使用InetAddress类的方法,就必须要获得相应的InetAddress对象,因为只有这个对象才能使用这些方法。在上面的程序中,通过主机名称来获得InetAddress对象。

2.服务器套接字应用

ServerSocket类表示服务器套接字。服务器的套接字是通过指定的端口等待连接的套接字。服务器的套接字一次只可以与一个客户机的套接字相连接,如果有多台客户机同时要求同服务器连接,那么服务器套接字会将请求的客户机的套接字存入队列中,然后,从中取一个连接一个。

队列的大小,就是服务器可同时接收的连接请求数,若大于队列长度,则多出来的那些请求套接字会被拒绝。队列的默认大小为50,即一个服务器套接字可以同时接收50个请求。

ServerSocket类的常用构造函数如下:

❑public ServerSocket(int port)

使用指定的端口创建服务器套接字。

❑public ServerSocket(int port, int backlog)

使用指定的端口创建服务器套接字。backlog用来指定队列大小。

❑public ServerSocket(int port, int backlog, InetAddress bindAddr)

使用指定的IP地址、端口号及队列大小,创建服务器套接字。

ServerSocket类的常用方法如下所示。

❑public Socket accept():等待客户机请求,若连接,则创建一套接字,并且将其返回。

❑public void close():关闭服务器的套接字。

❑public boolean isClosed():若服务器套接字成功关闭,则返回true。否则返回false。

❑public InetAddress getInetAddress():返回与服务器套接字结合的IP地址。

❑public int getLocalPort():获取服务器套接字等待的端口号。

❑public void bind(SocketAddress endpoint):绑定于endpoint相对应的套接字地址(IP地址+端口号)。

❑public boolean isBound():若服务器套接字已经与某个套接字地址绑定起来,则返回true;否则返回false。

3.套接字实现

Socket类表示套接字。使用Socket时,需要指定待连接服务器的IP地址及端口号。客户机创建了Socket对象后,将立即向指定的IP地址及端口发起请求且尝试连接。于是,服务器套接字就会创建新的套接字对象,使其与客户端套接字连接起来。一旦服务器套接字与客户端套接字成功连接后,就可以获取套接字的输入/输出流,彼此进行数据交换。

Socket类的构造器如下所示。

❑public Socket(String host, int port)

创建连接指定的服务器(主机与端口)的套接字。

❑public Socket(InetAddress address, int port)

创建连接指定服务器的套接字。address表示IP地址对象,port是端口号。

Socket类的常用方法如下所示。

❑public InetAddress getInetAddress():获取被连接的服务器的地址。

❑public int getPort():获取端口号。

❑public InetAddress getLocalAddress():获取本地地址。

❑public int getLocalPort():获取本地端口号。

❑public Inputstream getInputStream():获取套接字的输入流。

❑public OutputStream getOutputStream():获取套接字的输出流。

❑public void bind(SocketAddress bindpoint):绑定指定的IP地址和端口号。

❑public boolean isBound():获取绑定状态。

❑public synchorized void close():关闭套接字。

❑public boolean isClosed():获取套接字是否关闭。

❑public boolean isConnected():套接字被连接,则返回true。否则返回false。

❑public void shutdownInput():关闭输入流。

❑public boolean isInputShutdown():返回输入流是否被关闭。