1、Socket简介
①Socket概述
②Socket通信原理
③java.net包
2、基于TCP协议的Socket编程
java.net包的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务器端,它们是基于TCP协议进行工作的,它的工作过程如同打电话的过程,只有双方都接通了,才能开始通话。
进行网络通信时,Socket需要借助数据流来完成数据的传递工作。如果一个应用程序要通过网络向另一个应用程序发送数据,只要简单的创建Socket,然后将数据写入到与该Socket关联的输出流即可,对应的,接收方的应用程序创建Socket,从相关联的输入流读取数据即可。链接:使用Socket编程实现用户登录
Socket通信模型如下:
注意:2个端点在基于TCP协议编程Socket编程中,经常一个作为客户端,一个作为服务器端。也就是client-server模型。
①Socket类
Socket对象在客户端和服务器之间建立连接。构造方法创建套接字,并将此套接字连接至给定的主机和端口。以下是与此Socket对象关联的构造方法和一些常用方法。
a、构造方法
第一种构造方法以主机名和端口号作为参数创建一个Socket对象。构造方法可能抛出UnKnownHostException或IOException异常,必须捕获并处理它们。
// Socket s=new Socket(hostName,port);
Socket socket = new Socket("127.0.0.1", 6000);
另一种构造方法以InetAddress对象和端口号作为参数来创建一个Socket对象。构造方法可能抛出UnKnownHostException或IOException异常,必须捕获并处理它们。
// Socket s=new Socket(address,port);
b、常用方法
返回值 | 方法 | 说明 |
InetAddress | getInetAddress() | 返回与Socket对象关联的InetAddress |
int | getPort() | 返回此Socket对象所连接的远程端口 |
int | getLocalPort() | 返回此Socket对象所连接的本地端口 |
InputStream | getINputStream() | 返回与此套接字关联的InputStream |
OutputStream | getOutputStream() | 返回与此套接字关联的OutputStream |
void | close() | 关闭该Socket |
②ServerSocket类
ServerSocket对象等待客户端建立连接,连接建立以后进行通信。
a、构造方法
第一种构造方法接受端口号作为参数创建ServerSocket对象。创建此对象可能抛出IOException异常,必须捕获和处理它。
// ServerSocket socket=new ServerSocket(port);
ServerSocket socket = new ServerSocket(6000);
另一种构造方法接受端口号和最大队列长度作为参数。队列长度表示系统在拒绝连接前可以拥有的最大的客户端连接数。
// ServerSocket socket2 = new ServerSocket(port,max);
ServerSocket socket2 = new ServerSocket(6000, 5000);
b、常用方法
Socket类中列出的方法也适用于ServerSocket类。此外,ServerSocket类具有accept()方法,此方法用于等待客户端触发通信,这样Socket对象就可用于进一步的数据传输。
3、基于UDP协议的Socket编程
基于TCP的网络通信是安全的,是双向的,如同拨打10086服务电话,需要先有服务端,建立双向连接后,才开始数据通信,而UDP的网络通信就不一样了,只需要指名对方地址,然后将数据送出去,并不会事先连接。这样的网络通信数据是不安全的,应用场合如聊天系统。咨询系统等。
数据报是表示通信的一种报文类型,使用数据报进行通信时无需实现建立连接这个过程,它是基于UDP协议进行的。
Java中有两个可使用数据报实现通信的类,即DatagramPacket和DatagramSocket。
DatagramPacket类起到数据容器的作用。
DatagramSocket类用于发送或接收DatagramPacket。
DatagramPacket类不提供发送或接收数据的方法,而DatagramSocket类则提供send()方法和receive()方法,用于通过套接字发送和接收数据报。
①DatagramPacket类
a、构造方法
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket ,用来接收长度为 length 的数据包。 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 |
b、常用方法
InetAddress | getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 |
byte[] | getData() 返回数据缓冲区。 |
int | getLength() 返回将要发送或接收到的数据的长度。 |
int | getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 |
②DatagramSocket类
a、构造方法
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。 |
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。 |
b、常用方法
void | close() 关闭此数据报套接字。 |
void | connect(InetAddress address, int port) 将套接字连接到此套接字的远程地址。 |
void | disconnect() 断开套接字的连接。 |
InetAddress | getLocalAddress() 获取套接字绑定的本地地址。 |
int | getLocalPort() 返回此套接字绑定的本地主机上的端口号。 |
boolean | isBound() 返回套接字的绑定状态。 |
boolean | isClosed() 返回是否关闭了套接字。 |
boolean | isConnected() 返回套接字的连接状态。 |
void | receive(DatagramPacket p) 从此套接字接收数据报包。 |
void | send(DatagramPacket p) 从此套接字发送数据报包。 |