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();
        }
    }
}

 

posted @ 2019-01-20 02:24  苦瓜爆炒牛肉  阅读(468)  评论(0编辑  收藏  举报