我有一个问题一直不明白,一个端口能够建立多少个 Socket 连接?

kiddycoffee 2001-11-02 05:55:49
我的感觉好像只有一个,但是为什么一个服务端程序能够在一个端口建立那么多连接呢

比如说一个 HTTP 服务同时在 80 端口和非常多的客户端建立持续的 Socket 连接,这
是怎么回事呢?

下面是我的测试程序:
ServerPort.java
---------------
import java.net.*;

public class ServerPort
{
public static void main(String args[]){
ServerSocket serv_so = null;

try{
System.out.println("Server started ...");
serv_so = new ServerSocket(8088);

while (true){
new ServerAdaper(serv_so.accept()).run();
}
}catch(Exception ex){
System.out.println("Exception raised: " + ex.getMessage());
}finally{
if (serv_so != null) try{serv_so.close();}catch(Exception ex){}
}
}
}

class ServerAdaper extends Thread
{
Socket so = null;

public ServerAdaper(Socket socket){
so = socket;
}

public void run(){
InetAddress addr = so.getInetAddress();
System.out.println("\nClient connectted: " + addr.getHostAddress());
System.out.println("Remote port: " + so.getPort());
System.out.println("Local port: " + so.getLocalPort());

try{
this.sleep(2000L);
so.close();
System.out.println("Server closed ...");
}catch(Exception ex){
ex.printStackTrace();
}
}
}


Client.java
-----------
import java.net.*;

public class Client
{
public static void main(String args[]){
Socket so = null;

try{
so = new Socket("liuyang", 8088);
System.out.println("Client start.");
System.out.println("Socket connected. ");
System.out.println("Remote port: " + so.getPort());
System.out.println("Local port: " + so.getLocalPort());
new Thread().sleep(2000L);
}catch(Exception ex){
System.out.println("Exception raised: ");
ex.printStackTrace();
}finally{
if (so != null)try{so.close();}catch(Exception ex){ex.printStackTrace();}
}
}
}
...全文
1708 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyhong_h 2001-11-03
  • 打赏
  • 举报
回复
一个端口上当然可以有多个连接。

建议看TCP协议。规定,区分一个连接依赖四个部分:服务端IP地址,服务端端口,客户端
IP地址,客户端端口。

所以服务器在一个端口上等待连接,不同的客户端或同一客户端不同的端口来连接都可以连接
成功。
MAGICSLIAO 2001-11-03
  • 打赏
  • 举报
回复
一个端口可以有多个Socket连接。
ServerSocket有这样一个构造函数
ServerSocket(int port,int backlog)
port指明你要监听的端口,backlog指明你允许的最大连接数。
hahaha88 2001-11-03
  • 打赏
  • 举报
回复
ServerSocket在某个口(比如80)监听(listen),
收到一个连接后,就得到一个Socket,
然后一般的方法是产生一个Thread来处理这个Socket

一个Socket本身可能只能处理一个连接吧?(包括收/发)
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
to loveme_y(老猫)
http://www.rising.com.cn/safety/safetyschool/safetylesson/1213TCPfwmx.htm

也许这篇文章里面启示了一些什么。。。
loveme_y 2001-11-02
  • 打赏
  • 举报
回复
在一个端口监听,但是在监听端口的同时,生成一个等待队列,每一个来自客户端的连接都会送入等待队列中,服务器利用一定的算法进行选择相应的连接请求处理,所以在一个端口可以监听多各请求嘛。如果同时的连接过多,服务器相应每个连接的时间就会相应的变长。就会变慢。
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
看来也许要换一个组试试看了。
也许 C 论坛的对这一方面熟悉一些。
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
希望得到一个令人满意的答案。:(
dy_paradise 2001-11-02
  • 打赏
  • 举报
回复
关注~~~~
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
是呀,服务器端的端口全部都是在 8088 上与 Client 建立的连接呀。
我是说,以前我一直以为同一个端口同时只能建立一个 Socket 连接的,现在觉得也许我错了。
Kert_ake 2001-11-02
  • 打赏
  • 举报
回复
你的代码有什么问题么?
服务端在8088上监听,然后生成一个新的socket与client 通讯。
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
是高手都不在还是问题太难了啊?:(
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
http 连接是 TCP 吧?
网络咖啡 2001-11-02
  • 打赏
  • 举报
回复
UDP可以,TCP不可以吧!
hawaii 2001-11-02
  • 打赏
  • 举报
回复
gz
不允许回复为空!!不允许有 gz、up!!!!来点创意吧!!!
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
创意! :)
(什么嘛,csdn 连 up 都不准了,怎么大家都不发言啊?分少了吗?)
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
up(顺便骗点参与分,呵呵)
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
服务端一直是在用 8088 那个端口和 Client 进行连接的。
Kert_ake 2001-11-02
  • 打赏
  • 举报
回复
any problem abt ur code?
kiddycoffee 2001-11-02
  • 打赏
  • 举报
回复
我开始也一直是这样认为的,但你运行一下我的测试代码吧。
我开始有点不明白了,看来学无止境啊。
Kert_ake 2001-11-02
  • 打赏
  • 举报
回复
同一时刻,一个端口只能建立一个连接。
web server只是在80监听连接,得到一个socket 用来返回数据。(ServerSocket.accept())
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧