LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 939|回复: 5

问一个JXTA的管道问题。

[复制链接]
发表于 2005-3-4 19:00:19 | 显示全部楼层 |阅读模式
在第一次启动JXTA应用时,
一般会出现配置GUI。

其中要设置HTTP和TCP端口,
我在同一台机器上调试,
当然就不用设置HTTP端口了。

我想知道设置端口的作用是什么?
是为了监听网络?
还是为了使用它发送消息到其他Peer?

如果是前者,
可以很好的理解。

如果是后者,
就有麻烦了,
在使用多线程时,
只有一个端口与输出管道连接,
其他线程怎么使用管道向远程Peer传输呢?

有人说多线程可以同时使用同一个端口,
那么:

在Web服务器端,
通过80端口监听到客户请求后,
创建一个线程,
在此线程中,利用Socket绑定到本地一个空闲端口,
并向客户发送数据。

如果可以多线程使用一个端口,
那么,
Web服务器就不用在每个线程里绑定一个空闲端口了吧?

如果JXTA的端点绑定协议也是自动寻找一个空闲端口就好了,
所以在第一次启动应用程序时,
了解配置GUI里填写的端口是用于监听还是用于发送挺重要的。
:help
发表于 2005-3-5 01:27:04 | 显示全部楼层
首先我想作为p2p的程序,自己即是客户端,也是提供数据的服务器,因此如果有其他机器作为客户端连接自己的机器,那么使用什么协议,什么端口呢,我想这就是设置的目的。
而jxta的特点就是不用关心通信时使用的具体协议,它可以是http(当需要穿越防火墙的时候),也可以是tcp(当2台机器在内网里的时候),因此需要设置多个协议所使用的端口,以便jxta程序可以自动选择使用合适的通信协议。这个对于jxta程序来说是透明的,因为有一个叫管道(pipeline)的东东对其进行了包装。
更多的信息请参考:
http://www.zdnet.com.cn/develope ... 2,39174505-5,00.htm

至于多个线程是否可以操作同一个端口的问题,首先声明我不是这方面的专家,但是我个人认为这个东西是可以的,但是应该不是楼主所说的利用空闲端口,因为client端连接到server以后,双方的ip和通信port都确定了,这样才可能建立一个通信管道,就是那个stream流,但是这时候不可能再切换到其他所谓的空闲端口,不然就意味着要server重新通过已经建立的管道,通知client我们到另外一个port口说话好吗?然后大家再建立一次连接,这个我个人认为是不可能的。而我想目前这种多个线程同时读写一个端口的实现机制应该是底层的系统例如os提供的,大体的原理应该是有一个处理tcp包的核心程序,会根据每个包上加的地址签来确定是发给那个stream或者传发给其他线程之类的,这样读写端口的其实就只有这个核心程序,而我们看到的只是上层提供的api借口,不知道我理解的对不对。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-5 09:21:55 | 显示全部楼层
我写的关于“Web服务器”工作方式,是书上介绍的。
它所指的连接空闲端口,
是每收到一个请求,就与该请求在一个空闲端口建立连接。
并不是指已经与一个客户连接了,再换成另一个端口。
因为http每次通话,都要 “请求--连接--响应--断开连接”。
所以,即使是同一个客户第二次访问server,
可能也会从server端的另一个端口收到返回的数据。

另:
每次使用Socket与对方连接时,
必须使用空闲端口,
否则抛出异常。

而server端自己找到空闲端口与请求方建立Socket连接。
回复 支持 反对

使用道具 举报

发表于 2005-3-5 11:19:54 | 显示全部楼层
Post by sinpool
我写的关于“Web服务器”工作方式,是书上介绍的。
它所指的连接空闲端口,
是每收到一个请求,就与该请求在一个空闲端口建立连接。
并不是指已经与一个客户连接了,再换成另一个端口。
因为http每次通话,都要 “请求--连接--响应--断开连接”。
所以,即使是同一个客户第二次访问server,
可能也会从server端的另一个端口收到返回的数据。


首先我不知道你那部书是怎么介绍的,不过我们可以分析一下,例如一个web server,比如说是apache吧,它现在在80端口监听http请求,然后有一个client要请求apache的http服务,按照所说的"请求--连接--响应--断开连接”的顺序,首先client请求apache的连接,server accept以后,连接就建立了,然后apache经过处理以后,例如找到对应的html或者图片,就生成http response报文,然后会传给client,这时通信使用的还是开始建立的连接吧,最后断开连接。整个过程是这样的,没错吧。
但是你说
Post by sinpool
所以,即使是同一个客户第二次访问server,
可能也会从server端的另一个端口收到返回的数据。

为什么client第二次请求,就会从server的另一个端口受到返回的数据呢?难道client后来就不是连接server的80端口了吗?我们写的简单的client server的程序,都是知道server的ip和port号以后才能够连接的,但是程序中server端指定连接的port号是不可能改变的。而我猜想你的书中介绍的空闲端口连接,应该是指的server端返回给client时,要给client端机器发送报文,client端的ip地址,server肯定知道,但是我们的程序当中从来没有指定过client用什么端口和server通信,所以server端是否可以选择一个client端机器的空闲端口来发送返回报文。
或者还可以换一种思路来看,如果真的是像楼主所说,server每次会从空闲的端口返回数据给client,那么如果server某一次要给client发一个特大的报文,会占用这个空闲端口几分钟,但是其他程序要bind这个所谓的空闲端口,那么岂不是要bind失败啦,这个合理吗?还有我们在防火墙上只配置80端口开发是不行的,因为apache还需要其他空闲端口来和client通信,那么防火墙怎么进行设置呢?
以上说法我只是凭经验猜的,不知道对不对,楼主也可以再看看自己写的socket程序,看看是不是这样:-)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-5 12:54:55 | 显示全部楼层
嗯…… :rolleyes:

让我想想……

而我猜想你的书中介绍的空闲端口连接,应该是指的server端返回给client时,要给client端机器发送报文,client端的ip地址


应该是这样吧!

我所说的不同的端口是指的这个Web Server返回数据的端口。
Web server当然是要绑定在自己的80端口,
当客户连接后,
返回数据用的是Web server的哪个端口呢?
也是80端口吗?
它即要监听网络,又要输出数据?

我脑子有点乱了,抱歉! :help
回复 支持 反对

使用道具 举报

发表于 2005-3-5 13:00:18 | 显示全部楼层
周末到屋外走走,呼吸一下新鲜空气,然后再回来想想,一切就都清楚啦。我有时候也会想一个问题太久反而越来越糊涂,但是适当转移一下注意力,然后回头再想想,说不定会有意想不到的结果:-)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表