java网络编程(上)

网络编程(网络编程概述)
  • A:计算机网络
    • 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
  • B:网络编程
    • 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
网络编程
1、IP
  • 每个设备在网络中的唯一标识
  • 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
  • ipconfig:查看本机IP192.168.12.42
  • ping:测试连接192.168.40.62
  • 本地回路地址:127.0.0.1 255.255.255.255是广播地址
  • IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
  • IPv6:8组,每组4个16进制数。
  • 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
  • 1a2b::aaaa:0000:0000:0000:aabb:1f2f
  • 1a2b:0000:aaaa::aabb:1f2f
  • 1a2b:0000:aaaa::0000:aabb:1f2f
  • 1a2b:0000:aaaa:0000::aabb:1f2f
2、端口号
  • 每个程序在设备上的唯一标识
  • 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
  • 端口号范围从0-65535
  • 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
  • 常用端口
    • mysql: 3306
    • oracle: 1521
    • web: 80
    • tomcat: 8080
    • QQ: 4000
    • feiQ: 2425
3、协议
  • 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
  • UDP
    • 面向无连接,数据不安全,速度快。不区分客户端与服务端。
  • TCP
      * 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
    • 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
Socket通信原理
  • A:Socket套接字概述:
    • 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
    • 通信的两端都有Socket。
    • 网络通信其实就是Socket间的通信。
    • 数据在两个Socket间通过IO流传输。
    • Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
    • 总结:将两台电脑(IP)当作两台货车,而Socket就是两岸的码头,如果要进行交易,就需要船不断的运输货物(数据)到对应的码头,再装到车上。
网络编程(UDP传输)

具体流程如下
* 1.发送Send
* 创建DatagramSocket, 随机端口号
* 创建DatagramPacket, 指定数据, 长度, 地址, 端口
* 使用DatagramSocket发送DatagramPacket
* 关闭DatagramSocket
* 2.接收Receive
* 创建DatagramSocket, 指定端口号
* 创建DatagramPacket, 指定数组, 长度
* 使用DatagramSocket接收DatagramPacket
* 关闭DatagramSocket
* 从DatagramPacket中获取数据
* 3.接收方获取ip和端口号
* String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort();

案例如下

一、两个java程序模拟UDP的收发

接收端receive.class

 **接收端Receive**
* 
        DatagramSocket socket = new DatagramSocket(6666);                       //创建socket相当于创建码头
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);       //创建packet相当于创建集装箱

        while(true) {
            socket.receive(packet);                                             //接收货物
            byte[] arr = packet.getData();
            int len = packet.getLength();
            String ip = packet.getAddress().getHostAddress();
            System.out.println(ip + ":" + new String(arr,0,len));
        }

发送端send.class

DatagramSocket socket = new DatagramSocket();       //创建socket相当于创建码头
        Scanner sc = new Scanner(System.in);

        while(true) {
            String str = sc.nextLine();
            if("quit".equals(str))
                break;
            DatagramPacket packet =                             //创建packet相当于创建集装箱
                    new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
            socket.send(packet);            //发货
        }
        socket.close();

二、发送和接收在一个窗口完成(多线程)

        public class Demo3_MoreThread {

            /**
             * @param args
             */
            public static void main(String[] args) {
                new Receive().start();

                new Send().start();
            }

        }

        class Receive extends Thread {
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket(6666);                   //创建socket相当于创建码头
                    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);   //创建packet相当于创建集装箱

                    while(true) {
                        socket.receive(packet);                                             //接收货物
                        byte[] arr = packet.getData();
                        int len = packet.getLength();
                        String ip = packet.getAddress().getHostAddress();
                        System.out.println(ip + ":" + new String(arr,0,len));
                    }
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }

        class Send extends Thread {
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket();       //创建socket相当于创建码头
                    Scanner sc = new Scanner(System.in);

                    while(true) {
                        String str = sc.nextLine();
                        if("quit".equals(str))
                            break;
                        DatagramPacket packet =                             //创建packet相当于创建集装箱
                                new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
                        socket.send(packet);            //发货
                    }
                    socket.close();
                }  catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }

网络编程(TCP协议)
  • 1.客户端
    • 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
    • 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
    • 输入流可以读取服务端输出流写出的数据
    • 输出流可以写出数据到服务端的输入流
  • 2.服务端
    • 创建ServerSocket(需要指定端口号)
    • 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
    • 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
    • 输入流可以读取客户端输出流写出的数据
    • 输出流可以写出数据到客户端的输入流

26.17_网络编程(TCP协议代码优化)

  • 客户端
    //创建Socket指定ip地址和端口号
    Socket socket = new Socket("127.0.0.1", 9999);  
        //获取输入流
        InputStream is = socket.getInputStream();   
        //获取输出流     
        OutputStream os = socket.getOutputStream();         
        BufferedReader br = new BufferedReader(new   InputStreamReader(is));
        PrintStream ps = new PrintStream(os);

        System.out.println(br.readLine());
        ps.println("我想报名xxxx班");
        System.out.println(br.readLine());
        ps.println("爷不学了");
        socket.close();
  • 服务端
//创建服务器
ServerSocket server = new ServerSocket(9999);   
        //接受客户端的请求
        Socket socket = server.accept();    
        //获取输入流         
        InputStream is = socket.getInputStream();   
        //获取输出流 
        OutputStream os = socket.getOutputStream();     
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        PrintStream ps = new PrintStream(os);

        ps.println("欢迎咨询xxxx");
        System.out.println(br.readLine());
        ps.println("报满了,请报下一期吧");
        System.out.println(br.readLine());
        server.close();
        socket.close();

26.18_网络编程(服务端是多线程的)

ServerSocket server = new ServerSocket(9999);   //创建服务器
        while(true) {
            final Socket socket = server.accept();              //接受客户端的请求
            new Thread() {
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        ps.println("欢迎咨询xxxx");
                        System.out.println(br.readLine());
                        ps.println("报满了,请报下一期吧");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值