zoukankan      html  css  js  c++  java
  • java学习笔记 --- 网络编程(套接字)

    1、Socket通信原理
      Socket套接字概述:
          网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
          通信的两端都有Socket。
          网络通信其实就是Socket间的通信。
          数据在两个Socket间通过IO流传输。
          Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

      B:图解

        

    二、UDP传输

        1.发送Send
          创建DatagramSocket, 随机端口号
          创建DatagramPacket, 指定数据, 长度, 地址, 端口
          使用DatagramSocket发送DatagramPacket
          关闭DatagramSocket


        2.接收Receive
          创建DatagramSocket, 指定端口号
          创建DatagramPacket, 指定数组, 长度
          使用DatagramSocket接收DatagramPacket
          关闭DatagramSocket
          从DatagramPacket中获取数据


        3.接收方获取ip和端口号
          String ip = packet.getAddress().getHostAddress();
          int port = packet.getPort();

    public class Send {
        public static void main(String[] args) throws  Exception {
            //键盘输入
            Scanner  sc = new Scanner(System.in);
            
            //1、创建DatagramSocket,随机端口号
            DatagramSocket scoket = new DatagramSocket();
                
            //创建传输内容
            while(true){
                String str = sc.nextLine();
                //如果输入"886"则退出
                if("886".equals(str)){
                    break;
                }
                
            //2、创建DataramPacket,指定数据,长度,地址,端口
            DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
            
            //3、使用DatagramSocket发送DatagramPacket
            scoket.send(packet);
            }
            //4、关闭DatagramSocket
            scoket.close();
        }
    }
    
    -------------------------------------------------------------------------------------
    public class Receive {
        public static void main(String[] args) throws Exception {
            //1、创建DatagramSocket,制定端口号
            DatagramSocket socket = new DatagramSocket(6666);
            
            //2、创建DatagramPacket,指定数组,长度
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
            
            //3、使用DatagramSocket接收DatagramPacket
            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+":"+":"+new String(arr,0,len));
            }
        }
    }

    三、TCP协议传输
        1.客户端
          创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
          调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
          输入流可以读取服务端输出流写出的数据
          输出流可以写出数据到服务端的输入流
        2.服务端
          创建ServerSocket(需要指定端口号)
          调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
          调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
          输入流可以读取客户端输出流写出的数据
          输出流可以写出数据到客户端的输入流

    /*.服务端
    * 创建ServerSocket(需要指定端口号)
    * 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
    * 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
    * 输入流可以读取客户端输出流写出的数据
    * 输出流可以写出数据到客户端的输入流
    */
    public class Server {
        public static void main(String[] args) throws IOException {
            //1、创建ServerSocket,并指定端口号
            ServerSocket server = new ServerSocket(12345);
            
            //2、调用ServerSocket的accept()方法接受一个客户端请求,等到一个Socket
            Socket socket = server.accept();
            
            //3、调用Socket的getInputStream()和getOutputStream()方法获取客户端相连的io流
             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();
        
        }
    -------------------------------------------------------------------------------------
    /*.客户端
    * 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
    * 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
    * 输入流可以读取服务端输出流写出的数据
    * 输出流可以写出数据到服务端的输入流
    */
    public class Cilent {
        public static void main(String[] args) throws Exception{
            //1、创建Socket连接服务器端(要指定Ip地址和端口号)通过ip地址找到对应的服务器
            Socket socket = new Socket("127.0.0.1",12345);
            
            //2、调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
            InputStream is =socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            
            //3、读取服务器端发过来的数据
            byte[]  arr = new byte[1024];
            int len = is.read(arr);
            
            //4、将数据转换成字符串打印
            System.out.println(new String(arr,0,len));
            
            //向服务器写数据
            os.write("是这样敲代码吗".getBytes());
            
            //释放资源
            socket.close();
        }
    }
  • 相关阅读:
    ES6知识点整理之----async----异步遍历器
    ES6知识点整理之----async----实现原理以及与其他异步的比较
    ES6知识点整理之----async----语法
    ES6知识点整理之----async----含义及基本用法
    ES6知识点整理之----Generator----异步
    ES6知识点整理之----Generator----其他
    ES6知识点整理之----Generator----yield*表达式
    ES6知识点整理之----Generator----API
    ES6知识点整理之----Generator----next与for...of
    ES6知识点整理之----Generator----概述
  • 原文地址:https://www.cnblogs.com/flei/p/6624219.html
Copyright © 2011-2022 走看看