季老大及其它老大请进,关于ServerSocket的问题

时间:2022-02-27 23:56:47
各位老大,我正在写一个即时通讯的程序,主要是想实现跨内网的通讯,通讯的终端可能在两个不同的内网中,而服务器是放在外网中的。我现在的想法是每个客户端连接时,这socket引连接都保存起来,下次如果有人向这些客户发信息,就找到这个客户相应的连接,通过这个连接向客户发信息。我想问大家,这样可以吗?

    我现在初步想在ServerSocket用阻塞式多线程,这样有多少用户就有多少线程,机子会不会吃不消啊!

    如果用非阻塞式,会不会有问题,效率怎么样?

    请大家指导一下,给我提供一些思路,看看有没有什么更好的办法没有?如果确实应该这样做,应该注意那些方面?

    如果分不够,可以另开贴加分,请大家帮忙了!

20 个解决方案

#1


learn

#2


顶上来

#3


up

#4


是否用阻塞看你自己,2种我都看过,效率这个东西看你自己怎么写而已

#5


我聽說用非阻塞式在用戶數目多的情況下可能會有問題﹐是嗎?

#6


其实非阻塞是系统在帮你轮循,阻塞是自己轮循,都差不多的。

#7


你这样子搞的是P2P,P2P中用Tcp好些有点......还是用UDP吧

#8


各位老大,我正在写一个即时通讯的程序,主要是想实现跨内网的通讯,通讯的终端可能在两个不同的内网中,而服务器是放在外网中的。我现在的想法是每个客户端连接时,这socket引连接都保存起来,下次如果有人向这些客户发信息,就找到这个客户相应的连接,通过这个连接向客户发信息。我想问大家,这样可以吗?

=================================
一般来说,不可以

#9


你这样子看上去应该是P2P,P2P还是用UDP比较好。不过我还没有用UDP写过程序。

#10


非阻塞的话500个用户没问题

#11


向星星老大们学习^^

#12


jishiping(JSP 季世平) ( ) 信誉:209  2005-10-07 21:52:00  得分: 0  
 
 
   你这样子看上去应该是P2P,P2P还是用UDP比较好。不过我还没有用UDP写过程序。
  
 
----------------------------------------------------------------------------
用UDP怎样通过外网在两个不同内网之间进行通讯呢?

#13


上面我已经说了,我没有用UDP写过程序。不过两个内网和一个外网,两个内网之间用UDP可能不行。不过我对UDP也不是很了解,说的不一定对。笨笨的方法,就是楼主说的吧,一开始两个内网先连接到外网。两个内网之间做通讯,用外网做中转。就是内网发送数据到外网,外网收到数据后再转送到另一个内网。中间的协议(数据格式),由自己定义。不过这种情况下,外网(TServerSocket)还是用非阻塞型的好一点。

#14


跨内网必需是p2p的方式,使用UDP通讯,TCP肯定是不行的了,实现p2p必需有一个固定IP的服务器,接收两个内网的信息,进行转发,建立了p2p之后就可以穿透局域网,这个收到路由器或者代理服务器的限制,一半问题不大,但是需要处理的情况也是比较复杂的,不同网络状况都需要考虑。如果连接客户端并不多的情况下,也可以使用服务器中转的方式,异步通讯至少可以支持500~1000个客户端进行信息转发,但是受到服务器数据结构的影响,合理的话,应该可以支持更多的连接数量。

#15


季老大谦虚谨慎,是我们学习的榜样啊!

两个内网之间是可以用UDP直接通讯的,不过前提是要有一个服务器,告之对方的映射端口。

阻塞和非阻塞Windows和Linux的开发人员都会吵架,所以我们是分不清哪个好的。

阻塞的优点就是可控性更强一点,缺点当然是要自己建立线程来处理每一个连接。
非阻塞用消息通知(Linux下是要自己查询的),使用起来比较方便,不用建立多线程。

如果用Borland开发工具的话可以用Indy组件,它的功能比较强大,但是它各个版本之间的兼容性不太好,如果升级就要改代码。

也可以用Borland自带的TUdpSocket控件,但是它比较简单,要自己建立线程处理机制。

#16


shadowstar(CodeFast.very fast...) ( ) 信誉:93  2005-10-08 15:46:00  得分: 0  
 
 
两个内网之间是可以用UDP直接通讯的,不过前提是要有一个服务器,告之对方的映射端口。

----------------------------------------------------------------------------
请问什么是”对方的映射端口”﹐怎样” 告之对方的映射端口”呢?
不好意思﹐我对UDP不熟﹐shadowstar能给我一些源码吗?

#17


如果是中转的话,TCP和UDP都没有问题;
假如采用P2P方式的话,只能用UDP;
映射端口是内网机器在其网关服务器上申请的端口;

#18


可以实现~~如果2个内网终端有过信息来往的话~就可以直接通信~~刚刚开始2个终端是不知道对方的IP和端口的,如何来使他们有来往呢~这就要通过服务器来实现

#19


在BCB的帮助中关于ClientSocket的OnRead方法有这么一句话﹕
 “Non-blocking sockets do not always receive an OnRead event for the last bit of data passed over the connection. When using a non-blocking socket, check for any unread data in the OnDisconnect event to make sure that everything is handled.”
那么是不是只有在服务器端关闭了连接之后才能确保客户端收到完整的信息。如果是这样的话﹐我要在一个连接发送几次往返的信息﹐是不是就不能用Non-blocking模式了?

#20


@#$%,误入高手深处

#1


learn

#2


顶上来

#3


up

#4


是否用阻塞看你自己,2种我都看过,效率这个东西看你自己怎么写而已

#5


我聽說用非阻塞式在用戶數目多的情況下可能會有問題﹐是嗎?

#6


其实非阻塞是系统在帮你轮循,阻塞是自己轮循,都差不多的。

#7


你这样子搞的是P2P,P2P中用Tcp好些有点......还是用UDP吧

#8


各位老大,我正在写一个即时通讯的程序,主要是想实现跨内网的通讯,通讯的终端可能在两个不同的内网中,而服务器是放在外网中的。我现在的想法是每个客户端连接时,这socket引连接都保存起来,下次如果有人向这些客户发信息,就找到这个客户相应的连接,通过这个连接向客户发信息。我想问大家,这样可以吗?

=================================
一般来说,不可以

#9


你这样子看上去应该是P2P,P2P还是用UDP比较好。不过我还没有用UDP写过程序。

#10


非阻塞的话500个用户没问题

#11


向星星老大们学习^^

#12


jishiping(JSP 季世平) ( ) 信誉:209  2005-10-07 21:52:00  得分: 0  
 
 
   你这样子看上去应该是P2P,P2P还是用UDP比较好。不过我还没有用UDP写过程序。
  
 
----------------------------------------------------------------------------
用UDP怎样通过外网在两个不同内网之间进行通讯呢?

#13


上面我已经说了,我没有用UDP写过程序。不过两个内网和一个外网,两个内网之间用UDP可能不行。不过我对UDP也不是很了解,说的不一定对。笨笨的方法,就是楼主说的吧,一开始两个内网先连接到外网。两个内网之间做通讯,用外网做中转。就是内网发送数据到外网,外网收到数据后再转送到另一个内网。中间的协议(数据格式),由自己定义。不过这种情况下,外网(TServerSocket)还是用非阻塞型的好一点。

#14


跨内网必需是p2p的方式,使用UDP通讯,TCP肯定是不行的了,实现p2p必需有一个固定IP的服务器,接收两个内网的信息,进行转发,建立了p2p之后就可以穿透局域网,这个收到路由器或者代理服务器的限制,一半问题不大,但是需要处理的情况也是比较复杂的,不同网络状况都需要考虑。如果连接客户端并不多的情况下,也可以使用服务器中转的方式,异步通讯至少可以支持500~1000个客户端进行信息转发,但是受到服务器数据结构的影响,合理的话,应该可以支持更多的连接数量。

#15


季老大谦虚谨慎,是我们学习的榜样啊!

两个内网之间是可以用UDP直接通讯的,不过前提是要有一个服务器,告之对方的映射端口。

阻塞和非阻塞Windows和Linux的开发人员都会吵架,所以我们是分不清哪个好的。

阻塞的优点就是可控性更强一点,缺点当然是要自己建立线程来处理每一个连接。
非阻塞用消息通知(Linux下是要自己查询的),使用起来比较方便,不用建立多线程。

如果用Borland开发工具的话可以用Indy组件,它的功能比较强大,但是它各个版本之间的兼容性不太好,如果升级就要改代码。

也可以用Borland自带的TUdpSocket控件,但是它比较简单,要自己建立线程处理机制。

#16


shadowstar(CodeFast.very fast...) ( ) 信誉:93  2005-10-08 15:46:00  得分: 0  
 
 
两个内网之间是可以用UDP直接通讯的,不过前提是要有一个服务器,告之对方的映射端口。

----------------------------------------------------------------------------
请问什么是”对方的映射端口”﹐怎样” 告之对方的映射端口”呢?
不好意思﹐我对UDP不熟﹐shadowstar能给我一些源码吗?

#17


如果是中转的话,TCP和UDP都没有问题;
假如采用P2P方式的话,只能用UDP;
映射端口是内网机器在其网关服务器上申请的端口;

#18


可以实现~~如果2个内网终端有过信息来往的话~就可以直接通信~~刚刚开始2个终端是不知道对方的IP和端口的,如何来使他们有来往呢~这就要通过服务器来实现

#19


在BCB的帮助中关于ClientSocket的OnRead方法有这么一句话﹕
 “Non-blocking sockets do not always receive an OnRead event for the last bit of data passed over the connection. When using a non-blocking socket, check for any unread data in the OnDisconnect event to make sure that everything is handled.”
那么是不是只有在服务器端关闭了连接之后才能确保客户端收到完整的信息。如果是这样的话﹐我要在一个连接发送几次往返的信息﹐是不是就不能用Non-blocking模式了?

#20


@#$%,误入高手深处

#21