• Java 网络编程


    java网络编程

    1、什么叫计算机网络?

      由不同地理位置的不同计算机主机,连接起来组成的网络。

    2、什么叫网络编程?

      在网络的基础上,使用网络进行编程,对应用层进行设计的活动。

    3、网络编程三要素:IP地址、端口、通讯协议

    IP地址

    1、在计算机网络中某个计算机的唯一标识

    2、在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成(也就是32位),一共有2^32个,超过40亿。IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。

    3、由于IP地址不好记忆,所以有了域名,一个域名对应一个ip,但一个IP可以对应很多域名。类似于一个人可以有很多微信,但一个微信只对应一个人。

    4、IPv6是下一版本的互联网协议,也可以说是下一代互联网的协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽,而地址空间的不足必将妨碍互联网的进一步发展。为了扩大地址空间,拟通过IPv6以重新定义地址空间。IPv4采用32位地址长度,只有大约43亿个地址,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。

    5、IP地址编址方式:A、B、C、D、E五类地址

    (1)A类地址是指:IP地址的四段地址中只有第一段为网络号码,其余三段为计算机本地号码。

      A类IP地址 地址范围1.0.0.1到127.255.255.254

      二进制表示为:00000001 00000000 00000000 00000001 - 01111111 11111111 11111111 11111110。最后一个是广播地址。(最高位必须是0),子网掩码:255.0.0.0

    (2)B类地址是指:在IP地址的四段号码中,前两段号码为网络号码。

      B类IP地址地址范围128.0.0.1-191.255.255.254

      二进制表示为:10000000 00000000 00000000 00000001----10111111 11111111 11111111 11111110。 最后一个是广播地址。(最高位必须是10),B类IP地址的子网掩码为255.255.0.0。

    (3)C类地址是指:在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。

      C类IP地址范围192.0.0.1-223.255.255.254

      二进制表示为: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110。(最高位必须是110)

    C类IP地址的子网掩码为255.255.255.0

    (4)D类IP地址在历史上被叫做多播地址(multicast address),即组播地址。

      多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。

    (5)IP地址中凡是以“11110”开头的E类IP地址都保留用于将来和实验使用

    (6)特殊IP:

      0.0.0.0 对应当前主机

      255.255.255.255对应当前子网的广播地址

      127.0.0.1到127.255.255.255用于回路测试,127.0.0.1对应本机IP地址

    端口

    1、是一个数字,用来标记电脑里的某个进程。

    2、使用两个字节表示端口,0-65535,意味着计算机中同时运行的进程最多有65536个

      当一个程序运行时,需要一个端口号,运行结束后,端口号被收回

    3、作用:一个计算机上可以并发运行多个网络程序,而不会在互相之间产生干扰。一个进程在网络中进行通讯时,先通过IP地址找到电脑,然后通过端口找到对应进程。

    4、程序运行时可以指定端口号,也可以随机分配。0-1024是系统需要的端口号

    通讯协议

    1、通讯双方在信息交互时,对信息的封装和解析的规则,就称为协议

    2、讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,它也叫做链路控制规程。

    3、应用层:http协议、https协议、FTP协议

      传输层:UDP协议、TCP协议

      网络层:IP协议

      物理层:底层硬件设备、数据的完整和校验

    网络的几种结构

    1、客户端/服务器结构,也叫做Client/Server结构,简称C/S结构(需要三次握手)

    2、浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构

    3、P2P结构

    java中的网络编程技术

    1、java 为我们提供了一个InetAddress类,该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。

    2、获取方式:

      getByName(String host):根据主机名称获取当前类型对象

      getByAddress(byte[] arr):根据ip地址的字节数组获取当前类型对象

      getAllByName(String host):根据主机名称获取的所有当前类型对象的数组

      getLocalHost():获取当前主机的当前类型对象

    3、对象的常用方法:

      getHostName():获取主机名称

      getAddress():获取ip地址的字节数组

      toString():同时获取主机名称和ip地址的字符串表示

    4、代码示例

    import java.net.InetAddress;
    import java.util.Arrays;
    
    public class Test1 {
    
        public static void main(String[] args) throws Exception {
            //获取主机名称的IP地址
            InetAddress ip1 = InetAddress.getByName("www.baidu.com");
            System.out.println(ip1);
             String s1 =ip1.getHostName();//获取主机名
             byte[] b1 = ip1.getAddress();//获取原始地址
            System.out.println(s1+"..."+Arrays.toString(b1));
            System.out.println("---------------------------------");
            
            //根据ip地址的字节数组获取当前类型对象
            byte[] b2 = {61,-121,-87,125};
            InetAddress ip2 = InetAddress.getByAddress(b2);
            System.out.println(ip2);
            System.out.println("---------------------------------");
    
            //根据本地回环地址获取当前类型对象
            byte[] b3 = {127, 0, 0, 1};
            InetAddress ip3 = InetAddress.getByAddress(b3);
            System.out.println(ip3);
            System.out.println(ip3.getHostName() + "..." + Arrays.toString(ip3.getAddress()));
            System.out.println("---------------------------------");
            
            //获取本机当前类型对象
            InetAddress ip4 = InetAddress.getLocalHost();
            System.out.println(ip4);
            System.out.println(ip4.getHostName() + "..." + Arrays.toString(ip4.getAddress()));
        }
    
    }

    UDP协议和TCP协议

    1、都是传输层协议,端到端协议。

    2、区别:

      UDP协议面向无连接,像发短信,寄信,先发送的消息未必先到达,不安全,效率高,只区分发送端和接收端,而不区分客户端和服务端

      TCP协议面向连接,像打电话,先发送的消息一定是先到,安全,效率低,区分客户端和服务端。在连接的时候,会有三次握手的动作。

    3、Socket  两台计算机的通讯点,类似于码头、邮局。。。

      Socket:也称为套接字,套接字编程:网络编程、通信点编程(端到端编程)

      不同的协议中,使用的Socket对象各不相同:UDP协议中,使用的是DatagramSocket;在TCP协议中,客户端使用的是Socket、服务端使用的ServerSocket和Socket

    UDP的编程实现

    1、使用的Socket是DatagramSocket

    2、构造方法

      DatagramSocket():不指定端口号,创建通信点,端口号随机分配,一般用于发送端

      DatagramSocket(int port):指定端口号,创建通信点,一般用于接收端

    3、成员方法

      send(DatagramPacket dp):将一个dp数据报包发送

      receive(DatagramPacket dp):将数据接收到dp参数中

    4、DatagramPacket介绍:

      1、表示一个数据报数据的封装对象的类型

      2、构造方法:  

          DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 

            buf:要发送的数据的字节数组

            offset:从数组的哪个位置开始发送

            length:发送多少数据

            address:发送到哪个ip

            port:发送到哪个程序

      3、常用成员方法:

            getData():返回该数据包中的字节数组

            getLength():返回该数据包中接收到的字节个数

    5、UDP编程步骤

      发送端:

        1、准备通讯点对象

        2、准备要发送的包裹对象

        3、调用通讯点的发送方法

      接受端:

        1、准备通讯点对象

        2、准备接收端的接收容器

        3、调用接收方法 

        4、解析收到的数据

    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;
    
    public class Send {
    
        public static void main(String[] args) throws Exception {
            String host = "127.0.0.1";
            //创建发送端
            DatagramSocket ds = new DatagramSocket();
            //要发送的数据
            Scanner sc = new Scanner(System.in);
            while(true) {//循环发送时要注意socket两边步骤要保持一致
                System.out.println("要发送的内容:");
                byte[] buf =sc.nextLine().getBytes();
                //目标地
                InetAddress address = InetAddress.getByName(host);
                //创建包
                DatagramPacket dp = new DatagramPacket(buf, 0, buf.length,address, 9999);
                ds.send(dp);
                System.out.println("是否继续?1是,0否");
                if("1".equals(sc.nextLine())) {
                    continue;
                }else break;
            }
            sc.close();
            ds.close();//注意关闭资源
        }
    
    }
    发送端
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class Receive {
    
        public static void main(String[] args) throws Exception {
            DatagramSocket ds = new DatagramSocket(9999);//接收端要指定端口号
            while(true) {
                byte[] buf = new byte[1024];
                //创建接收容器
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
                ds.receive(dp);//调用接收方法
                byte[] data = dp.getData();
                int len = dp.getLength();
                System.out.println(new String(data,0,len));//解析内容
            }
        }
    }
    接收端

    TCP的编程实现

    1、使用的通讯点就是Socket类型

    2、客户端和服务端获取Socket对象的区别:

      1、客户端使用Socket的构造方法,创建一个Socket对象

      2、服务端不能使用自己创建的方式,而是使用服务端一个特殊的对象ServerSocket,接收客户端发来的请求,生成一个为这个客户端服务的Socket对象

    3、构造方法:

      Socket(InetAddress ip, int port):建立一个通信点,专门用于和ip主机的port程序进行通信。

      只要这个对象创建成功了,就说明这个连接已经建立起来了,就说明当前的客户端已经联系上服务端了,已经获取了服务端返回的响应。

      在创建对象的过程,就是在请求和服务端连接的过程。

    4、服务端获取Socket对象的方式:

      1、启动一个服务程序,类型是ServerSocket,可以接收客户端发来的连接请求,一旦接收到请求,就可以创建一个和当前客户端交互的Socket对象

      2、ServerSocket的构造方法

          ServerSocket(int port):创建一个服务端Socket对象,等待访问port端口的客户端(监听此端口)

      3、accept():接收一个客户端发来的请求,返回一个服务此客户端的Socket对象

    5、获取客户端和服务端的连接

      1、两个方法:

          InputStream  getInputStream():获取Socket对象的网络输入流

          OutputStream  getOutputStream():获取Socket对象的网络输出流

      2、一旦获取了输入输出流,就可以通过IO的方式,来操作网络数据的传输。

      3、对应关系:

          客户端的网络输入流,对应服务端的网络输出流

          客户端的网络输出流,对应服务端的网络输入流

    6、TCP编程步骤

      客户端:

        1、创建Socket对象,建立和服务端的连接

        2、获取网络输入流和输出流

        3、通过I/O的操作进行数据的传输

      服务器端:

        1、创建ServerSocket对象,开启服务器,监听端口

        2、调用accept方法,接收客户端请求,返回Socket对象

        3、获取网络输入流和输出流

        4、通过I/O的操作进行数据的传输

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class TCPClient {
    
        public static void main(String[] args) throws Exception {        
            //String s = "10.10.92.184";
            InetAddress s = InetAddress.getLocalHost();
            int port = 9999;        
            while(true) {//注意,客户端和服务器端要保证流程一致
                //创建客户端通讯点
                Socket socket = new Socket(s,port);
                OutputStream os = socket.getOutputStream();
                //使用打印流进行包装
                PrintStream ps = new PrintStream(os);
                //获得网络输入流
                Scanner sc = new Scanner(System.in);
                ps.println(sc.nextLine());
                //获得网络输出流
                InputStream is = socket.getInputStream();
                //使用转换流进行包装
                InputStreamReader isr = new InputStreamReader(is);
                //使用高效缓冲流进行包装
                BufferedReader br = new BufferedReader(isr);
                System.out.println(br.readLine());    
            }
        }
    }
    加强版客户端
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Server {
    
        public static void main(String[] args) throws Exception {
            // 创建服务器端ServerSocket对象,监听9999端口,接受客户端的请求
            ServerSocket ss = new ServerSocket(9999);
            //创建线程池,避免浪费资源
            ExecutorService es = Executors.newFixedThreadPool(10);
            while(true) {
                // 接受客户端的请求
                Socket s = ss.accept();//阻塞式方法
                //使用匿名内部类方法创建多线程,使服务器可以和多个客户端通讯
                 Runnable r = new Runnable() {
                    public void run() {
                        try {
                            //获得输入流
                            InputStream is = s.getInputStream();
                            //转换流包装
                            InputStreamReader isr = new InputStreamReader(is);
                            //高效缓冲流包装
                            BufferedReader br = new BufferedReader(isr);
                            System.out.println(s.getLocalAddress()+"..."+s.getPort()+"..."+br.readLine());
                            
                            //获得输出流
                            OutputStream os = s.getOutputStream();
                            //打印流包装
                            PrintStream ps = new PrintStream(os);
                            ps.println("收到");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                es.submit(r);//加入线程池
            }
        }
    }
    加强版服务器

    7、TCP编程加强

      1、让客户端也接收数据,服务端也发送数据

      2、让字节流进行加强,转成字符流,加强成缓冲字符流

      3、让服务端多线程,同时可以处理多个用户的请求

     

     

  • 相关阅读:
    HDU 1076 An Easy Task
    299 Train Swapping
    HDU 1092 A+B for InputOutput Practice (IV)
    HDU 1093 A+B for InputOutput Practice (V)
    HDU 1049 Climbing Worm
    HDU 1032 The 3n + 1 problem
    HDU 1089 A+B for InputOutput Practice (I)
    HDU 1091 A+B for InputOutput Practice (III)
    Vimperator
    成为高效程序员的搜索技巧[转自月光博客]
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11256773.html
Copyright © 2020-2023  润新知