网络编程

感谢狂神说!!!(公众号以及B站)

网络编程

1.1、 概述

1.2 、网络通信的要素

1.3、 IP

public class TestInetAddress {
    public static void main(String[] args) {
        try {
            //查询本机ip地址
            InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress1);
            InetAddress inetAddress3 = InetAddress.getByName("localhost");
            System.out.println(inetAddress3);
            InetAddress inetAddress4 = InetAddress.getLocalHost();
            System.out.println(inetAddress4);

            //查询网站ip地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2);

            //常用方法
            //System.out.println(inetAddress2.getAddress());
            System.out.println(inetAddress2.getCanonicalHostName());//规范的ip
            System.out.println(inetAddress2.getHostAddress());//ip
            System.out.println(inetAddress2.getHostName());//域名或电脑的名字
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

1.4、 端口

端口表示计算机上的一个程序的进程:

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

  • 被规定0-65535

  • 端口分类

    • 共有端口0~1023

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

      • Tomcat : 8080
      • MySQL :3306
      • Oracle :1521
    • 动态,私有:49152~65535

    • netstat -ano #查看所有的端口
      netstat -ano|findstr "5900"  #查看指定的端口
      tasklist|findstr "5204"  #查看指定进程
      
    • public class TestScoketAddress {
          public static void main(String[] args) {
              InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
              InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 8080);
      
              System.out.println(inetSocketAddress);
              System.out.println(inetSocketAddress2);
      
              System.out.println(inetSocketAddress.getAddress());
              System.out.println(inetSocketAddress.getHostName());//地址
              System.out.println(inetSocketAddress.getPort());//端口
          }
      }
      

1.5、通信协议

协议:约定,就好比我们的普通话

网络通信协议:速率,传输码率,代码结构,传输控制。。。。

TCP/IP协议簇

重要:

  • TCP:用户传输协议
  • UDP:用户数据报协议

出名的协议:

  • TCP:
  • IP:网络互联协议

TCP udp 对比

TCP :打电话

  • 连接,稳定

  • 三次握手,四次挥手

    三次握手:
    最少需要三次,保证稳定连接!
    A:你愁啥?
    B:瞅你咋地?
    A:干一场!
    
    四次挥手:
    A:我要走了
    B:你真的要走了吗?
    B:你真的真的要走了吗?
    A:我真的要走了!
    
    
  • 客户端,服务端

  • 传输完成,释放连接,效率低

UDP:发短信

  • 不连接,不稳定
  • 客户端,服务端:没有明确的界限
  • 不管有没有准备好
  • 导弹
  • DDOS : 洪水攻击!(饱和攻击)

1.6、TCP

客户端

  1. 连接服务器Socket

  2. 发送消息

  3. public class TcpClientDemo01 {
        public static void main(String[] args) {
    
            Socket socket = null;
            OutputStream os = null;
            try {
                //1.要知道服务器的地址,端口号
                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("你好".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();
                    }
                }
            }
        }
    }
    

服务器

  1. 建立服务器的端口ServerSocket

  2. 等待用户的链接 accept

  3. 接收用户的消息

  4. public class TcpServiceDemo01 {
        public static void main(String[] args) {
    
            ServerSocket serverSocket = null;
            Socket socket = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
    
            try {
                //1. 我得有一个地址
                serverSocket = new ServerSocket(9999);
    
                while (true){
                    //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();
                    }
                }
            }
        }
    }
    

文件上传

客户端

public class TcpclientDemo02 {
    public static void main(String[] args) throws Exception{
        //1、创建一个Socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
        //2、创建一个输出流
        OutputStream outputStream = socket.getOutputStream();

        //3、读取文件
        FileInputStream fis = new FileInputStream(new File("JJ.png"));
        //4、写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len=fis.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }

        //通知服务器,我已经结束了
        socket.shutdownOutput();//我已经传输完了

        //确定服务器接收完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();
        //String byte[]
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[1024];
        int len2;
        while ((len2=inputStream.read(buffer2))!=-1){
            baos.write(buffer2,0,len2);
        }

        System.out.println(baos.toString());

        //5、关闭资源
        fis.close();
        outputStream.close();
        socket.close();
    }
}

服务器

public class TcpServerDemo02 {
    public static void main(String[] args) throws Exception {
        //1、创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2、监听客户端的连接
        Socket socket = serverSocket.accept();
        //3、获取输入流
        InputStream is = socket.getInputStream();

        //4、文件输出
        FileOutputStream fos = new FileOutputStream(new File("lin.png"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }

        //通知客户端我已经接收完毕了
        OutputStream os = socket.getOutputStream();
        os.write("接收完毕!".getBytes());

        //5、关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

1.7、UDP

发送端

//不需要连接服务器
public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1、建立一个Socket
        DatagramSocket socket = new DatagramSocket(8080);
        //2、建个包
        String msg = "你好";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        //数据,数据的长度起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), port);

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

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

接收端

//还是要等待客户端的链接,但是没有真正意义上的服务器
public class UdpServerDemo02 {
    public static void main(String[] args) throws Exception{
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);//阻塞接收

        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));

        //关闭连接
        socket.close();
    }
}

在线聊天

public class TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;

    private int fromPort;//哪来的ip
    private String toIP;//要发送到的ip
    private int toPort;//要发送到的端口

    public TalkSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true){ //持续输出
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));

                socket.send(packet);
                if (data.equals("bye")){
                    break;
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
public class TalkReceive implements Runnable {

    DatagramSocket socket = null;

    private int port;
    private String msgFrom;

    public TalkReceive(int port, String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;

        try {
            socket = new DatagramSocket(port);
        } catch (Exception 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, 0, data.length);

                System.out.println(msgFrom + ":" + receiveData);

                if (receiveData.equals("bye")) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

测试

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777,"localhost",9999)).start();
        new Thread(new TalkReceive(8888,"老师")).start();
    }
}


public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555,"localhost",8888)).start();
        new Thread(new TalkReceive(9999,"学生")).start();
    }
}

1.8、URL

posted @ 2020-04-29 21:52  Jaxopp  阅读(114)  评论(0)    收藏  举报