TCP和UDP
一、InetAddress 类:封装一个IP 的对象
常用方法:
getByName(String host):封装一个指定ip获取指定域名的对象 静态 返回 InetAddress 对象
getLocalHost():封装本机的ip对象 静态 返回 InetAddress 对象
getHostName():获取主机名
getHostAddress():获取ip地址
二、UDP 通信
1、DatagramPacket 类
构造方法:DatagramPacket(byte[] buf,int length):用来接收数据
DatagramPacket(byte[] buf,int length,InetAddress address,int port):发送指定长度数组,到指定ip的指定端口号
常用方法:getAddress():获取机器的IP地址,此数据发送到哪台机器或者从哪台接收
getPort():获取机器的端口号,此数据发送到哪台机器或者从哪台接收
getDate():获取传输的数据
getLength():获取数据的长度
2、DatagramSocket 类
构造方法:DatagramSocket():发送数据时使用该构造
DatagramSocket (int port):接收数据时使用该构造
常用方法:
send(DatagramPacket p):发送数据报包
receive(DategramPacket p):接收数据报包
3、使用UDP通信
接收端:
1 public static void main(String[] args) throws IOException { 2 // 创建 DatagramSocket 对象 用于 获取数据报包 并指 明端口号 3 DatagramSocket ds = new DatagramSocket(8888); 4 byte[] bytes = new byte[1024]; 5 while(true) { 6 // 创建 DatagramPacket 对象 用于拆包 7 DatagramPacket dp = new DatagramPacket(bytes, bytes.length); 8 // 获取数据 9 ds.receive(dp); 10 // 获取发送者的ip和主机名和端口号 11 String ip = dp.getAddress().getHostAddress(); 12 String name = dp.getAddress().getHostName(); 13 int port = dp.getPort(); 14 // 获取数据 15 byte[] data = dp.getData(); 16 // 将数据转字符串 17 System.out.println("ip为" + ip + "端口号为" + port + "发送的消息是" + new String(data, 0, data.length)); 18 } 19 // 反复接收的不关闭,不反复的时候关闭 20 // ds.close(); 21 }
发送端:
1 public static void main(String[] args) throws IOException { 2 // byte[] bytes = "你好呀!".getBytes(); 3 4 // 明确ip地址 5 InetAddress inet = InetAddress.getByName("127.0.0.1"); 6 // 发送数据 7 DatagramSocket ds = new DatagramSocket(); 8 while (true) { 9 // 将需要发送的数据转字符串 10 byte[] bytes = new Scanner(System.in).next().getBytes(); 11 12 // 打包 13 DatagramPacket dp = new DatagramPacket(bytes, bytes.length, inet, 8888); 14 // 开始发送 15 ds.send(dp); 16 } 17 // 反复发送的不关闭,不反复的时候关闭 18 // ds.close(); 19 }
三、TCP通信
1、ServerSocket 类 服务器端
构造方法:ServerSocket(int port);
常用方法:accept():获取 Socket 对象
getInetAddress():返回服务器接收的本地地址
2、Socket 类 客户端
构造方法:Socket(String host,int port):指定地址和指定端口号
Socket(InetAddress address,int port):指定 InetAddress 对象和端口号
常用方法:getPort():获取 Socket对象与服务器端连接的端口号
getLocalAddress():获取本机的 InetAddress 对象
close():释放资源
getInputStream():获取字节输入流,数据存在该流中
getOutputStream():获取字节树池流,需要发送的数据写入到该流中
3、TCP通信
服务器端:
1 public static void main(String[] args) throws IOException { 2 // 创建服务器对端对象 3 ServerSocket ss = new ServerSocket(6666); 4 5 // 获取 socket 对象 6 Socket socket = ss.accept(); 7 // 从 socket 对象中获取 字节输入流 8 InputStream is = socket.getInputStream(); 9 // 获取字节输出入流的数据 10 11 byte[] bytes = new byte[1024]; 12 // int len = is.read(bytes); 13 // System.out.println(new String(bytes, 0, len)); 14 // 将 数组转字符串 15 int len = 0; 16 while ((len = is.read(bytes)) != -1) { 17 System.out.println(new String(bytes, 0, len)); 18 } 19 20 // 服务器端给客户端相应 21 22 // 获取字节输出流,写给客户端相应 23 OutputStream out = socket.getOutputStream(); 24 // 写数据 25 out.write("服务端收到了".getBytes()); 26 socket.shutdownOutput(); 27 // 释放资源 28 ss.close(); 29 }
客户端:
1 public static void main(String[] args) throws UnknownHostException, IOException { 2 InetAddress inet = InetAddress.getByName("127.0.0.1"); 3 // 创建客户端 Socket 对象 4 Socket socket = new Socket(inet, 6666); 5 // 从 客户端 对象 获取 字节输出流,用于传输数据给客户端 6 OutputStream out = socket.getOutputStream(); 7 out.write("你好".getBytes()); 8 9 socket.shutdownOutput(); 10 11 // 接收服务器的回应 12 13 // 获取字节输入流 接收服务端给的响应数据 14 InputStream is = socket.getInputStream(); 15 byte[] bytes = new byte[1024]; 16 // int len = is.read(bytes); 17 // System.out.println(new String(bytes, 0, len)); 18 19 int len = 0; 20 while ((len = is.read(bytes)) != -1) { 21 System.out.println(new String(bytes, 0, len)); 22 } 23 24 // 释放资源 25 socket.close(); 26 }