zoukankan      html  css  js  c++  java
  • Java网络编程基础+示例

    Java网络编程基础

    1.1、概述

    地球春:你在西安,你的一个美国的朋友。


    信件:

    在这里插入图片描述

    计算机网络:


    网络编程目的:

    • 传播交流信息,也就是数据交换。通信。

    想要达到的效果:

    1. 如何确定网络上的一台主机。192.168.16.123:端口,定位到这个计算机上的某个资源
    2. 找到这个主机,如何传输数据呢?

    javaweb: 网页编程 B/S

    网络编程:TCP/IP C/S

    1.2、网络通信的要素

    如何实现网络的通信?

    通信双方地址:

    • ip
    • 端口
    • 192.168.16.123:5900

    规则:网络通信协议

    TCP/IP参考模型:

    在这里插入图片描述
    在这里插入图片描述

    小结:

    1. 网络编程中有两个主要的问题
      • 如何准确的定位到网络上的一台或者多台主机。
      • 找到主机如何进行通信
    2. 网络编程中的要素
      • IP 和 端口号 IP.
      • 网络通信协议 udp, tcp
    3. 万物皆对象

    1.3、IP

    ip地址:InetAddress

    • ip是唯一定位一台网络计算机的标识
    • 127.0.0.1:本机localhost、
    • ip地址分类
      • IPV4/IPV6
        • IPV4 127.0.0.1,4个字节组成
        • IPV6 fe80::3544:9d14:32df:d931%8 8个误符号整数
      • 公网(互联网) -私网(局域网)
        • 192.168.xx.xx 专门给组织内部使用的
    • 域名:记忆IP问题!
      • IP: (www.baidu.com)

    尝试代码

    package com.yanxun.ip;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    //测试ip
    public class TestInetAddress {
        public static void main(String[] args) {
            try {
                InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
                System.out.println(inetAddress1);
    
                //获取本地ip地址
                InetAddress localHost = InetAddress.getLocalHost();
                System.out.println(localHost);
                InetAddress inetAddress = InetAddress.getByName("localhost");//本机ip
                System.out.println(inetAddress);
    
    
                //查询百度网址地址ip
                InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");//通过域名查询
                System.out.println(inetAddress2);
    
                //常用方法
                System.out.println(inetAddress2.getAddress());
                System.out.println(inetAddress2.getCanonicalHostName());//ip
                System.out.println(inetAddress2.getHostAddress());//ip
                System.out.println(inetAddress2.getHostName());//域名,或者本机名字
    
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }
    
    

    1.4、端口

    端口表示计算机上的一个程序的进程:

    • 不同的进程有不同的端口号!用来区分软件!

    • 被规定0~65535

    • TCP, UPD: 65535 * 2 tcp: 80, udp: 80, 单个协议下,端口号不能冲突。

    • 端口分类

      • 公有端口 0 ~ 1023 尽量不要占用

        • HTTP: 80
        • HTTP: 443
        • FTP: 21
        • Telent: 23
      • 程序注册的端口: 1024~49151, 分配给用户或者程序

        • Tomcat: 8080
        • Mysql: 3306
        • Oracle: 1521
      • 动态、私有:49152~65535

        • #查看所有的端口
          netstat -ano
          #查看指定端口
          netstat -ano|findstr "8080"
          #查看指定端口的进程
          tasklist|findstr "9090"
          

          在这里插入图片描述

    相同端口才能通信

    在这里插入图片描述

    1.5、通信协议

    协议:约定,也就是交流群体都遵循的规则。

    **网络通信协议:**速率、传输码率,代码结构,传输控制…

    **问题:**非常的复杂?

    大事化小:分成


    TCP/IP协议

    重要:

    • TCP: 用户传输协议
    • UDP:用户数据报协议

    出名的协议:

    • TCP:
    • IP:网络互联的协议

    TCP UDP 对比

    TCP : 打电话

    • 连接,稳定

    • 三次握手 四次挥手

      • #三次握手
        A:你瞅啥?
        B: 瞅你咋滴?
        A:干一场!
        
        #四次挥手
        A:我要走了
        B:你真的要走了嘛?
        B: 你真的真的要走了嘛?
        A: 我真的要走了
        
    • 客户端、服务端

    UDP: 发短信

    • 不连接,不稳定
    • 客户端、服务端:没有明确的界限
    • 不管有没有准备好,都可以发给你。。。
    • 导弹
    • DDOS: 洪水攻击!(饱和攻击)

    1.6、TCP

    TCP实现聊天:

    客户端

    1. 连接服务器Socket
    2. 发送消息
    package com.yanxun.tcp;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class TcpClientDemo01 {
        public static void main(String[] args) {
            Socket socket = null;
            OutputStream os  = null;
            //1.客户端要知到服务器的地址
            try {
                InetAddress serverIp = InetAddress.getByName("127.0.0.1");
                int port = 9999;
                //2.创建一个socked连接
                socket = new Socket(serverIp, port);
                //3.发送消息 IO流
                os = socket.getOutputStream();
                os.write("你好,欢迎学习java".getBytes());
    
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (os != null) {
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    }
    
    

    服务器

    1. 建立服务的端口 ServerSocket
    2. 等待用户的链接 accept
    3. 接收用的消息
    package com.yanxun.tcp;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TcpServerDemo01 {
        public static void main(String[] args) {
            ServerSocket serverSocket = null;
            Socket socket = null;
            ByteArrayOutputStream baos = null;
            InputStream is = null;
            // 1.服务器得有一个地址
            try {
                serverSocket = new ServerSocket(9999);
                //2.等待客户端连接过来
                socket = serverSocket.accept();
                //3.读取客户端的消息
                is = socket.getInputStream();
    
                //管道流
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = is.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                System.out.println(baos.toString());
    
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (baos != null) {
                    try {
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (is != null) {
                    try {
                        is.close ();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
    
            }
        }
    }
    
    

    效果图:
    在这里插入图片描述

    文件上传

    服务器端:

    package com.yanxun.tcp;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TcpServerDemo02 {
        public static void main(String[] args) throws Exception{
            //1.创建服务
            ServerSocket serverSocket = new ServerSocket(9000);
            //2.监听客户端的连接
            Socket socket = serverSocket.accept();//阻塞监听,一直等客户端连接
            //3.获取输入流
            InputStream is = socket.getInputStream();
    
            //4.文件输出
            FileOutputStream fos = new FileOutputStream(new File("receive.pg"));
            byte[] buffer = new byte[1024];
            int len;
            while((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
    
            //通知客户端我接收完毕
            OutputStream os = socket.getOutputStream();
            os.write("我接收完毕了,你可以断开了".getBytes());
    
            //关闭
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();
        }
    }
    
    

    客户端:

    package com.yanxun.tcp;
    
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class TcpClientDemo02 {
        public static void main(String[] args) throws Exception {
    
            //1.创建一个Socket连接
            Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
            //2.创建一个输出流
            OutputStream os = socket.getOutputStream();
    
            //3.文件流
            FileInputStream fis = new FileInputStream(new File("my.rar"));
            //4.写出文件
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            //通知服务器我已经接收完了
            socket.shutdownOutput();//我已经传输完了!
    
            //通知客户端我接收完毕,才能断开连接
            //String byte[]
            InputStream is = socket.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer2 = new byte[1024];
            int len2;
            while((len2 = is.read(buffer2)) != -1) {
                baos.write(buffer2, 0, len2);
            }
    
             //5.关闭资源
            fis.close();
            os.close();
            socket.close();
        }
    }
    
    

    Tomcat

    服务端:

    • 自定义 S
    • Tomcat服务器 S:Java后台开发!

    客户端:

    • 自定义 C
    • 浏览器 B

    1.7、UDP

    发短信:不用连接,但是要知到地址。

    发送端

    package com.yanxun.UDP;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    //不需要连接服务器
    public class UdpDemo01 {
        public static void main(String[] args) throws Exception {
            //1.建立一个Socket
            DatagramSocket socket = new DatagramSocket();
    
            //2.建立一个包
            String msg = "你好服务器!";
    
            //发送给谁
            InetAddress localhost = InetAddress.getByName("localhost");
            int port = 9090;
            //数据,数据长度开始和结束,发送的地址
            DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
    
            //3.发送一个包
            socket.send(packet);
    
            //4.关闭
            socket.close();
        }
    }
    

    接收端

    package com.yanxun.UDP;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    //还是要等待客户端的连接
    public class UdpServer {
        public static void main(String[] args) throws Exception{
            //开放端口
            DatagramSocket socket = new DatagramSocket(9090);
            //接收数据
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);//接收
    
            socket.receive(packet);
            System.out.println(packet.getAddress().getHostAddress());
            System.out.println(new String(packet.getData(), 0, packet.getLength()));
            //关闭连接
            socket.close();
        }
    }
    

    连续聊天

    发送方

    • package com.yanxun.chat;
      
      import java.io.BufferedReader;
      import java.io.InputStreamReader;
      import java.net.*;
      
      public class UdpSenderDemo01 {
          public static void main(String[] args) throws Exception{
              DatagramSocket socket = new DatagramSocket(8888);
      
              //准备数据: 控制台读取 System.in
              BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      
              while (true) {
                  String data = reader.readLine();
                  byte[] datas = data.getBytes();
                  DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
                  socket.send(packet);
      
                  if (data.equals("bye")) {
                      break;
                  }
              }
              socket.close();
      
          }
      }
      
      

    接收方

    • package com.yanxun.chat;
      
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.SocketException;
      
      public class UdpReceiveDemo1 {
          public static void main(String[] args) throws Exception {
              DatagramSocket socket = new DatagramSocket(6666);
      
              while (true) {
                  //准备接收包裹
                  byte[] container = new byte[1024];
                  DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                  socket.receive(packet);
      
                  //断开
                  byte[] data = packet.getData();
                  String receiveData = new String(data, 0, data.length).trim();
                  System.out.println(data);
                  System.out.println(receiveData);
      
                  if (receiveData.equals("bye")) {
                      break;
                  }
              }
      
              socket.close();
          }
      }
      
      

    实现对话

    在这里插入图片描述
    在这里插入图片描述

    源码获取地址:

    链接:https://pan.baidu.com/s/1SwzqXEOYPelDlUZDdRyehQ
    提取码:aaaa

    1.8、URL


    url:www.baidu.com

    统一资源定位符:定位资源的,定位互联网上的某一个资源

    DNS 域名解析:www.baidu.com xxx. xxx. xx.xx(ip)


    协议://ip地址:端口/项目名/资源

    package com.yanxun.URL;
    
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class URLDown {
    
        public static void main(String[] args) throws Exception{
            //1. 下载地址
            URL url = new URL("https://m10.music.126.net/20201102161835/da3c545cd37a5a8121dff49f60c3d495/yyaac/obj/wonDkMOGw6XDiTHCmMOi/3612036146/c6a0/bf01/fdb4/01244e2eebee63e92099883cd8a7793c.m4a");
    
            //2. 连接到这个资源 HTTP
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    
            InputStream inputStream = urlConnection.getInputStream();
    
            FileOutputStream fos = new FileOutputStream("hhh.m4a");
    
            byte[] buffer = new byte[1024];
            int len;
            while((len = inputStream.read(buffer)) != -1) {
                fos.write(buffer, 0, len);//写出这个数据
            }
            fos.close();
            inputStream.close();
            urlConnection.disconnect();//断开连接
        }
    
    }
    
    
    追求吾之所爱
  • 相关阅读:
    SSH整合
    JQuery
    MVC框架与增强
    通用分页(二)
    通用分页(一)
    自定义标签
    反射(一)
    Xml解析作业与Xml建模andXml建模作业
    Xml与Map之间的相互转换
    Xml解析
  • 原文地址:https://www.cnblogs.com/rstz/p/14390983.html
Copyright © 2011-2022 走看看