java网络编程

1.ip:InetAddress

  • 唯一定位一台网络上的计算机

  • 127.0.0.1:本机localhost

  • ip地址的分类

    • ipv4/ipv6

      • ipv4 0.0.0.0,4个字节组成,每个字节0~255,共有约42亿
      • ipv6 x.x.x.x.x.x.x.x ,128位,8个无符号整数
    • 公网/私网

      • ABCD类地址
        • A类:一个字节的网络地址,三个字节的主机地址地址,最高位为0
        • B类:两个字节的网络地址,两个字节的主机地址,最高位为10
        • C类:三个字节的网络地址,一个字节的主机地址,最高位为110
    • 域名:解决IP记忆问题

2.端口

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

  • 规定为0~65535

  • TCP,UDP单个协议下端口号不能冲突

  • 端口分类

    • 公有端口0~1023
      • HTTP:80
      • HTTPS:443
      • FTP :21
    • 程序注册端口:1024~49151,分配用户或者程序
      • Tomcat:8080
      • mysql:3306
      • idea:66432
    • 动态,私有:49152~65535

    netstat -ano #查看所有的端口

3.TCP,UDP对比

  • TCP链接稳定

  • 三次握手,四次挥手

    • 三次握手
    • 四次挥手
  • TCP实现聊天

    • 客户端:

    • 连接服务器段Socket

      • 发送消息
    //客户端
    import java.io.*;
    import java.net.Socket;
    public class ClientDemo {
        public static void main(String[] args) {
            Socket socket = null;
            OutputStream outputStream = null;
            InputStream inputStream = null;
            ByteArrayOutputStream arrayOutputStream = null;
            try {
                socket = new Socket("127.0.0.1", 6666);
                //设置网络输入、输出流
                outputStream = socket.getOutputStream();
                //inputStream = socket.getInputStream();
                arrayOutputStream = new ByteArrayOutputStream();
                //客户端发送消息
                outputStream.write("你好啊!".getBytes());
                System.out.println(arrayOutputStream.toString());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
               //关闭资源 
    
            }
        }
      }
    
    
    • 服务器端

      • 建立服务的端口 ServerSocket
      • 等待用户的链接 accept
      • 接收用户的消息
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.OutputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      public class ServerDemo {
          public static void main(String[] args) {
              Socket socket = null;
              OutputStream outputStream = null;
              InputStream inputStream = null;
              ByteArrayOutputStream arrayOutputStream = null;
      
              try {
                  ServerSocket serverSocket = new ServerSocket(6666);
                  while (true) {
                      socket = serverSocket.accept();
                      inputStream = socket.getInputStream();
                      arrayOutputStream = new ByteArrayOutputStream();
                      byte[] buffer = new byte[1024];
                      int len = 0;
                      while ((len = inputStream.read(buffer)) != -1) {
                          arrayOutputStream.write(buffer, 0, len);
                      }
                      System.out.println(arrayOutputStream.toString());
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
                  //释放资源
      
          }
      }
      
      
  • TCP实现文件上传

    • 需要在客户端和服务器端增加本地的管道流

    • 需要通知对方发送完流

      socket.shutdownOutput()

  • UDP发送消息

    • 发送端
    //建立socket
    DatagramSocket socket = new DatagramSocket();
    //数据,数据的起始位置和长度,发送的ip和端口
    DatagramPacket packet = new DatagramPacket(buf[],offset,length,address,port);
    //发送包
    

socket.send(packet);


- 接收端

 ```java
//开放端口
DatagramSocket socket = new DatagramSocket(port);
//接收数据包
DatagramPacket packet = new DatagramPacket(buf[],offset,length);
socket.receive(packet);
  • 读取控制台的流

    new InputStreamReader(System.in)
    

版权声明:本文为kmchen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kmchen/p/13848378.html