TCP/IP四层概念模型:应用层、传输层、网络层、数据链路层 。
tcp客户端
package com.seadun.demo.seadun.net.tcp; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /* * @desc tcp客户端 * @author qihao * @date 2021/6/5 18:00 * @param * @return */ public class TcpClientDemo01 { public static void main(String[] args) { Socket socket = null; OutputStream outputStream = null; // 1.我们要知道服务器地址端口号 try { InetAddress address = InetAddress.getByName("127.0.0.1"); int port = 9999; // 2. 我们创建一个socket连接 socket = new Socket(address, port); // 3. 我们向socket发送io消息流 outputStream = socket.getOutputStream(); outputStream.write("特殊机密".getBytes()); System.out.println("你好,客户端已经发送消息"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
tcp服务端(一直开启)
package com.seadun.demo.seadun.net.tcp; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /* * @desc tcp服务端 * @author qihao * @date 2021/6/5 18:00 * @param * @return */ public class TcpServiceDemo01 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; InputStream inputStream = null; ByteArrayOutputStream baos = null; try { // 要有一个地址端口,ip为localhost serverSocket = new ServerSocket(9999); while (true) { // 等待客户端连接过来,使用serverSocket。accept进行接收 socket = serverSocket.accept(); // 读取客户端发过来的消息 inputStream = socket.getInputStream(); //该方法可能导致乱码,我们使用管道流 // byte[] buffer = new byte[1024]; // int len; // while ((len = inputStream.read(buffer))!=-1){ // String s = new String(buffer, 0,len); // System.out.println(s); // } // 管道流 baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, len); } System.out.println(baos.toString()); } } catch (IOException e) { e.printStackTrace(); } finally { if (baos != null) { try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
ucp发送端
package com.seadun.demo.seadun.net.tcp; import java.net.*; /* * @desc UDP无连接发送消息,UDP不区分客户端和服务端,都可以接受发送消息 * @author qihao * @date 2021/6/5 20:34 * @param * @return */ public class UdpDemo01 { public static void main(String[] args) throws Exception { //建立一个socket DatagramSocket datagramSocket = new DatagramSocket(); //建个包 String msg = "你好,我们是UDP连接-重要机密"; InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; //数据,数据的长度开始到结束,要发送给谁 DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //发送包 datagramSocket.send(packet); //关闭流 datagramSocket.close(); } }
udp接受端
package com.seadun.demo.seadun.net.tcp; /* * @desc UDP无连接发送消息,UDP不区分客户端和服务端,都可以接受发送消息 * @author qihao * @date 2021/6/5 20:35 * @param * @return */ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; //还是要等待客户端的链接 public class UdpDemo02 { public static void main(String[] args) throws IOException { //开放端口 DatagramSocket datagramSocket = new DatagramSocket(9090); byte[] buffer = new byte[1024]; //接受 DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); datagramSocket.receive(packet); System.out.println(new String(packet.getData())); datagramSocket.close(); } }