UDP
* 面向无连接,数据不安全,速度快。不区分客户端与服务端。
TCP
* 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
* 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
网络编程(UDP传输) * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSocket 发送DatagramPacket * 关闭DatagramSocket * 2.接收Receive * 创建DatagramSocket, 指定端口号 * 创建DatagramPacket, 指定数组, 长度 * 使用DatagramSocket接收DatagramPacket * 关闭DatagramSocket * 从DatagramPacket中获取数据 * 3.接收方获取ip和端口号 * String ip = packet.getAddress().getHostAddress(); * int port = packet.getPort();
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.Socket; import java.net.SocketException; import javax.xml.ws.handler.MessageContext.Scope; public class demon1_receive { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); // 创建码头 指定端口号 6666 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); // 创建集装箱, 定义集装箱大小为1024个字节 socket.receive(packet); // 接货 byte[] arr = packet.getData(); // 获取数据 getdata() int len = packet.getLength(); // 获取有效字节个数 System.out.println(new String(arr,0,len)); //转换成字符串 socket.close(); } }
public class demon1_send { /* * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, ip地址, 端口 * 使用DatagramSocket发送DatagramPacket * 关闭DatagramSocket */ public static void main(String[] args) throws Exception { String str = "弄啥呢"; DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 6666); /* DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 InetAddress 此类表示IP地址 ( 32 位或 128 位无符号数字) getByName(String host) :在给定主机名的情况下确定主机的 IP 地址。 * */ socket.send(packet); //发送 socket.close(); } }
public class demon2_receive { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); while (true) { socket.receive(packet); // 接货 byte[] arr = packet.getData(); // 获取数据 getdata() int len = packet.getLength(); // 获取有效字节个数 String ip = packet.getAddress().getHostName(); // getAddress() 获取一个 InetAddress 类型的 IP地址 再getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 int port = packet.getPort(); //获取端口号 System.out.println(ip + ".." + port + ":" + new String(arr,0,len)); //转换成字符串 } // socket.close(); } }
public class demon2_send { /* * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSocket发送DatagramPacket * 关闭DatagramSocket */ public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); DatagramSocket socket = new DatagramSocket(9999); while(true){ String str = sc.nextLine(); if ("quit".equals(str)) { break; } DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 6666); socket.send(packet); } socket.close(); } }