zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    java一个字符串中出现次数最多的字符以及次数
    按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
    Java 替换空格
    Java中equals()和“==”区别
    ramfs和tmpfs的区别
    C语言中的nan和inf使用
    Abp中SwaggerUI的多个接口文档配置说明
    Abp中SwaggerUI的接口说明文档配置
    Abp中SwaggerUI的接口文档添加上传文件参数类型
    Abp中自定义Exception的HttpStatusCode
  • 原文地址:https://www.cnblogs.com/chichung/p/10292344.html
Copyright © 2011-2022 走看看