添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

平时我们使用ServerSocket指定了某个端口(例如8080),然后多个客户端连接上socket之后就都用这个8080端口和服务器端通讯。或者http服务器使用80端口也是和多个浏览器进行连接通讯。为什么可以这样呢?操作系统的进程在同个端口的多个连接是如何进行分辨的?

我们这里讲Socket连接:
1. 端口只是一个数字辨识,不是真正的物理端口;
2. 一个Socket连接的主键(即不同socket之间的区分)是由一个五元组{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL}组成,即{源地址,源端口,目标地址,目标端口,协议}组成,那些说四元组不包含协议的说法是错误的。
3. 一个进程可以拥有多个socket连接。

例子一、两个客户端连接在同个服务器的同个端口80,即有两个socket连接:
- socket1 {SRC-A, 100, DEST-X,80, TCP}
- socket2{SRC-B, 100, DEST-X,80, TCP}
主机A和主机B的地址不同,两台主机同时连接到服务器X的80端口。服务器要怎么处理这个连接是它的事,我们要理解的是为什么一个主机同个端口能监听多个客户端Socket连接。

解释:
1. 是因为两个客户端的IP不同,服务器能识别出不同的Socket;
2. 即使IP地址相同,端口不同,服务器也能够分辨;
3. 只要服务器知道收到的请求和哪个socket相关,那么它就能使用这个socket正确地回复那个客户端;
4. 如果对于不同的socket需要不同的端口,那么不仅仅浪费服务器资源,而且每次客户端连接上serverSocket之后还要另外分配新的端口和客户端通信。没必要。

例子二、不同的进程可以监听同一个端口。

  1. 因此在服务器的两个使用不同协议的进程可以监听同一个端口。
  2. 如果一个socket的辨识只是四元组不包括协议{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT},那么不同进程是不可能同时监听同一个端口的。没有协议的话一个客户端连接到同一台某个有两个进程监听端口的服务器,那么就没有什么机制可以确定客户端是要连接哪一个进程了。

操作系统(特别是UNIX)中,子进程能够继承父进程的所有文件描述File-descriptors (FD),因此父进程A中监听着的所有socket,也可以被进程的所有子进程A1,A2监听。但是不同进程B是不能监听同一个端口的。

翻译自stackoverflow的第二个答案:
https://stackoverflow.com/questions/3329641/how-do-multiple-clients-connect-simultaneously-to-one-port-say-80-on-a-server

但是里面说了:
For example two unrelated clients (say one is using TCP and another is using UDP) can bind connect and communicate to the same server node and to the same port but they must be served by two different server-processes.

两个不同的客户端(一个使用tcp一个用udp)可以连接同一个服务器的同一个端口,但是需要两个不同的服务器进程。

我觉得是错的,所以我尝试了一下:

    public static void main(String[] args) throws IOException {
        //很明显如下程序在同一个进程
        //udp使用5555端口
        DatagramSocket ds = new DatagramSocket(5555);
        byte[] buf = new byte[1024];
        DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
        ds.receive(dp_receive);
        System.out.println("收到udp消息");
        System.out.println("客户端发送udp端口为" + dp_receive.getPort());
        //tcp使用5555端口
        ServerSocket serverSocket = new ServerSocket(5555);
        Socket socket = serverSocket.accept();
        System.out.println("tcp建立了连接");
        System.out.println("客户端发送tcp端口为" + socket.getPort());
    public static void main(String[] args) throws IOException, InterruptedException {
        //udp使用12345端口发出udp消息
        DatagramSocket ds = new DatagramSocket(12345);
        String str_send = "Hello";
        InetAddress loc = InetAddress.getLocalHost();
        //udp发送到服务器的5555端口
        DatagramPacket dp_send = new DatagramPacket(str_send.getBytes(), str_send.length(), loc, 5555);
        ds.send(dp_send);
        //tcp使用12345端口发送到服务器的5555端口
        Socket socket = new Socket("127.0.0.1", 5555, null, 12345);

服务器输出:

收到udp消息
客户端发送udp端口为12345
tcp建立了连接
客户端发送tcp端口为12345

所以很明显,同个进程也可以通过不同的协议监听同一个端口。

  1. 不同协议可以监听同一个端口(不管是不是在服务器的同个进程)
  2. 某个协议的进程可以监听多个客户端的连接,因为只要五元组不同进程就能分辨。
  3. 从上面的例子可以知道,客户端同个进程也可以在同个端口用不同的协议与客户端建立连接。
1、C# 多个ip摄像头画面预览以及截图界面 2、winform VS2013 .NET4 Client Profile 3、测试摄像头:海康威视 亲测有效哦,绝对物超所值! 4、需要输入IP地址,端口号,用户名和密码。预览、抓图、客户端录像基本功能,其中抓图包括BMP和JPEG抓图(包括抓图保存在缓冲区中)。 5、IP通道设置(添加、修改、删除)功能。     1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。     2)客户端:socker()建立套接字,连接(connect)服务器连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。     3)服务器端:accept()发... 一个服务器端同时接收多个客户端的数据。 服务器端每接收一次Socket管道,就分配一个独立的线程来处理客户端发送的数据,便能实现一个服务器端接收多个客户端的数据。 客户端开发流程: 1.创建客户端Socket对象,输入服务器的IP和端口号,请求连接服务器端; 2.通过Socket管道得到一个字节输出流; 3.通过字节输出流输出数据到服务器端。 public class Client... 之前有读者在面试的时候,被问到:TCP 和 UDP 可以同时监听相同的端口吗?关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题:多个 TCP 服务进程可以同时绑定同一个端口吗?客户端端口可以重复使用吗?客户端 TCP 连接 TIME_WAIT 状态过多,会导致端口资源耗尽而无法建立新的连接吗?所以,这次就跟大家盘一盘这些问题。TCP 和 UDP 可以同时绑定相同的端口吗? 其实我感觉这个问题「TCP 和 UDP 可以同时监听相同的端口吗?」表述有问题,这个问题应该表述成「TCP 和 UDP 解决方案: 当然可以,WIZnet每款网络协议芯片都可以支持多个SOCKET同时工作,只需将芯片内每个SOCKET设置成不同端口号,分别设置成客户端连接服务器就行, 前提是服务器的上位机软件需支持多任务,否则不能成功。 java生下来一开始就是为了计算机之间的通信,因此这篇文章也将开始介绍一下java使用socket进行计算机之间的通信,在上一篇文章中已经对网络通信方面的基础知识进行了总结,这篇文章将通过代码案例来解释说明。一、网络编程基础因为java网络编程这块是从基础开始讲解的,所以知识点也是由浅入深,因此还是有必要对一些基础的知识进行回顾和掌握,如果你是大神,不喜勿喷。1、两台计算机之间的通信两台计算机如何... using System;  using System.Collections.Generic;  using System.Text;  using System.Net;  using System.Net.Sockets;  using System.Threading;  namespace TCP通信   最近公司安排我和另一个同事一起完成一个Socket通信服务器多个Socket通信客户端,具体的是服务器在window系统下c#开发,客户端是在liunx系统下开发,实现交互通讯。Socket通信服务器启动时,Socket将侦听到的Socket连接传给接受Socket,然后由接受Socket完成接受、发送消息,当Socket存在异常时,断开连接。我负责服务器端功能,所以我这里简单说下我服务器的... 多个客户端如何同时连接服务器上的一个端口,比如80? 平时我们使用ServerSocket指定了某个端口(例如8080),然后多个客户端连接socket之后就都用这个8080端口服务器端通讯。或者http服务器使用80端口也是和多个浏览器进行连接通讯。为什么可以这样呢?操作系统的进程在同个端口多个连接是如何进行分辨的? 我们这里讲Socket连接端口只是一个数字辨识,不是... 引用https://bbs.csdn.net/topics/340085584中@吉星9527ABC的回复 要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。 对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证 This question already has an answer here: 这个问题已经在这里有了答案: Does the port change when a server 经过测试,确实可行,依照“SOCKET是一个四元组(本机IP、本机端口、对方IP、对方端口)”,对二个SOCKET“使用SO_REUSEADDR选项进行设置”,成功实现了: 本机IP:8000->www.sina.com.cn:80 本机IP:8000->www.china.com:80 两条TCP连接。 但是服务器监听端口是不能重复占用的。我觉得监听Socket(Server...