1.Socket和ServerSocket类
(1)套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个Socket对象。客户端和服务器现在可以通过对Socket对象的写入和读取来进行进行通信。java.net.Socket类代表一个套接字,并且java.net.ServerSocket类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
- 服务器实例化一个ServerSocket对象,表示通过服务器上的端口通信。
- 服务器调用 ServerSocket类 的accept()方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
- 服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
- Socket类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个Socket对象能够与服务器进行通信。
- 在服务器端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket。
连接建立后,通过使用I/O流在进行通信。每一个socket都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
(2)
Socket 类的方法
java.net.Socket类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个Socket对象通过实例化 ,而 服务器获得一个Socket对象则通过accept()方法的返回值。
Socket类有五个构造方法.
2.DatagramSocket类和DatagramSocket类
(1)java中通过两个类来实现UDP协议顶层的数据报:DatagramPacket对象是数据容器,DatagramSocket是用来发送和接受DatagramPacket的套接字。采用UDP通信机制下,在发送信息时,首先要将数据打包,然后将打包好的数据包发送目的地。在接收信息时,首先接收别人发来的数据报,然后查看数据报中的内容。
(2)DatagramPacket类
要发送或接收数据报,需要用DatagramPacket类将数据打包,即用DatagramPacket类创建一个对象,称为数据包。
重要的构造方法:
DatagramPacket(byte[] buf,int length) 构造数据包对象,用来接收长度为length的数据包
DatagramPacket(byte[] buf,int length,InetAddress address,int port) 构造数据包,用来将length长度的数据包发送到指定主机上的指定端口号
DatagramPacket(byte[] buf,int offset,int length)
DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)
DatagramPacket(byte[] buf,int offset,int length,SocketAddress address)
DatagramPacket(byte[] buf,int length,SocketAddress address)
常用方法:
InetAddress getAddress() 返回某台机器的IP地址,此数据报是将要发往该主机或是从该主机接收到的
byte[] getData() 返回数据缓冲区
int getLength() 返回将要发送或是接收的数据包的数据长度
SocketAddress getSocketAddress() 获取要将此包发送到的或是发出此数据报的远程主机的SocketAddress(通常为IP地址+端口号)
void setAddress(InetAddress iaddr) 设置要将此数据报发往的那台机器的IP地址
void setData(byte[] buf) 为此包设置数据缓冲区
DatagramSocket类
DatagramSocket类是用来发送和接收数据包的套接字,负责将打包的数据包发送到目的地,或是从目的地接收数据包
重要的构造方法
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定的端口
常用方法
void receive(DatagramPacket p) 从此套接字接收数据报包
void send(DatagramPacket p) 从此套接字发送数据包
(3)代码实现
//将“你好”封装成数据包,发送到目的主机“www.baidu.com”,端口号为2016上 byte buff[] = "你好".getByte(); InetAddress destAddress = InetAddress.getByName("www.baidu.com"); DatagramPacket dataPacket = new DatagramPacket(buff,buff.length,destAddress,2016); DatagramSocket sendSocket = new DatagramSocket(); sendSocket.send(dataPacket); //接收外界发送到本机2016号端口的数据包 byte buff[] = new byte[8192]; DatagramPacket receivePacket = new DatagramPacket(buff,buff.length); DatagramSocket receiveSocket = new DatagramSocket(2016); receiveSocket.receive(receivePacket); int length = receivePacket.getLength(); String message = new String(receivePacket.getData(),0,length); System.out.println(message);