zoukankan      html  css  js  c++  java
  • 计算机网络通信中的端口到底是什么意思?IP、端口号与计算机、操作系统、进程、线程之间的关系是什么?编程的时候怎么正确理解这些关系?

    如何理解IP、端口号与计算机、操作系统、进程、线程的关系?

    IP是计算机维度的。一个IP对应一个网卡。不过有的计算机可以有多个网卡。

    端口号是线程维度的,用于不同计算机之间的线程进行通信。

    为什么客户端需要知道服务端的端口号,服务端不需要知道客户端的端口号呢?

    客户端的端口是随机产生的,服务端接受客户端的请求的socket里面,带有客户端的端口号。

    如下是服务端代码:

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerSocketTest {
        public static void main(String[] args) {
            new Thread(new MyServerSocket(30000)).start();
            new Thread(new MyServerSocket(40000)).start();
            while (true){
    
            }
        }
    }
    
    class MyServerSocket implements  Runnable{
        private int port;
        public MyServerSocket(int port){
            this.port=port;
        }
    
        @Override
        public void run() {
            try {
                ServerSocket ss=new ServerSocket(port);
                while (true){
                    Socket socket = ss.accept();
                    OutputStream outputStream = socket.getOutputStream();
                    PrintStream printStream = new PrintStream(outputStream);
                    printStream.println("hello current thread is "+Thread.currentThread().getName());
                    printStream.close();
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    如下是客户端代码:(两个客户端)

    import java.io.*;
    import java.net.Socket;
    
    public class ClientSocket {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("127.0.0.1", 30000);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = bufferedReader.readLine();
    
            System.out.println("来自服务器的数据"+line);
            bufferedReader.close();
            socket.close();
        }
    }
    import java.io.*;
    import java.net.Socket;
    
    public class ClientSocket222 {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("127.0.0.1", 40000);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = bufferedReader.readLine();
            System.out.println("来自服务器的数据"+line);
            bufferedReader.close();
            socket.close();
        }
    }
    
     

    在server打上断点,可以看到客户端请求的IP和端口号,客户端的端口号57276是一个随机的线程端口号。而服务端的30000端口号由于需要监听客户端的连接,所以客户端需要知道这个端口号。

     

    那么我客户端可不可以指定端口呢?(既然服务端都可以指定端口来监听,那么我客户端应该也是可以的啊)

    可以指定,但是不推荐指定,因为客户度的socket一般用了就会关闭,不会始终占着这个端口,如果其他线程也用了这个端口,可能会报端口已经被占用,而且另外一个情况是,及时我同一份代码,也可能是多线程,如果只有一个端口,那么多线程在这里就无用武之地了,因为也会报端口被占用。

    下面给出客户端指定端口号的java代码:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.net.SocketAddress;
    
    public class ClientSocket333 {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket();  //创建一个空的Socket
            SocketAddress socketAddress=new InetSocketAddress("127.0.0.1",6666);  
            socket.bind(socketAddress);
            socket.connect(new InetSocketAddress("127.0.0.1",30000));   //真正的连接服务端
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = bufferedReader.readLine();
    
            System.out.println("来自服务器的数据"+line);
            bufferedReader.close();
            socket.close();
        }
    }

    在服务端打上断点看效果,会发现接收到客户端的socket的端口号就是6666了。

     额外说一个关于开墙的知识,开墙开的是什么?网络白名单和黑名单的两种策略?(这部分知识有限,单纯分享一点点)

    进入企业后,只要是涉及到和外部系统交互,一定会涉及到开墙这个知识点,开墙开的是什么呢?

    答案是IP+端口号。

    如果你把防火墙关闭,比如我们安装虚拟机之后,为了windows宿主机和虚拟机可以访问通,一般把虚拟机的防火墙关闭,这样一来虚拟机的所有端口都对windows宿主机开放了。

    一般企业是怎么和外部系统交互的呢?

    答案是防火墙+DMZ区+内网,或者通过认证的方式。

    给大家留个问题思考(主要是这个问题我也不知道,哈哈哈)

    浏览器访问百度的时候,浏览器开启了一个线程,使用了一个端口去访问百度,这个端口暴露在了互联网上,这个端口是不是就容易被攻击?

  • 相关阅读:
    Linux 命令详解(二)awk 命令
    Linux 命令详解(一)export 命令
    ngx_lua_API 指令详解(六)ngx.thread.spawn、ngx.thread.wait、ngx.thread.kill介绍
    ngx_lua_API 指令详解(五)coroutine.create,coroutine.resume,coroutine.yield 等集合指令介绍
    Git与GitHub学习笔记(三).gitignore文件忽略和删除本地以及远程文件
    高性能服务器架构(三):分布式缓存
    Kubernetes的node,NotReady 如何查问题,针对问题解决
    K8S 报 ErrImagePull k8s.gcr.io国内无法连接解决方法
    Quick deployment of Kubernetes
    Kubernetes 部署笔记
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/14672896.html
Copyright © 2011-2022 走看看