Java TCP、UDP

138 阅读2分钟

TCP

理论知识待添加

public class Server {
    public static void main(String[] args) {
        try {
            //    1、创建一个ServerSocket对象
            ServerSocket serverSocket = new ServerSocket(8081);
            //    2、调用accpet()方法接收客户端请求(建立连接)
            System.out.println("等待连接。。。");
            Socket s = serverSocket.accept();
            //    3、获取socket对象的输入输出流
            InputStream in = s.getInputStream();
            //    4、获取客户端传过来的数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            System.out.println(reader.readLine());
            //    5、关闭流
            reader.close();
            //    6、关闭连接
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        try {
            //    1、创建一个Socket对象(相当于建立了连接)
            Socket socket = new Socket("172.17.204.59",8081);
            //    2、获取输出流
            OutputStream out = socket.getOutputStream();
            //    3、输出内容
            out.write("fdsf".getBytes());
            //    4、关闭流
            out.close();
            //    5、断开连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class ClientDemo1 {
    ServerSocket serverSocket;
    public static void main(String[] args) {
        ClientDemo1 c = new ClientDemo1();
        Scanner scanner = new Scanner(System.in);
        System.out.println("这是8082.。");
        Thread t1 = new Thread(() ->{
            while(true){
                //发送端口
                String str = scanner.next();
                c.send("127.0.0.1",8081,str);
            }
        } );
        Thread t2 = new Thread(() ->{
            //这是自己的端口
            c.receive(8082);
        });
        t1.start();
        t2.start();

    }
    //发送消息
    public void send(String ip,int port,String sendStr){
        try {
            Socket socket = new Socket(ip,port);
            OutputStream out = socket.getOutputStream();
            out.write(sendStr.getBytes());
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //接收消息
    public void receive(int port){
        try {
            serverSocket = new ServerSocket(port);
            //该方法会进入线程等待状态
            while (true) {
                Socket s = serverSocket.accept();
                InputStream in = s.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                System.out.println(reader.readLine());
                reader.close();
                s.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP

理论知识待添加

public class Server {
    public static void main(String[] args) {
        try {
            //1、创建DatagramSocket对象,并且声明端口
            DatagramSocket server = new DatagramSocket(8082);
            System.out.println("服务端已启动");
            //2、创建接受包DatagramPacket 因为字节接收,那么包的大小由你创建字节数组来决定。
            byte[] b = new byte[20];
            DatagramPacket dao = new DatagramPacket(b,b.length);
            //3、通过socket调用receive等待包内容
            server.receive(dao);
            //4、接收到包后解释包内容
            byte[] jie = dao.getData();
            System.out.println(jie.length);     //
            System.out.println(new String(jie,0,jie.length));
            //5、关闭 DatagramPacket
            server.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
public class Client {
    public static void main(String[] args) {

        try {
            Scanner scanner = new Scanner(System.in);
            //1、创建DatagramSocket 对象,并且声明端口(客户端口可以省略,对于客户端不关注端口)
            DatagramSocket client = new DatagramSocket();
            byte[] b = scanner.next().getBytes();
            //2、把发送的内容封装到DatagramPacket并且把服务端的ip以及端口带上
            //发送的时候数据包调用最后一个构造方法。
            //InetAddress.getByName  区创建一个地址
            DatagramPacket d = new DatagramPacket(b,0,b.length, InetAddress.getByName("127.0.0.1"),8082);
            //3、通过send方法发送DatagramPacket数据包
            client.send(d);
            //4、关闭DatagramSocket
            client.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}