IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Java网络编程实战 -> 正文阅读

[网络协议]Java网络编程实战

Java网络编程实战

1、网络编程基本概念

  • 计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递**的计算机系统。
  • 网络编程的目的:直接或间接地通过网络协议与其他计算机进行·通讯。
  • 网络编程达到的效果:
    • 如何准确的定位网络上的一台主机 IP地址 : 端口,定位到这个计算机的某个资源
    • 找到主机以后如何传输数据?
  • 网络编程与网页编程区别
    • 网页编程:javaweb (B/S架构)
    • 网络编程:TCP/IP (C/S架构)

2、网络通信的要素

如何实现网络通信?

  • 通信双方地址

    • ip地址
    • 端口号
  • 规则:网络通信的协议

    • TCP/IP参考模型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95o3tmcV-1625575315414)(C:\Users\17700\AppData\Roaming\Typora\typora-user-images\image-20210601165925871.png)]

3、IP

  • ip地址:InetAddress

    • 唯一定位一台网络计算机
    • 127.0.0.1 :本机localhost
    • ip地址分类
      • IPv4 / IPv6
        • IPv4 127.0.0.1 , 4个字节组成 ,0~255,42亿其中30亿分配在北美,亚洲4亿。2011年就用完了
        • IPv6 fe80::8184:1aac:baa0:c316%3 , 128位, 8个无符号整数!
      • 公网(互联网)-私网(局域网)
        • 192.168.xx.xx 专门给组织内部使用
      • 域名:解决记忆IP问题!
    //常用方法
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class TestInetAddress {
        public static void main(String[] args) {
            try {
                //查询网站地址
                InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
                System.out.println(inetAddress);
                //查询本机地址
                InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
                System.out.println(inetAddress1);
                InetAddress inetAddress2 = InetAddress.getLocalHost();
                System.out.println(inetAddress2);
                //常用方法
                System.out.println(inetAddress.getHostAddress());//获取ip
                System.out.println(inetAddress.getHostName());//获取域名或者计算机名字
                System.out.println(inetAddress1.getHostName());//获取域名或者计算机名字
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }
    

4、端口

表示计算机上的一个程序的进程;

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

  • 被规定0~65535

  • TCP,UDP两个端口:65536*2 单个协议下,端口号不冲突

  • 端口分类:

    • 公用端口 0~1023

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

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

      • netstat -ano 				//查看所有的端口
        netstat -ano|findstr "1940" //查看指定的端口
        tasklist|findstr "5940"			//查看指定端口的进程
        
      • import java.net.InetSocketAddress;
        
        public class TestInetSocketAddress {
            public static void main(String[] args) {
                InetSocketAddress inetSocketAddress =new InetSocketAddress("127.0.0.1",8080);
                InetSocketAddress inetSocketAddress1 =new InetSocketAddress("www.baidu.com",8080);
                System.out.println(inetSocketAddress);
                System.out.println(inetSocketAddress1);
        
                System.out.println(inetSocketAddress1.getHostName());//地址
                System.out.println(inetSocketAddress1.getAddress());//域名地址
                System.out.println(inetSocketAddress1.getPort());//端口
            }
        }
        

5、通信协议

1、网络通信协议

? 网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构和互联网络提供通信支持,是一种网络通用语言。

  • 三个要素
    • 语义:接式控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作及作出什么样的反应;
    • 语法:用户数据与控制信息的结构与格式,以及数据出现的顺序;
    • 时序:对事件发生顺序的详细说明
  • 重要协议:TCP/IP协议
    • TCP:用户传输协议
      • 连接,稳定
      • 三次握手,四次挥手
      • 客户端、服务端
      • 传输完成,释放连接,效率低
    • UDP:用户数据报协议
      • 不连接,不稳定
      • 客户端、服务端:没有明确的界限
      • 不管有没有准备好都发给你:导弹、DDOS:洪水攻击(饱和攻击)

6、TCP

  • 客户端

    • 连接服务器 Socket
    • 发送消息
    //客户端
    public class TcpClientDemo1 {
        public static void main(String[] args) {
            Socket socket =null;
            OutputStream os =null;
            try {
                //获得服务端的地址和端口号
                InetAddress serverIp = InetAddress.getByName("127.0.0.1");
                int port = 9999;
                //2、创建一个socket连接
                socket = new Socket(serverIp,port);
                //3、发送消息,IO流
                os = socket.getOutputStream();
                os.write("hello,netprogram!!".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();
                }}
    
            }
    }
    }
    
  • 服务器

    • 建立服务的端口 ServerSocket
    • 等待用户的连接 accept
    • 接收消息
    /服务端
    public class TcpServerDemo1 {
        public static void main(String[] args) {
            ServerSocket serverSocket =null;
            Socket socket =null;
            InputStream is =null;
            ByteArrayOutputStream baos =null;
            try {
                //1、创建一个地址
                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();
                    }}
            }
        }
    }
    

7、文件上传

//服务器端
public class TcpServerDemo2 {
    public static void main(String[] args) throws IOException {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(8900);
        //2、监听客户端的连接
        Socket sc = serverSocket.accept();//阻断式监听,会一直等待客户端连接
        //3、获取输入流
        InputStream is = sc.getInputStream();
        //4、文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] bytes = new byte[1024];
        int len = -1 ;
        while ((len=is.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }

        //通知客户端我接收完毕
        OutputStream os = sc.getOutputStream();
        os.write("我已经接收完比,请求断开连接".getBytes());

        //关闭资源
        fos.close();
        is.close();
        sc.close();
        serverSocket.close();
    }
}
//客户端
public class TCPClientDemo2 {
    public static void main(String[] args) throws Exception {
        //建立连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8900);
        //创建一个输出流
        OutputStream out  = socket.getOutputStream();

        //读取文件
        FileInputStream fis = new FileInputStream("E:\\美食网\\美食图\\法国.jpg");

        //写入文件
        byte[] bytes = new byte[1024];
        int len = -1;
        while ((len=fis.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        //通知服务器我已经传输完毕
        socket.shutdownOutput();

        //确定服务器接受完毕,才能断开
        InputStream is = socket.getInputStream();
        //
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] bytes1 = new byte[2048];
        int len1 = 1 ;
        while ((len=is.read(bytes1))!=-1){
            baos.write(bytes1,0,len1);
        }
        System.out.println(baos.toString());

        //关闭资源
        baos.close();
        fis.close();
        out.close();
        socket.close();
    }
}

8、初识Tomcat

服务端

  • 自定义
  • Tomcat服务器

客户端

  • 自定义
  • 浏览器

9、UDP消息发送

发送消息不用建立连接,需要知道对方的地址;

  • 服务端
public class UDPServerDemo1 {
    public static void main(String[] args) throws IOException {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);

        //接受数据
        byte[] bytes  = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length);

        socket.receive(dp);//阻塞接受

        System.out.println(dp.getAddress().getHostAddress());
        System.out.println(new String(dp.getData()));
        //关闭流
        socket.close();
    }
}
  • 客户端
public class UDPClientDemo1 {
    public static void main(String[] args) throws Exception {
        //1、创建一个socket连接
        DatagramSocket ds = new DatagramSocket();
        //2、建一个包
        String info = "Hello!!!";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;
        //参数(数据,数据的起始位置,结束位置,发送给谁)
        DatagramPacket packet = new DatagramPacket(info.getBytes(),0,
                info.getBytes().length,localhost,port);

        //3、发送包
        ds.send(packet);

        //4、关闭流
        ds.close();
    }
}
  • UDP聊天实现
//发送端
public class UdpSender {
    public static void main(String[] args) throws Exception {
        //建立socket连接
        DatagramSocket socket = new DatagramSocket(8001);

        //准备数据
        BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String data = reader.readLine();//读一行
            byte[] bytes = data.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length,
                    new InetSocketAddress("localhost", 8000));

            //发送数据
            socket.send(packet);
            if(data=="bye")
                break;

        }
        //关闭流
        socket.close();

        }

    }
//接受端
public class UdpReceiver {
    public static void main(String[] args) throws Exception {
        //建立socket连接
        DatagramSocket socket =new DatagramSocket(8000);

        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);
            System.out.println(receiveData);

            if(receiveData=="bye")
                break;
        }
        socket.close();
    }
}

10、UDP多线程实现在线咨询

  • 通信端
//接收端
public class Takler2Demo implements Runnable{
    DatagramSocket socket=null;

    private int myport;

    public Takler2Demo(int myport){
        this.myport = myport;
        try {
            socket = new DatagramSocket(myport);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {

            try {
                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);
                System.out.println(myport+":"+receiveData);

                if(receiveData.equals("bye"))
                    break;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
//发送端
public class Takler2Demo implements Runnable{
    DatagramSocket socket=null;

    private int myport;

    public Takler2Demo(int myport){
        this.myport = myport;
        try {
            socket = new DatagramSocket(myport);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {

            try {
                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);
                System.out.println(myport+":"+receiveData);

                if(receiveData.equals("bye"))
                    break;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
  • 开启线程
public class Talker1 {
    public static void main(String[] args) {
        Talker1Demo t1 =new Talker1Demo(8000,"localhost",6666);
        Thread thread = new Thread(t1);
        thread.start();

        Takler2Demo t2 = null;
        t2 = new Takler2Demo(9999);
        Thread thread1 =new Thread(t2);
        thread1.start();
    }
}
public class Talker2 {
    public static void main(String[] args) {
        Talker1Demo t1 =new Talker1Demo(8888,"localhost",9999);
        Thread thread = new Thread(t1);
        thread.start();

        Takler2Demo t2 = null;
        t2 = new Takler2Demo(6666);
        Thread thread1 =new Thread(t2);
        thread1.start();
    }

}

11、URL

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

格式:
协议://ip地址:端口/项目名/资源
public class URLDemo1 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/" +
                "hellworld/index.jsp?username=lengzher&password=147");
        System.out.println(url.getProtocol());//协议
        System.out.println(url.getHost());//主机地址
        System.out.println(url.getPort());//端口
        System.out.println(url.getPath());//路径
        System.out.println(url.getFile());//文件
        System.out.println(url.getQuery());//参数
    }
}
下载文件
public class URLDemo2 {
    public static void main(String[] args) throws Exception {
        //下载地址
        URL url = new URL("http://localhost:8080/Lengzher/confidenceFIle.txt");

        //连接到这个资源 HTTP
        HttpURLConnection uc = (HttpURLConnection)url.openConnection();

        InputStream is =uc.getInputStream();

        FileOutputStream fos = new FileOutputStream("confidenceFIle.txt");

        byte[] bytes =new byte[1024];
        int len =-1;
        while ((len=is.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        fos.close();
        is.close();
        uc.disconnect();
    }

}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 11:55:40  更:2021-07-07 11:55:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 13:58:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计