前言:

本文内容:端口Port、通信协议、TCP实现聊天

推荐免费Java网络编程实战讲解视频:【狂神说Java】网络编程实战讲解_哔哩哔哩_bilibili

端口Port

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

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

  • 规定0-65535

  • TCP,UDP:65535*2 tcp:80,udp:80,单个协议下,端口不能冲突

  • 端口分类:

    • 公有端口 0-1023

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

      • Tomcat:8080
      • MySQL:3360
      • Oracle:1521
    • 动态、私有:49152-65535

      1
      2
      3
      netstat -ano #查看所有的端口
      netstat -ano|findstr"8080" #查看指定端口
      tasklist|findstr"端口号" #查看指定端口的进程

      任务管理器:Ctrl+Shift+Esc

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package com.jokerdig.netDemo;

    import java.net.InetSocketAddress;
    import java.net.SocketAddress;

    /**
    * @author Joker大雄
    * @data 2021/9/2 - 19:15
    **/
    public class Demo2 {
    public static void main(String[] args) {
    InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
    InetSocketAddress inetSocketAddress1 = new InetSocketAddress("localhost", 8080);
    System.out.println(inetSocketAddress);
    System.out.println(inetSocketAddress1);

    System.out.println(inetSocketAddress.getAddress());//地址
    System.out.println(inetSocketAddress.getHostName());//域名
    System.out.println(inetSocketAddress.getPort());//端口
    }
    }

通信协议

协议:约定,就好比沟通语言的类型(普通话)

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

**问题:**非常的复杂

大事化小:分层

TCP/IP协议:

  • TCP:用户传输协议

  • UDP:用户数据报协议

  • IP:网络互联协议

TCP/UDP对比:

  • TCP:打电话
    • 连接,稳定
    • 三次握手,四次挥手
    • 客户端、服务端
    • 传输完成,释放连接,效率低
  • UDP:发短信
    • 不连接,不稳定
    • 客户端,服务端没有明确的界线
    • 不管有没有准备好,都可以发给你
    • DDOS:洪水攻击(饱和攻击)

TCP实现聊天

客户端

  • 连接服务器Socket

  • 发送消息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package com.jokerdig.netDemo;

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;

    /**
    * @author Joker大雄
    * @data 2021/9/2 - 19:33
    **/
    //客户端
    public class TcpClientDemo {
    public static void main(String[] args) {
    Socket socket = null;
    OutputStream outputStream = null;
    try {
    // 要知到服务器的地址
    InetAddress serverIP = InetAddress.getByName("127.0.0.1");
    //端口号
    int port = 9999;
    //创建一个socket连接
    socket = new Socket(serverIP,port);
    //发送消息IO流
    outputStream = socket.getOutputStream();
    outputStream.write("Hello World send->".getBytes());//转换为字节

    } catch (Exception e) {
    e.printStackTrace();
    }finally{
    try {
    //释放资源
    if(outputStream!=null){
    outputStream.close();
    }
    if(socket!=null){
    socket.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

服务器

  • 建立服务的端口ServerSocket

  • 等待用户的连接 accept

  • 接收用户消息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package com.jokerdig.netDemo;

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;

    /**
    * @author Joker大雄
    * @data 2021/9/2 - 19:33
    **/
    //服务端
    public class TcpServerDemo {
    public static void main(String[] args) {
    ByteArrayOutputStream byteStream = null;
    InputStream inputStream = null;
    ServerSocket serverSocket = null;
    Socket socket = null;
    try {
    //我得有一个地址
    serverSocket = new ServerSocket(9999);
    //等待客户端连接过来
    socket = serverSocket.accept();
    //读取客户端消息
    inputStream = socket.getInputStream();
    /* int len;
    while((len=inputStream.read(buffer))!=1){
    String msg= new String(buffer,0,len);
    System.out.println(msg);
    //这样中文进来会乱码
    }
    */
    //管道流
    byteStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = inputStream.read(buffer)) != -1) {
    byteStream.write(buffer, 0, len);
    }
    System.out.println(byteStream.toString());
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    //释放资源
    if (byteStream != null) {
    byteStream.close();
    }
    if (inputStream != null) {
    inputStream.close();
    }
    if (socket != null) {
    socket.close();
    }
    if (serverSocket != null) {
    serverSocket.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }