Java基础学习网络

本文介绍了Java中的网络编程基础知识,包括IP地址、端口号、URL、传输层协议UDP与TCP的特点。讲解了UDP协议下数据的发送与接收流程,以及TCP协议下客户端与服务器端的连接建立、数据传输和关闭过程。同时涵盖了TCP协议下的三次握手和四次挥手过程。
摘要由CSDN通过智能技术生成

网络
    /*
    网页编程 : 关注上层应用
    网络编程 : 关注底层数据的传输

    IP地址 : 定位网络中的节点...(电脑,手机....)
    端口号 : 区分软件
    URL : 同一资源定位符
    传输层协议 : (标准,合同,规范)
        UDP : 邮寄包裹|写信  不安全,协议简单,开销小,效率高   大小限制一般不超过60k
        ******TCP : 打电话  基于连接  安全,效率低  没有大小限制

    IP : 定位网络中的节点...(电脑,手机....)
        IPV4 4个字节32位   IPV6128位

        特殊的IP :
            192.168.0.0~192.168.255.255  非注册IP,供组织内部使用的IP
            127.0.0.1  本地IP
            localhost : 本地

    IP 与 域名
        DNS解析器 : 做域名与IP直接解析问题

    java.net包
        InetAddress :
 */

        public class Class001_IP {
            public static void main(String[] args) throws UnknownHostException {
                //static InetAddress getLocalHost() 返回本地主机的地址。
                InetAddress ip1 = InetAddress.getLocalHost();
                System.out.println(ip1);  //DESKTOP-LQTBK6M/192.168.223.1
                System.out.println(ip1.getHostName());
                System.out.println(ip1.getHostAddress());
                //static InetAddress getByName(String host) 根据主机名称确定主机的IP地址。
                InetAddress ip2 = InetAddress.getByName("www.yjxxt.com");
                System.out.println(ip2);
                System.out.println(ip2.getHostName());
                System.out.println(ip2.getHostAddress());
            }
        }


    /*
    端口 : 区分软件
        2个字节  0~65535表示端口号
        同一协议下端口号不能冲突
        8000称为预留端口号,建议自己设置端口号为8000以上
        常见的端口号 :
            80 : http
            8080 : tomcat
            3306 : mysql
            1521 : oracle

    InetSocketAddress :此类实现IP套接字地址(IP地址+端口号)
 */

        public class Class002_Port {
            public static void main(String[] args) {
                //InetSocketAddress(String hostname, int port) 根据主机名和端口号创建套接字地址。
                InetSocketAddress in1 = new InetSocketAddress("localhost",9999);
                System.out.println(in1);
                System.out.println(in1.getHostName());
                System.out.println(in1.getPort());
                //InetSocketAddress(InetAddress addr, int port) 根据IP地址和端口号创建套接字地址。
            }
        }


    /*
    url : 同一资源定位符,互联网中资源的指针

    互联网的三大基石 : http  html  url

    url组成 :
        协议 : http
        域名 : www.baidu.com
        端口 : 80
        资源 : index.html?username=zhangsan&password=1234#a

        http://www.baidu.com:80/index.html?username=zhangsan&password=1234#a
 */

        public class Class003_URL {
            public static void main(String[] args) throws MalformedURLException {
                //URL(String spec)
                URL url = new URL("http://www.baidu.com:80/index.html?username=zhangsan&password=1234#a");
                System.out.println(url);
                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());
                System.out.println(url.getRef());
            }
        }


    /*
    UDP协议下基本流程 : 接收端
        1.定义我是接收端
        2.准备包裹,用来接收数据
        3.接收数据
        4.处理数据
        5.关闭
 */

        public class Class002_Receive {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------------接收端------------------");
                //1.定义我是接收端
                DatagramSocket receiveSocket = new DatagramSocket(8888);
                //2.准备包裹,用来接收数据
                byte[] arr = new byte[1024];
                DatagramPacket packet = new DatagramPacket(arr,0,arr.length);
                //3.接收数据
                receiveSocket.receive(packet);
                //4.处理数据
                //byte[] getData() 返回数据缓冲区。
                byte[] newArr = packet.getData();
                //int getLength() 返回要发送的数据的长度或接收的数据的长度。
                int len = packet.getLength();
                System.out.println(new String(newArr,0,len));
                //5.关闭
                receiveSocket.close();
            }
        }


    /*
    Socket : 套接字
        传输层为应用层开辟的一个小口子
    面向Socket编程,不同的传输层协议对Socket的实现不同

    UDP协议实现 :
        两端平等 : 发送端  接口端
        UDP协议下数据传输基于字节数组
        DatagramSocket
            DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
            void receive(DatagramPacket p) 从此套接字接收数据报包。
            void send(DatagramPacket p) 从此套接字发送数据报包。

        DatagramPacket : 该类表示数据报包。

    UDP协议下基本流程 : 发送端
        1.定义我是发送端
        2.准备数据
        3.打包
        4.发送
        5.关闭
 */

        public class Class001_Send {
            public static void main(String[] args) throws IOException {
                System.out.println("----------------发送端-----------------");
                //1.定义我是发送端
                DatagramSocket sendSocket = new DatagramSocket(9999);
                //2.准备数据
                byte[] arr = "哈啰".getBytes();
                //3.打包
                DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("127.0.0.1",8888));
                //4.发送
                sendSocket.send(packet);
                //5.关闭
                sendSocket.close();
            }
        }


    /*
    TCP协议下实现基本流程 : 客户端
        1.定义我是服务器 ServerSocket该类实现服务器套接字。
        2.阻塞式监听
        3.获取输入流,读取客户端发送的数据
        4.处理数据
        5.关闭
 */

        public class Class002_Server {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------我是服务器--------------");
                //1.定义我是服务器 ServerSocket
                ServerSocket server = new ServerSocket(8989);
                //2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它。
                Socket client = server.accept();
                System.out.println("与一个客户端建立连接了.............");
                //3.获取输入流,读取客户端发送的数据
                DataInputStream is = new DataInputStream(client.getInputStream());
                String msg = is.readUTF();
                //4.处理数据
                System.out.println(msg);
                //5.关闭
                is.close();
                client.close();
                server.close();
            }
        }


    /*
    TCP : 基于连接的,类似打电话, 安全,效率低  没有大小限制  基础3次握手建立连接  几次挥手断开连接
         协议下两端是不平等的 ,客户端  服务器端
         tcp协议下数据传输基于IO流

    TCP协议下实现基本流程 : 客户端
        1.定义我是客户端 Socket该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。
            Socket(String host, int port) 参数ip+端口 指的是服务器的IP+端口
        2.准备数据
        3.获取输出流,向服务器发送数据
        4.刷出
        5.关闭
 */

        public class Class001_Client {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------我是客户端--------------");
                //1.定义我是客户端
                Socket client = new Socket("localhost",8989);
                System.out.println("连接建立起来了....");
                //2.准备数据
                String msg = "good good study,day day up!!!";
                //3.获取输出流,向服务器发送数据
                DataOutputStream os = new DataOutputStream(client.getOutputStream());
                os.writeUTF(msg);
                //4.刷出
                os.flush();
                //5.关闭
                os.close();
                client.close();
            }
        }


    /*
    TCP协议下实现单向登录流程 : 服务端
        1.定义我是服务器
        2.阻塞式监听
        3.获取输入流,读取客户端发送的数据
        4.处理数据
            校验用户输入的登录信息是否正确(admin 1234)
        5.关闭
 */

        public class Class004_LoginServer {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------我是服务器--------------");
                //1.定义我是服务器 ServerSocket
                ServerSocket server = new ServerSocket(8989);
                //2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它。
                Socket client = server.accept();
                System.out.println("与一个客户端建立连接了.............");
                //3.获取输入流,读取客户端发送的数据
                DataInputStream is = new DataInputStream(client.getInputStream());
                String msg = is.readUTF();
                //4.处理数据
                //1)校验方式
                /*if("username=admin&password=1234".equals(msg)){
                    System.out.println("登录成功");
                }else{
                    System.out.println("用户名或密码错误");
                }*/
                //2)校验方式
                String uname=null;
                String upwd=null;
                String[] arr = msg.split("&");
                for(String str:arr){
                    String[] arr2 = str.split("=");
                    if("username".equals(arr2[0])){
                        uname = arr2[1];
                    }else if("password".equals(arr2[0])){
                        upwd = arr2[1];
                    }
                }
                if("admin".equals(uname) && "1234".equals(upwd)){
                    System.out.println("登录成功");
                }else{
                    System.out.println("用户名或密码错误");
                }
                //5.关闭
                is.close();
                client.close();
                server.close();
            }
        }


    /*

    TCP协议下实现单向登录流程 : 客户端
        1.定义我是客户端
        2.键盘输入接收用户输入的登录信息 username=zhangsan&password=123
        3.获取输出流,向服务器发送数据
        4.刷出
        5.关闭
 */

        public class Class003_LoginClient {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------我是客户端--------------");
                //1.定义我是客户端
                Socket client = new Socket("localhost",8989);
                System.out.println("连接建立起来了....");
                //2.准备数据
                BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("请输入用户名:");
                String username = bf.readLine();
                System.out.println("请输入密码:");
                String password = bf.readLine();
                //3.获取输出流,向服务器发送数据
                DataOutputStream os = new DataOutputStream(client.getOutputStream());
                os.writeUTF("username="+username+"&password="+password);
                //4.刷出
                os.flush();
                //5.关闭
                os.close();
                bf.close();
                client.close();
            }
        }


    /*
    TCP协议下实现双向登录流程 : 服务端
        1.定义我是服务器
        2.阻塞式监听
        3.获取输入流,读取客户端发送的数据
        4.处理数据
            校验用户输入的登录信息是否正确(admin 1234)
        5.获取输出流,将结果响应给客户端
        6.刷出
        7.关闭
 */

        public class Class006_LoginTwoWayServer {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------我是服务器--------------");
                //1.定义我是服务器 ServerSocket
                ServerSocket server = new ServerSocket(8989);
                //2.阻塞式监听
                Socket client = server.accept();
                System.out.println("与一个客户端建立连接了.............");
                //3.获取输入流,读取客户端发送的数据
                DataInputStream is = new DataInputStream(client.getInputStream());
                String msg = is.readUTF();
                //4.处理数据
                //1)校验方式
                /*if("username=admin&password=1234".equals(msg)){
                    System.out.println("登录成功");
                }else{
                    System.out.println("用户名或密码错误");
                }*/
                //2)校验方式
                String uname=null;
                String upwd=null;
                String[] arr = msg.split("&");
                for(String str:arr){
                    String[] arr2 = str.split("=");
                    if("username".equals(arr2[0])){
                        uname = arr2[1];
                    }else if("password".equals(arr2[0])){
                        upwd = arr2[1];
                    }
                }
                //5.获取输出流,将结果响应给客户端
                DataOutputStream os = new DataOutputStream(client.getOutputStream());
                if("admin".equals(uname) && "1234".equals(upwd)){
                    os.writeUTF("登录成功");
                }else{
                    os.writeUTF("用户名或密码错误");
                }
                //6.刷出
                os.flush();
                //7.关闭
                os.close();
                is.close();
                client.close();
                server.close();
            }
        }


    /*

    TCP协议下实现双向登录流程 : 客户端
        1.定义我是客户端
        2.键盘输入接收用户输入的登录信息 username=zhangsan&password=123
        3.获取输出流,向服务器发送数据
        4.刷出
        5.获取输入流,读取服务器响应的结果
        6.处理结果
        7.关闭
 */

        public class Class005_LoginTwoWayClient {
            public static void main(String[] args) throws IOException {
                System.out.println("--------------我是客户端--------------");
                //1.定义我是客户端
                Socket client = new Socket("localhost",8989);
                System.out.println("连接建立起来了....");
                //2.准备数据
                BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("请输入用户名:");
                String username = bf.readLine();
                System.out.println("请输入密码:");
                String password = bf.readLine();
                //3.获取输出流,向服务器发送数据
                DataOutputStream os = new DataOutputStream(client.getOutputStream());
                os.writeUTF("username="+username+"&password="+password);
                //4.刷出
                os.flush();
                //5.获取输入流,读取服务器响应的结果
                DataInputStream is = new DataInputStream(client.getInputStream());
                String result = is.readUTF();
                //6.处理结果
                System.out.println(result);
                //7.关闭
                is.close();
                os.close();
                bf.close();
                client.close();
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值