Cheug's Blog

当前位置:网站首页 / JAVA / 正文

网络编程Socket

2019-04-25 / JAVA / 942 次围观 / 0 次吐槽 /

计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

 

网络编程

就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换

 

网络编程三要素

            IP

            每个设备在网络中的唯一标识

            每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。

            IP地址的分类:IPv4 & IPv6

            IPv4

            IPv44个字节组成,40-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽,IP格式: 192.168.1.168

            测试网络连接 ping 192.168.1.68

            本地回路地址:ping 127.0.0.1(测试网卡有没插好)

            广播地址:255.255.255.255

            IP地址也分公网地址(万维网使用)私有地址(局域网使用),192.168.开头的就是私有址址

            IPv68组,每组416进制数。1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f

             

            Port端口

                    端口号是每个程序在设备上的唯一标识

                    每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序,端口号范围从0-65535

                    编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本都被系统程序占用了

                    常用端口,面试会问

                    mysql: 3306

                    oracle: 1521

                    web: 80

                    tomcat: 8080

             

            协议

                            协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

                            网络传输方式协议有TCP&UDP

                             

                            TCP(传输控制协议)

                            面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。

                            三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

                             

                            UDP(数据报传输协议)

                            面向无连接,数据不安全,速度快。不区分客户端与服务端。

 

Socket概述

Socket翻译过来就是套接字

网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

通信的两端都有Socket,网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。Socket就是用来建立通信管道

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IPport

     image.png

TCP通信原理图解

    image.png

UDP通信原理图解


            image.png

UDP数据传输

            步骤:

            发送Send

            创建DatagramSocket, 随机端口号

            创建DatagramPacket, 指定数据, 长度, 地址, 端口

            使用DatagramSocket发送DatagramPacket

            关闭DatagramSocket

             

            接收Receive

            创建DatagramSocket, 指定端口号

            创建DatagramPacket, 指定数组, 长度

            使用DatagramSocket接收DatagramPacket

            关闭DatagramSocket

            DatagramPacket中获取数据

 

案例:实现UDP的发送和接收

    public static void main(String[] args) throws Exception {
    //      1.发送Send
    //      创建DatagramSocket, 随机端口号
            DatagramSocket sender = new DatagramSocket();
            
    //      创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口
            String s = "hello!";
            byte[] bs = s.getBytes("UTF-8");
            DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName("127.0.0.1"), 8888);
            
    //      使用DatagramSocket发送DatagramPacket
            sender.send(packet);
            
    //      关闭DatagramSockets
            sender.close();
        }
    public static void main(String[] args) throws IOException {
    //      2.接收Receive
    //      创建DatagramSocket, 指定端口号
            DatagramSocket receiver = new DatagramSocket(5288);
            
    //      创建DatagramPacket, 指定数组, 长度
            byte[] buf = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf, 1024);
            
    //      使用DatagramSocket接收DatagramPacket
            receiver.receive(packet);
            
    //      关闭DatagramSocket
            receiver.close();
            
    //      从PackeDatagramt中获取数据
            String s = new String(buf, 0, packet.getLength(), "UTF-8");
            System.out.println("接收到数据:" + s);
        }

案例:TCP数据传输

public class Demo_Client {

    public static void main(String[] args) throws IOException {
        
        //1.创建Socket对象
        Socket socket = new Socket("127.0.0.1", 9999);
        
        //2.获取输入流出
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        PrintWriter pw = new PrintWriter(os);
        
        //3.发送数据给服务端面
        pw.write("Java 还是不错的...\r\n");
        pw.flush();
        
        //4.读服务响应的数据
        System.out.println("读取响应数据:" + br.readLine());
        
        //关流
        br.close();
        socket.close();
    }
}
public class Demo_Server {

    public static void main(String[] args) throws Exception {

        //1.创建个服务端Socket对象,绑定端口
        ServerSocket serverSocket = new ServerSocket(9999);
        
        //2.监听客户端面连接
        while(true){
            Socket clientSocket = serverSocket.accept();
            
            //3.接收客户端面发送的数据
            new Thread(){
                public void run() {
                    try {
                        //读写数据都是通过IO
                        InputStream is = clientSocket.getInputStream();
                        OutputStream os = clientSocket.getOutputStream();
                        
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));
                        PrintWriter pw = new PrintWriter(os);
                    
                        while(true){
                            //读取客户端的数据
                            String line = br.readLine();
                            if(line != null){
                                System.out.println(clientSocket + ":" + new Date() +  "接收到客户端发送的数据:" + line);
                                
                                //响应客户端面
                                pw.write("receiver success\r\n");
                                pw.flush();
                            }   
                            
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    
                };
            }.start();
        }
    }
}


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.