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():返回输入流是否被关闭。