文章目录
Socket类实现网络通信
在计算机网络编程技术中,两个进程或者两台计算机之间可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(英文名叫Socket),Socket是网络驱动层提供给应用程序的一个接口或者说一种机制。Socket类使用IP地址表示因特网上的一台计算机并且使用端口号标识计算机中的进程。IP地址+端口号
可以唯一的标识网络上的一个Socket。
java.net包
java.net包提供了若干支持基于套接字(Socket)的客户端/服务器通信的类。
java.net包中常用的类有Socket、ServerSocket、DatagramPacket、DatagramSocket、InetAddress、URL、URLConnection和URLEncoder等。
为了监听客户端的连接请求,可以使用ServerSocket类。Socket类实现了用于网络上进程间通信的套接字(Socket)。DatagramSocket类使用UDP协议实现客户端和服务器Socket。DatagramPacket类使用DatagramSocket类的对象封装和设置收到的数据报。InetAddress类表示Internet地址。在创建数据报报文和Socket对象时,可以使用InetAddress类。
InetAddress类
InetAddress类代表IP地址,InetAddress类没有构造器,而是通过两个静态方法来获取对应的InetAddress实例:
getByName(String host)
:根据主机获取对应的InetAddress对象getByAddress(byte[] addr)
:根据原始IP地址获取对应的InetAddress对象
InetAddress类提供三个方法获取InetAddress实例对应的IP地址和主机名:
String getCanonicalHostName()
:获取IP地址的全限定域名String getHostAddress()
:获取IP地址字符串String getHostName()
:返回此IP地址的主机名
其他方法:
isReachable()
:测试该地址是否可达
URL类
URL(Uniform Resource Locator)对象代表统一资源定位器,它是指向互联网“资源”的指针。通常情况下,URL可以由协议名、IP地址、端口、资源组成。如https://www.taobao.com/index.html
;
URL类提供了多个构造器用于创建URL对象,获取URL对象之后,就可以调用以下方法获取URL对应的资源:
String getFile()
:获取该URL的资源名String getHost()
:获取URL的主机名String getPath()
:获取URL的路径部分int getPort()
:获取URL的端口URLConnection openConnection()
:返回一个URLConnection对象,代表了与远程对象连接InputStream openStream()
:打开与URL的连接,并返回一个用于读取该URL资源的InputStream。- ···
URLConnection类
URLConnection表示程序和URL之间的通信连接,HttpURLConnection表示和URL之间的HTTP连接,URLPermission工具类用于管理HttpURLConnection的权限问题。
基于TCP协议的Socket编程
基于TCP协议的Socket编程w特点:
- 面向连接的
- 数据量大,以字节流的形式传输
- 通过三次握手,四次挥手,实现可靠传输
java.net包中的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务器端,它们是基于TCP协议进行工作的,它的工作过程如同打电话的过程,只有双方都接通了,才能开始通话。
在进行网络通信时,Socket需要借助数据流来完成数据的传递工作。如果一个应用程序通过网络向另外一个应用程序发送数据,只能简单地创建Socket,然后将数据写入到与该Socket关联的输出流即可。对应的,接收方的应用程序创建Socket,从相关联的输入流读取数据即可。
服务器端编程思路:
- 建立套接字:ServerSocket(int port)
- 监听:accept()
- 建立连接:
- 通信:
- 关闭IO流,Socket:close()
客户端编程思路:
- 建立套接字:Socket(InetAddress address,int port),服务器的IP地址和端口
- 建立连接:
- 通信:readLine()
- 关闭IO流、Socket:close()
服务器端使用ServerSocket类建立套接字
ServerSocket对象等待客户端建立连接,连接建立之后进行通信。
(1)构造方法
- 第一种:接受端口号作为参数创建ServerSocket对象,创建此对象时可能会抛出IOExceptio异常,必须捕获和处理它
ServerSocket ss = new ServerSocket(port);
- 第二种:接受端口号和最大队列长度作为参数,队列长度表示系统在拒绝连接前可以拥有的最大客户端连接数
ServerSocket ss = new ServerSocket(port,maxqu);
(2)常用方法
Socket类中列出的常用方法也适用于ServerSocket类,此外,ServerSocket类具有accept()方法,此方法用于等待客户端发起通信,这样Socket对象就可用于进一步的数据传输。
客户端使用Socket类建立套接字进行通信
Socket对象在客户端和服务器之间建立连接。可用Socket类的构造方法创建套接字,并将套接字连接至指定的主机和端口。常用的Socket对象关联的方法如下:
(1)构造方法
- 第一种:以主机名和端口号作为参数来创建一个Socket对象。创建Socket对象时可能抛出UnknownHostException或IOException,必须捕获它们。
Socket s = new Socket(hostName,port);
- 第二种:以InetAddress对象和端口号作为参数来创建一个Socket对象。创建Socket对象时可能抛出UnknownHostException或IOException,必须捕获它们。
Socket s = new Socket(address,port);
(2)常用方法
方法 | 说明 |
---|---|
InetAddress getInetAddress() | 返回与Socket对象关联的InetAddress |
int getPort() | 返回此Socket对象所连接的远程端口 |
int getLocalPort() | 返回此Socket对象所连接的本地端口 |
InputStream getInputStream() | 返回与此套接字关联的InputStream |
OutputStream getOutputStream() | 返回与此套接字关联的OutputStream |
void close() | 关闭该Socket |
基于UDP协议的Socket编程
Java使用DatagramSocket代表UDP协议的Socket,它不维护状态,不能产生IO流,唯一作用是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据报都是通过DatagramPacket对象完成的。
关键步骤:
- 使用DatagramPacket对象封装数据报
- 使用DatagramSocket对象发送数据报
- 使用DatagramSocket对象接收数据报
- 使用DatagramPacket对象发送数据报
DatagramPacket类不提供发送或接受数据的方法,而DatagramSocket类提供send()方法和receive()方法,用于通过套接字发送和接收数据报。
DatagramPacket类
客户端要向外发送数据,必须先创建一个DatagramPacket对象,再使用DatagramSocket对象发送。构造方法如下:
DatagramPacket(byte[] data,int size)
:构造DatagramPacket对象,封装长度为size的数据报DatagramPacket(byte[] buf.int length,InetAddress address,int port)
构造DatagramPacket对象,封装长度为length的数据报并发送到指定的主机、端口号
常用方法
byte[] getData()
:返回字节数组,该数组包含接收的或要发送的数据报中的数据int getLength()
:返回发送或接收到的数据的长度InetAddress getAddress()
: 返回发送或接收此数据报的主机的IP地址int getPort()
:返回发送或接收此数据报的主机的端口号
DatagramSocket类
构造方法
DatagramSocket()
:构造DatagramSocket对象,并将其与本地主机上任何可用的端口绑定DatagramSocket(int port)
:构造DatagramSocket对象,并将其与本地主机上指定的端口绑定
常用方法
void connect(InetAddress address,int port)
:将当前DatagramSocket对象连接到远程地址的指定端口void close()
:关闭当前DatagramSocket对象void disconnect()
:断开当前DatagramSocket对象的连接int getLocalPort()
:返回当前DatagramSocket对象绑定的本地主机的端口号void send(DatagramPacket p)
:发送指定的数据报void receive(DatagramPacket p)
:接收数据报。收到数据之后,存放在指定的DatagramPacket对象中- …