弱问关于即时通信

时间:2021-02-11 13:24:56
本人要做一个类似qq的软件,两台主机之间都要安装我做的软件才能通信。现有疑问如下:

1、二者进行通信时,是直接端对端发送信和传送文件?还是先对服务器通信,然后服务器转发消息给目标主机?

2、如果是端对端直接发送是不是不需要服务器即可运行?可是监听的端口号怎么确定呢?因为客户端进行tcp通信时,每次开启的端口不一样,都是随即分配的。而只有服务器的端口是固定的,一直处于监听状态。

3、如果是通过服务器转发,那么传送文件怎么处理?我设想的传送文件用tcp,而发送即时信息用udp?如何在两台客户机之间建立直接的tcp连接?是否必固定双方端口?

谢谢。

14 个解决方案

#1


1、两者皆可,效率前者高,网络情况复杂时前者可能连不通
2、服务器维护的是用户在线状态,以及特殊情况下的消息转发,客户端端口也是由服务器维护的
3、由服务器维护客户端端口号

#2


请问楼上的 由服务器维护客户端端口号 这话什么意思

#3


1、二者进行通信时,是直接端对端发送信和传送文件?还是先对服务器通信,然后服务器转发消息给目标主机?

一个是即时通讯,另外一个是离线消息

2、如果是端对端直接发送是不是不需要服务器即可运行?可是监听的端口号怎么确定呢?因为客户端进行tcp通信时,每次开启的端口不一样,都是随即分配的。而只有服务器的端口是固定的,一直处于监听状态。

监听的端口号肯定是固定的,客户端的话,通过TCP连接即可回传数据

3、如果是通过服务器转发,那么传送文件怎么处理?我设想的传送文件用tcp,而发送即时信息用udp?如何在两台客户机之间建立直接的tcp连接?是否必固定双方端口?

服务器转发传送文件的话,就只能在服务器上缓存了

#4


那请问楼上的 如何固定监听的端口号呢?

#5


我用c# udpclient 怎么没有bind这个成员函数呢 2个客户端通信不需要知道服务器地址阿 怎么udpclient里面全是关于和服务器建立通信的函数 ?

#6


还是不大明白 我现在要做一个类似QQ的软件 如果2个好友之间发送文字聊天的话 在。net里是用udpclient么?是的话 怎么去绑定端口号呢?因为udp连接有四步 socket-bind-send/recv-close 怎么用bind这一步阿?

#7


我也是菜鸟。不过前几天我们留过这方面的作业,所以就看一下。我原本也想做成 QQ 的样子。但是后面放弃了。我的看法是,如果客户端端口是随机分配的,那么肯定需要一个服务器。如果客户端端口固定,那么只需要让两台机器上的客户端知道对方的 ip 就行了。

我做了一个 PostOffice 类实现收发。同步不同步,异步不异步的,有点不太好了。不过好歹我觉得还算清晰。收发的信息我用的是自定义的 Package 类。所以,我觉得比 MSDN 上给的例子更好一点。最起码,MSDN 上给的例子程序运行起来是不能正常结束的。

我一会把我的例子写到 Blog 上去,写完了就帖上来,希望能对你有所帮助。

#8


http://www.cnblogs.com/ydong/archive/2007/05/06/737026.html

这是我写的随笔的 url

#9


study

#10


efijki(YD)谢谢你
我也是很困惑客户端端口随即分配这件事 问题是qq的好友聊天是不经过服务器的 我想 所以很想知道他们是怎么作的

#11


UdpClient的构造函数有一个是绑定本地端口的. 所以不需要bind()了.

#12


To dairuijia:

QQ 它一定会经过服务器。它只需要登录到服务器,服务器就能知道它的端口号是多少,然后通知想与这个客户端进行对话的其它客户端。不然的话,QQ 登录是为了什么?其它的客户端也根本不可能扫描六万多个端口来找它需要的 QQ 端口的。

知道 ip 和端口才能通信,我觉得这应该是 Socket 通信的基础。

我原来就是想按这个想法做个登录服务器,后来由于时间原因取消了。我觉得 QQ 需要服务器来告诉其它客户端的端口的证明是,如果你无法登录到服务器,那么你就无法与其它人聊天,尽管聊天方式被设置成点对点了。

#13


efijki(YD)
对的 我是这样想的:

先登录服务器 在服务器注册本次登录的IP号码 登录之后就建立UDP套接字 直到关闭QQ为止 

这个是用到局域网中 客户端会向服务器发送在线的信号和查找好友在线情况(这个在线问题QQ怎么处理的不是很了解)  

如果要向某个好友发消息 双击的时候先查数据库在不在线(因为有可能隐身) 在线则获取他的IP地址进行聊天 不在线则把留言发给数据库暂时保存  

这个中间先不考虑突然掉线或者死机或者中间换个IP号等异常情况 我现在能想到的处理异常 就是每次发送消息之前都去数据库查询是否在线 显然这个过程对服务器压力太大 所以现在只能这样处理:一旦打开聊天界面 二者进行对话 就认定是在线的 直到关闭聊天界面为止 第二次再双击的时候再去查询数据库是隐身还是不在线 至于在线或者离开就不需要查询 直接发送就可以了

您有没有更好的想法?

#14


关于这个我没想太多。我想既然是小型程序,那不太需要考虑服务器的压力问题。。。

如果你要做个正式的项目,那应该找你们老师问问,或者去问问这里带 * 号的牛人。

#1


1、两者皆可,效率前者高,网络情况复杂时前者可能连不通
2、服务器维护的是用户在线状态,以及特殊情况下的消息转发,客户端端口也是由服务器维护的
3、由服务器维护客户端端口号

#2


请问楼上的 由服务器维护客户端端口号 这话什么意思

#3


1、二者进行通信时,是直接端对端发送信和传送文件?还是先对服务器通信,然后服务器转发消息给目标主机?

一个是即时通讯,另外一个是离线消息

2、如果是端对端直接发送是不是不需要服务器即可运行?可是监听的端口号怎么确定呢?因为客户端进行tcp通信时,每次开启的端口不一样,都是随即分配的。而只有服务器的端口是固定的,一直处于监听状态。

监听的端口号肯定是固定的,客户端的话,通过TCP连接即可回传数据

3、如果是通过服务器转发,那么传送文件怎么处理?我设想的传送文件用tcp,而发送即时信息用udp?如何在两台客户机之间建立直接的tcp连接?是否必固定双方端口?

服务器转发传送文件的话,就只能在服务器上缓存了

#4


那请问楼上的 如何固定监听的端口号呢?

#5


我用c# udpclient 怎么没有bind这个成员函数呢 2个客户端通信不需要知道服务器地址阿 怎么udpclient里面全是关于和服务器建立通信的函数 ?

#6


还是不大明白 我现在要做一个类似QQ的软件 如果2个好友之间发送文字聊天的话 在。net里是用udpclient么?是的话 怎么去绑定端口号呢?因为udp连接有四步 socket-bind-send/recv-close 怎么用bind这一步阿?

#7


我也是菜鸟。不过前几天我们留过这方面的作业,所以就看一下。我原本也想做成 QQ 的样子。但是后面放弃了。我的看法是,如果客户端端口是随机分配的,那么肯定需要一个服务器。如果客户端端口固定,那么只需要让两台机器上的客户端知道对方的 ip 就行了。

我做了一个 PostOffice 类实现收发。同步不同步,异步不异步的,有点不太好了。不过好歹我觉得还算清晰。收发的信息我用的是自定义的 Package 类。所以,我觉得比 MSDN 上给的例子更好一点。最起码,MSDN 上给的例子程序运行起来是不能正常结束的。

我一会把我的例子写到 Blog 上去,写完了就帖上来,希望能对你有所帮助。

#8


http://www.cnblogs.com/ydong/archive/2007/05/06/737026.html

这是我写的随笔的 url

#9


study

#10


efijki(YD)谢谢你
我也是很困惑客户端端口随即分配这件事 问题是qq的好友聊天是不经过服务器的 我想 所以很想知道他们是怎么作的

#11


UdpClient的构造函数有一个是绑定本地端口的. 所以不需要bind()了.

#12


To dairuijia:

QQ 它一定会经过服务器。它只需要登录到服务器,服务器就能知道它的端口号是多少,然后通知想与这个客户端进行对话的其它客户端。不然的话,QQ 登录是为了什么?其它的客户端也根本不可能扫描六万多个端口来找它需要的 QQ 端口的。

知道 ip 和端口才能通信,我觉得这应该是 Socket 通信的基础。

我原来就是想按这个想法做个登录服务器,后来由于时间原因取消了。我觉得 QQ 需要服务器来告诉其它客户端的端口的证明是,如果你无法登录到服务器,那么你就无法与其它人聊天,尽管聊天方式被设置成点对点了。

#13


efijki(YD)
对的 我是这样想的:

先登录服务器 在服务器注册本次登录的IP号码 登录之后就建立UDP套接字 直到关闭QQ为止 

这个是用到局域网中 客户端会向服务器发送在线的信号和查找好友在线情况(这个在线问题QQ怎么处理的不是很了解)  

如果要向某个好友发消息 双击的时候先查数据库在不在线(因为有可能隐身) 在线则获取他的IP地址进行聊天 不在线则把留言发给数据库暂时保存  

这个中间先不考虑突然掉线或者死机或者中间换个IP号等异常情况 我现在能想到的处理异常 就是每次发送消息之前都去数据库查询是否在线 显然这个过程对服务器压力太大 所以现在只能这样处理:一旦打开聊天界面 二者进行对话 就认定是在线的 直到关闭聊天界面为止 第二次再双击的时候再去查询数据库是隐身还是不在线 至于在线或者离开就不需要查询 直接发送就可以了

您有没有更好的想法?

#14


关于这个我没想太多。我想既然是小型程序,那不太需要考虑服务器的压力问题。。。

如果你要做个正式的项目,那应该找你们老师问问,或者去问问这里带 * 号的牛人。