socket实现udp与tcp通信-java
1.简单介绍Socket
Socket套接字
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO流传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
2.实现UDP通信
发送Send
- 创建DatagramSocket,随机端口号
- 创建DatagramPacket,指定数据、长度、地址、端口
- 使用DatagramSocket发送DatagramPacket
- 关闭DatagramSocket
接收Receive
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket,指定数组、长度
- 使用DatagramSocket接收DatagramPacket
- 关闭DatagramSocket
- 从DatagramPacket中获取数据
示例:(发送)
public class Send { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); Scanner sc = new Scanner(System.in); while (true){ System.out.println("请输入要发送的内容:"); String line = sc.nextLine(); if ("quit".equals(line)){ break; } DatagramPacket packet = new DatagramPacket(line.getBytes(),line.getBytes().length, InetAddress.getByName("127.0.0.1"),6666); socket.send(packet); } socket.close(); } }
示例:(接收)
public class Receive { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(6666); DatagramPacket packet = new DatagramPacket(new byte[1024],1024); while (true){ socket.receive(packet); byte[] arr = packet.getData(); // 获取数据 int len = packet.getLength(); // 获取有效的字节个数 String ip = packet.getAddress().getHostAddress(); // 获取ip地址 int port = packet.getPort(); // 获取端口号 System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); } } }
示例:(多线程实现同时收发)
public class Demo { public static void main(String[] args) { new Recevice().start(); new SendDemo().start(); } } class SendDemo extends Thread{ @Override public void run(){ try { DatagramSocket socket = new DatagramSocket(); Scanner sc = new Scanner(System.in); while (true){ String line = sc.nextLine(); if ("quit".equals(line)){ break; } DatagramPacket packet = new DatagramPacket(line.getBytes(),line.getBytes().length, InetAddress.getByName("127.0.0.1"),6666); socket.send(packet); } socket.close(); } catch (IOException e) { e.printStackTrace(); } } } class Recevice extends Thread{ @Override public void run(){ try { DatagramSocket socket = new DatagramSocket(6666); DatagramPacket packet = new DatagramPacket(new byte[1024],1024); while (true){ socket.receive(packet); byte[] arr = packet.getData(); // 获取数据 int len = packet.getLength(); // 获取有效的字节个数 String ip = packet.getAddress().getHostAddress(); // 获取ip地址 int port = packet.getPort(); // 获取端口号 System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); } } catch (IOException e) { e.printStackTrace(); } } }
3.实现TCP通信
客户端Client
- 创建Socket连接服务端(指定ip地址,端口号),通过ip地址找对应的服务器
- 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
- 输入流可以读取服务端输出流写出的数据
- 输出流可以写出数据到服务端的输入流
服务端Server
- 创建ServerSocket(port)
- 调用ServerSocket的aceept()方法接收一个客户端请求,得到一个Socket
- 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
- 输入流可以读取客户端输出流写出的数据
- 输出流可以写出数据到客户端的输入流
示例:(客户端)
public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1",4896); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); // 读取服务器发过来的数据 byte[] arr = new byte[1024]; int len = is.read(arr); System.out.println(new String(arr,0,len)); // 发送数据给服务器 os.write("发送给服务器的数据".getBytes()); socket.close(); } }
示例:(服务端)
public class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(4896); while (true) { Socket socket = server.accept(); new Thread() { @Override public void run(){ try { InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); // 发送数据给客户端 os.write("发送给客户端的数据".getBytes()); //读取客户端发送过来的信息 byte[] arr = new byte[1024]; int len = is.read(arr); System.out.println(new String(arr,0,len)); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } }
代码成就万世基积沙镇海,梦想永在凌云意意气风发。