用JAVA开发一个即时聊天系统,用Socket还是应该用HTTP?

奶爸 2014-03-03 10:20:01
  RT,这个问题纠结了很长时间了,一直没搞太清楚。

  还有几个问题:
  1. 网上说HTTP可以穿越网关,能说的具体一点吗?
  2. 我原来打算用UDP Socket,难道这样不能穿越网关吗?
  3. 客户端通信时,消息是直接从一个客户端发给另一个客户端,还是应该经过服务器?

  求大神指点!谢谢!!
...全文
2894 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
奶爸 2016-06-06
  • 打赏
  • 举报
回复
忘记结贴了。。。 最终聊天服务器采用了TCP Socket进行通信。不考虑打洞。所有消息都有Server进行转发。在不考虑性能的情况下,这是一种很简单的实现方法。自己设计了一套简单的通信协议,包括上下线提醒,消息提醒等等,使用mysql存储所有数据,(现在想一想用Redis也许挺好)。最终可以实现几十个客户端同时在线。 如果聊天的内容包括即时的音视频聊天的话,那么再服务器转发的话,对于带宽和服务器的压力就比较大了。打洞是一个很好的选择。但是我的毕设没有这个功能,所以就没有打洞。 至于打洞,不论是UDP还是TCP,只要想让两个客户端之间直接通信,几乎必须打洞。毕业后在工作中涉及到打洞的工作。打洞的过程很复杂,尤其是在2个对称型NAT之间打洞。具体原理我以后也许会写文章详细描述一下。 关于XMPP,openfire之类的,我当时实在是没有耐心去仔细研究了,所以这种方法实现起来的效果我也不知道。 关于公开代码,说实话,代码我已经找不到了。。。抱歉。。。而且现在想一想,一个run()函数有差不过一千行,代码风格是在太烂了。。。
tianfang 2015-05-13
  • 打赏
  • 举报
回复
XMPP协议 你考虑到HTTP技术,XMPP已经包括了BOSH ("Bidirectional-streams Over Synchronous HTTP") ,最新的RFC 7395 ( (XMPP) Subprotocol for WebSocket )也已经公布 基于xmpp, 你可以专注于业务层的开发,发展壮大后,再考虑底层协议升级。几万人的用oepnfire,几十万用tigase,再多就自己开发
24234234 2014-03-10
  • 打赏
  • 举报
回复
开发好了 能不能代码公开啊
奶爸 2014-03-10
  • 打赏
  • 举报
回复
引用 16 楼 wggcn 的回复:
开发好了 能不能代码公开啊
应该能呢吧~
奶爸 2014-03-10
  • 打赏
  • 举报
回复
引用 15 楼 coolbamboo2008 的回复:
要即时聊天,当然是socket啊,http要用ajax才能实现,多麻烦啊
我也觉得麻烦,但是没办法啊。。。老师要求的。。。
coolbamboo2008 2014-03-08
  • 打赏
  • 举报
回复
要即时聊天,当然是socket啊,http要用ajax才能实现,多麻烦啊
奶爸 2014-03-07
  • 打赏
  • 举报
回复
引用 7 楼 yxinf 的回复:
一般是用UDP为主,TCP为辅的混合通讯模式:登录到服务并保持长连接状态使用TCP; 各个客户端之间的即时聊天主要以性能优先,可以牺牲其传输的稳定可靠性,一般使用UDP, 客户端登录时后就可以从服务器端获取到其好友的登录及IP信息,发送消息的时候不用经过服务器中转, 不然用户量大的时候服务器随时会顶不住。
引用 12 楼 AFer198215 的回复:
  1. 网上说HTTP可以穿越网关,能说的具体一点吗?   2. 我原来打算用UDP Socket,难道这样不能穿越网关吗?   3. 客户端通信时,消息是直接从一个客户端发给另一个客户端,还是应该经过服务器? 大部分防火墙开放80端口 大部分防火墙最爱拦截udp 参见飞秋原理
谢谢大家的建议。我又问了问老师,老师的意思是必须用HTTP,因为要解决穿越网关的问题。所以,两个终端通信时,消息必须经过服务器。虽然UDP很适合即时通信,但是考虑到穿越网管的问题,暂时先不用,如果所有时间的话再实现。 现在的问题是:两个终端通信时,消息首先由一个终端通过HTTP方式发送给了服务器,服务器应该怎么通过HTTP的方式再传给另一个终端呢?
zhUfaNxiao 2014-03-07
  • 打赏
  • 举报
回复
继续关注,我最近也想做一个,不知楼主有木有推荐的?
想喝咖啡的貓 2014-03-06
  • 打赏
  • 举报
回复
  1. 网上说HTTP可以穿越网关,能说的具体一点吗?   2. 我原来打算用UDP Socket,难道这样不能穿越网关吗?   3. 客户端通信时,消息是直接从一个客户端发给另一个客户端,还是应该经过服务器? 大部分防火墙开放80端口 大部分防火墙最爱拦截udp 参见飞秋原理
jiekou0704 2014-03-06
  • 打赏
  • 举报
回复
websocket 应该可以的
想喝咖啡的貓 2014-03-06
  • 打赏
  • 举报
回复
引用 8 楼 lxy15329 的回复:
现在流行的websocket可不可以使用呢?个人觉得即时通讯与发布订阅很像,客户端在服务器端注册一次,声明要关注的队列,当对端给这个队列发消息时即时通知。拙见
websocket可以,不过这货现在有个非常严重的问题: 浏览器支持不足。 不过,倒是可以在网页上提供一下支持websocket的下载,这样貌似还是要比cs方便点。 传闻有个js库叫:socket.io.js,这货有些有趣的功能。
wz366 2014-03-06
  • 打赏
  • 举报
回复
我觉得是因为内网用户没有独立IP地址,所以你用socket连不上client端口,这时候就需要端口映射,或者用http.
teemai 2014-03-05
  • 打赏
  • 举报
回复
Socket就是专门做这事的
a805995924 2014-03-05
  • 打赏
  • 举报
回复
即时通讯http就不适合了 推荐tcp长连接模式
lxy15329 2014-03-05
  • 打赏
  • 举报
回复
现在流行的websocket可不可以使用呢?个人觉得即时通讯与发布订阅很像,客户端在服务器端注册一次,声明要关注的队列,当对端给这个队列发消息时即时通知。拙见
benluobo 2014-03-05
  • 打赏
  • 举报
回复
你没有服务器 客户端是不能直接通信的 客户端的信息都是服务器管理的
胖虎 2014-03-05
  • 打赏
  • 举报
回复
UDP的话要打洞吧??
yxinf 2014-03-05
  • 打赏
  • 举报
回复
一般是用UDP为主,TCP为辅的混合通讯模式:登录到服务并保持长连接状态使用TCP; 各个客户端之间的即时聊天主要以性能优先,可以牺牲其传输的稳定可靠性,一般使用UDP, 客户端登录时后就可以从服务器端获取到其好友的登录及IP信息,发送消息的时候不用经过服务器中转, 不然用户量大的时候服务器随时会顶不住。
dean0120 2014-03-04
  • 打赏
  • 举报
回复
必须是c-s-c
  • 打赏
  • 举报
回复
1. 网上说HTTP可以穿越网关,能说的具体一点吗? 。。。。   2. 我原来打算用UDP Socket,难道这样不能穿越网关吗? 你希望 发的聊天经常丢失么?   3. 客户端通信时,消息是直接从一个客户端发给另一个客户端,还是应该经过服务器? 服务器处理。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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