美文网首页Java学习笔记
JAVA 学习笔记之 网络编程

JAVA 学习笔记之 网络编程

作者: 红姑娘 | 来源:发表于2016-11-23 13:52 被阅读11次

    网络编程(理解)

    • 用编程语言来实现计算机的资源共享和信息传递。

      • 计算机网络:多台独立的计算机用网络通信设备连接起来的网络。
        • 实现资源共享和数据传递。
    • 网络通信的三要素

    * IP地址
        * 计算机在网络中的唯一标识。
        * 现在使用的是:"点分十进制"
    * 端口
        * 应用程序的的标记。
    * 协议
        * 通信的规则。
     * UDP:不建立连接,数据打包传输,数据有限制,数据不可靠,速度快。
     * TCP:建立连接,数据无限制,数据可靠,速度慢。
    
    • 网络7层协议图解

    网络7层协议.jpg
    • Socket通信概述图解
    Socket通信概述.jpg
    • UDP发送和接收数据图解
    UDP发送和接收数据图解.jpg
    • UDP发送和接收数据
    1. 先开启谁都无所谓。
    2. 发送端
     创建发送端的Socket服务对象。
      创建数据并把数据打包。
          发送数据。
          释放资源。
    3. 接收端
      创建接收端的Socket服务对象。
      创建数据包。
      接收数据。
      解析数据。
      释放资源。
    

    案例一:UDP协议 键盘录入数据服务器接收并显示数据。

     //SendDemo发送demo
    
    public class SendDemo {
       public static void main(String[] args) throws IOException {
    
       //创建Socket对象
       DatagramSocket  socket = new DatagramSocket();
       
        // public DatagramPacket(byte[] buf,int length,InetAddress address,int
        // port)
        // buf其实就是要发送的数据信息
        // length表示要发送的数据长度
        // address数据要发到哪里去。对应的那个IP地址对象
        // port端口号
       
       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       
       String string = null;
    
       while ((string = reader.readLine()) != null ) {
        
           if ("886".equals(string)) {
               break;
           }
    
           byte[] by = string.getBytes();
           
           DatagramPacket p = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.3.108"), 10086);
           
           socket.send(p);
       }
    
       
       socket.close();
       }
    }
    

    ReceiveDemo接收demo

    public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        
        //创建接收对象 并指定端口
        DatagramSocket socket = new DatagramSocket(10086);
        
        while (true) {
        
            //创建接收数据包 接收数据
            byte[] by = new byte[1024];
            DatagramPacket p = new DatagramPacket(by, by.length);
        
            //接收数据
            socket.receive(p);
        
        //解析数据并显示
        //InetAddress address = p.getAddress();
        //String ip = address.getHostAddress();
        
            byte[] byt = p.getData();
            String string = new String(byt, 0,p.getLength());
        
            System.out.println("获得的数据是:" + string);
        }
        //关闭释放资源
        //socket.close();
     }
    }
    
    • UDP通讯简单使用多线程优化

      • 直接看代码

    ChatRoom测试类

    public class ChatRoom {
    public static void main(String[] args) throws IOException {
        DatagramSocket dsSend = new DatagramSocket();
        DatagramSocket dsReceive = new DatagramSocket(11111);
    
        SendThread st = new SendThread(dsSend);
        ReceiveThread rt = new ReceiveThread(dsReceive);
    
        Thread t1 = new Thread(st);
        Thread t2 = new Thread(rt);
    
        t1.start();
        t2.start();
      }
    }
    

    接收数据类ReceiveThread

    public class ReceiveThread implements Runnable {
    private DatagramSocket ds;
    
    public ReceiveThread(DatagramSocket ds) {
        this.ds = ds;
    }
    
    @Override
    public void run() {
        try {
            while (true) {
                // 创建数据包
                byte[] bys = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bys, bys.length);
    
                // 接收数据
                ds.receive(dp);
    
                // 解析数据
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(), 0, dp.getLength());
                System.out.println("from " + ip + " data is " + data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
      }
    }
    

    发送数据类SendThread

    public class SendThread implements Runnable {
    
      private DatagramSocket ds;
    
      public SendThread(DatagramSocket ds) {
        this.ds = ds;
      }
    
      @Override
      public void run() {
          try {
            // 封装键盘录入
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    System.in));
            String line = null;
            while ((line = br.readLine()) != null) {
                if ("886".equals(line)) {
                    break;
                }
    
                // 创建数据包
                byte[] bys = line.getBytes();
                DatagramPacket dp = new DatagramPacket(bys, bys.length,
                        InetAddress.getByName("192.168.3.108"), 11111);
                // 发送数据
                ds.send(dp);
            }
    
            // 释放资源
            ds.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
      }
    }
    

    TCP发送和接收数据

        必须先开启服务器。
        A:客户端
                创建客户端Socket对象。
                获取输出流。
                写数据。
                释放资源。
    
        B:服务器端
                创建服务器Socket对象。
                监听客户端连接。
                获取输入流。
                读取数据。
                释放资源。
    
    • TCP协议发送和接收数据图解
    TCP协议发送和接收数据图解.jpg

    案例一:TCP协议 客户端(ClientDemo)是键盘录入,服务器(ServerDemo)是写到文件。

    ClientDemo 模拟客户端

    public class ClientDemo {
    public static void main(String[] args) throws IOException {
        // 创建客户端对象
        Socket s = new Socket("192.168.32.80", 12345);
    
        // 键盘录入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 把通道内的输出流包装
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                s.getOutputStream()));
    
        String line = null;
        while ((line = br.readLine()) != null) {
            if ("over".equals(line)) {
                break;
            }
    
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    
        s.close();
    }
    }
    

    ServerDemo 模拟服务器

    public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 创建服务器Socket对象
        ServerSocket ss = new ServerSocket(12345);
        // 监听客户端连接
        Socket s = ss.accept();
        // 封装通道内的输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(
                s.getInputStream()));
        // 把数据写到文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
    
        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    
        bw.close();
        s.close();
        ss.close();
    }
    }
    

    案例二:TCP协议 客户端是读取文件,服务器是写到文件。反馈信息

    ClientDemo 模拟客户端

     public class ClientDemo {
    public static void main(String[] args) throws IOException {
        // 创建客户端对象
        Socket s = new Socket("192.168.32.80", 12345);
    
        // 读取文件的数据
        BufferedReader br = new BufferedReader(new FileReader(
                "InetAddressDemo.java"));
        // 把通道内的输出流包装
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                s.getOutputStream()));
    
        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    
        // bw.write("你可以释放了");
        // bw.newLine();
        // bw.flush();
        s.shutdownOutput(); // 禁用输出流
    
        // 获取服务器的反馈
        // 把通道内的输入流包装
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                s.getInputStream()));
        String data = reader.readLine(); // 阻塞式
        System.out.println("client:" + data);
    
        // 释放资源
        br.close();
        s.close();
    }
    }
    

    ServerDemo 模拟服务器

    public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 创建服务器对象
        ServerSocket ss = new ServerSocket(12345);
    
        // 监听客户端连接
        Socket s = ss.accept();
    
        // 把通道内的输入流包装
        BufferedReader br = new BufferedReader(new InputStreamReader(
                s.getInputStream()));
        // 把数据写入文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
    
        String line = null;
        while ((line = br.readLine()) != null) { // 阻塞式
        // if("你可以释放了".equals(line)){
        // break;
        // }
            
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    
        // 给客户端一个反馈
        // 把通道内的输出流包装
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                s.getOutputStream()));
        writer.write("文件上传成功");
        writer.newLine();
        writer.flush();
    
        // 释放资源
        bw.close();
        s.close();
        ss.close();
    }
    }
    

    案例三:TCP协议 客户端是读取图片,服务器是写到图片。反馈信息

    ClientDemo 模拟客户端

    public class ClientDemo {
    public static void main(String[] args) throws IOException {
        // 窗口客户端对象
        Socket s = new Socket("192.168.32.80", 12345);
    
        // 读取图片
        InputStream is = new FileInputStream("mn.jpg");
        // 写到通道
        OutputStream os = s.getOutputStream();
    
        int by = 0;
        while ((by = is.read()) != -1) {
            os.write(by);
        }
        s.shutdownOutput();
    
        // 获取服务器的反馈
        // 把通道内的输入流包装
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                s.getInputStream()));
        String data = reader.readLine(); // 阻塞式
        System.out.println("client:" + data);
    
        // 释放资源
        is.close();
        s.close();
    }
    }
    

    ServerDemo 模拟服务器

    public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 创建服务器对象
        ServerSocket ss = new ServerSocket(12345);
    
        // 监听客户端连接
        Socket s = ss.accept();
    
        // 获取输入流
        InputStream is = s.getInputStream();
        // 获取输出流
        OutputStream os = new FileOutputStream("copy.jpg");
    
        int by = 0;
        while ((by = is.read()) != -1) {
            os.write(by);
        }
    
        // 给出反馈
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                s.getOutputStream()));
        writer.write("文件上传成功");
        writer.newLine();
        writer.flush();
    
        os.close();
        s.close();
        ss.close();
    }
    }
    

    相关文章

      网友评论

        本文标题:JAVA 学习笔记之 网络编程

        本文链接:https://www.haomeiwen.com/subject/kfhvpttx.html