文章目录
一.UDP
UDP:面向无连接通信(发送端不需接收端确认是否能接收),数据不安全,效率高
1.常用方法
InetAddress
static InetAddress getLocalHost()
获取本地主机static InetAddress getByName(String host)
根据域名或IP获取主机String getHostName()
获取主机名String getHostAddress()
获取IP地址
DatagramPacket
DatagramPacket(byte[] buf, int length)
构造缓冲区接收读取指定长度的数据包int getLength()
获取接收的数据包的大小InetAddress getAddress()
获取发送方的IP地址int getPort()
获取发送方的端口号DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造发送的数据包,并设置接受者的IP地址和端口
DatagramSocket
DatagramSocket()
空构造DatagramSocket(int port)
创建指定接受者端口的套接字对象void send(DatagramPacket p)
发送数据包void receive(DatagramPacket p)
接收数据包void close()
关闭套接字
2.接收方
/* 测试时应先启动接收方,再启动发送方 */
//用于接收数据的缓冲区
byte[] data=new byte[1024];
//创建数据包对象
DatagramPacket dp=new DatagramPacket(data, data.length);
//创建套接字对象,设置接收方端口为3000
DatagramSocket ds=new DatagramSocket(3000);
//接收数据包
ds.receive(dp);
//获取发送者的IP地址
String senderIP=dp.getAddress().getHostAddress();
//获取发送者的端口号
int senderPort=dp.getPort();
//获取数据包的大小
int length=dp.getLength();
System.out.println(senderIP+":"+senderPort+"..."+new String(data,0,length));
//关闭资源
ds.close();
3.发送方
String msg="你好";
byte[] data=msg.getBytes();
//接收者IP地址
InetAddress receiverIP=InetAddress.getByName("127.0.0.1");
//接收者端口号
int receiverPort=3000;
//创建数据包
DatagramPacket dp=new DatagramPacket(data, data.length,receiverIP,receiverPort);
//创建套接字对象
DatagramSocket ds=new DatagramSocket();
//发送数据包
ds.send(dp);
//关闭资源
ds.close();
二.TCP
TCP:面向有连接通信,三次握手,数据安全,效率较低,区分客户端与服务器端
1.常用方法
Socket
Socket(String host, int port)
创建客户端的套接字对象,并设置需要访问的服务器的IP和端口OutputStream getOutputStream()
获取输出流,用于客户端发送数据或服务器端响应数据InputStream getInputStream()
获取输入流,用于读取客户端发送的数据或服务器端响应的数据
-void close()
关闭套接字
ServerSocket
ServerSocket(int port)
创建服务器端的套接字对象,并绑定端口号Socket accept()
监听并接受客户端的套接字void close()
关闭套接字
2.服务器端
//创建服务器端的套接字对象,并绑定端口号
ServerSocket server=new ServerSocket(4000);
//监听并接受客户端的套接字
Socket socket= server.accept();
//获取客户端发送数据的输入流
InputStream in=socket.getInputStream();
byte[] data=new byte[1024];
//读取客户端发送的数据
int len=in.read(data);
String msg=new String(data,0,len);
System.out.println(msg);
if(msg.equals("我要登录")){
//获取服务器端响应给客户端的输出流
OutputStream out=socket.getOutputStream();
//输出数据到客户端
out.write("登录成功".getBytes());
}
//关闭资源
socket.close();
server.close();
3.客户端
//创建客户端的套接字对象,并设置需要访问的服务器的IP和端口
Socket socket=new Socket("127.0.0.1", 4000);
//获取发送数据到服务器端的输出流
OutputStream out= socket.getOutputStream();
//发送数据到服务器端
out.write("我要登录".getBytes());
//获取服务器端响应返回数据的输入流
InputStream in=socket.getInputStream();
byte[] data=new byte[1024];
//读取服务器端返回的数据
int len=in.read(data);
System.out.println(new String(data,0,len));
//关闭资源
socket.close();