一,客户端/服务器计算
Java提供ServerSocket类来创建服务器套接字,Socket类来创建客户端套接字。Internet 上的两个程序通过使用IO流的服务器套接字和客户端套接字进行通信。
网络功能紧密地集成在Java中。Java API提供用于创建套接字的类来便于程序通过Internet通信。套接字( socket)是两台主机之间逻辑连接的端点,可以用来发送和接收数据。Java对套接字通信的处理非常类似于对输入输出操作的处理,因此,程序对套接字读写就像对文件读写一样容易。
网络程序设计通常涉及一个服务器和一个或多个客户端。客户端向服务器发送请求,而服务器响应请求。客户端从尝试建立与服务器的连接开始,服务器可能接受或拒绝这个连接。一旦建立连接,客户端和服务器就可以通过套接字进行通信。
当客户端尝试连接到服务器时,服务器必须正在运行。服务器等待来自客户端的连接请求。创建服务器和客户端所需的语句如图。
服务器套接字
要创建服务器,需要创建一个服务器套接字(server socket),并把它附加到一个端口上,服务器从这个端口监听连接。端口标识套接字上的TCP服务。端口号的范围为0-65535,但是0~1024是为特定服务保留的端口号。
创建一个服务器套接字:
ServerSocket serverSocket = new ServerSocket(port);
//如果端口已被占用,则会导致Java.net.BindException异常
客户端套接字
创建服务器套接字之后,服务器可以使用下面的语句监听连接:
Scoket scoket = serverSocket.accept();
这个语句会一直等待,直到一个客户端连接到服务器套接字。客户端执行下面的语句,请求与服务器进行连接:
Socket socket = new Socket("port",8000);
当使用主机名创建套接字时,Java虚拟机要求 DNS将主机名译成IP地址。
通过套接字进行数据传输
服务器接受连接后,服务器和客户端之间的通信就像输人输出(IO)流一样进行操作。创建流以及它们之间进行数据交换所需要的语句,
二,InetAdress类
InetAddress 类具有一个缓存,用于存储成功及不成功的主机名解析。
默认情况下,当为了防止 DNS 哄骗攻击安装了安全管理器时,正主机名解析的结果会永远缓存。当未安装安全管理器时,默认行为将缓存一段有限(与实现相关)时间的条目。不成功主机名解析的结果缓存非常短的时间(10 秒)以提高性能。
ServerSocket serverSocket = new ServerSocket(8541);
Socket socket = serverSocket.accept();
InetAddress inetAddress = socket.getInetAddress();
inetAddress.isMulticastAddress(); //检查 InetAddress 是否是 IP 多播地址的实用例行程序。
inetAddress.isAnyLocalAddress(); //检查 InetAddress 是否是通配符地址的实用例行程序。
inetAddress.isLoopbackAddress(); //检查 InetAddress 是否是回送地址的实用例行程序。
inetAddress.isLinkLocalAddress(); //检查 InetAddress 是否是链接本地地址的实用例行程序。
三,服务多个客户
多个客户端同时连接到单个服务器是非常常见的。典型的情形是,一个服务器程序连续不停地在服务器计算机上运行,Internet 上各处的客户端都可以连接到它。可以使用线程处理服务器上多个客户端的同时访问。例如:
while(true) {
ServerSocket serverSocket = new ServerSocket(8541);
Socket socket = serverSocket.accept();
Thread thread = new Thread(socket);
thread.start();
}
服务器套接字可以有多个连接。while循环的每次迭代创建一个新的连接。无论何时,只要建立一个新的连接,就创建一个新线程来处理服务器和新客户端之间的通信,这样,就可以有多个连接同时运行。
互相独立运行的线程与指定的客户端进行通信。每个线程创建数据输入输出流问客尸端发送和接收数据。