TCP/IP协议(Socket)做服务器,HTTP协议做客户端(已实现,分享)

chengen22 2006-09-18 11:00:31
前几天在本区看到一个贴子,有人问,在Socket做服务器,在手机上用Http访问,如何实现。这个贴子,有十来个人回复了,可惜回复的都是:Socket使用TCP/IP协议,客户端用HTTP协议,不同协议不可能实现通讯。再可惜,那个贴子结了,要不然,我就可以回复了!在这里拿出来说一下,让大家不要再误会了(TCP/IP与HTTP不可通讯)
因为目前很多手机仍不支持MIDP2.0,只支持MIDP1.0,而Socket技术只在MIDP2.0才提供支持,所以,一般的Java ME程序的如果要实现C/S结构,都会选用Tomcat等服务器、sevlet或JavaBean等Java EE架构实现。不过,考虑到响应速度与性能的问题,Tomcat等Java EE架构可能满足不了业务要求,这样,我们就要用到下面将要说的自已写服务器的技术了。
一般的C/S结构程序,一般程序员都会写,不过,这里一般程序员刚接触Socket写服务器,Http写客户端都会头大——不可能吧,Socket用TCP/IP协议,客户端用Http协议,不同协议间,怎么可能通讯呢!
本文要说的就是这个问题了。
大家一定都知道,网络系统一共分7层,在这七层中,Http协议要高于TCP/IP协议(因为在互联网中,计算机是通过IP定位的,也就是用TCP/IP协议了),对网络操作系统有了解的人,一定不会忘记,我们用Http访问www的时候,用的是域名,而域名,最终还是要通过DNS转换成IP地址的。这就对了——HTTP协议基于TCP/IP协议!而Socket正是基于TCP/IP协议,这样一来,它们就有了共同之外了!有了以上的认识,理论方面就没问题了。
我们再讨论一下实现:
服务器:
和一般的C/S结构一样,用Socket(java中用ServerSocket)监听。监听、读写消息的方面与一般的C/S服务器一模一样。不同的是,考虑到客户端只支持http协议,所以,读客户端消息的时候,读到的将是http头+消息,那么,我们便要用程序分析并去掉http头,只用消息。发消息的时候正好相反,在发送的消息前面,自己加上http头(其实就是一个包含一定内容的字符串),这样再发出去,客户端就可以收到并读取了。
客户端:
用Http连接,在java中,用的是HttpConnection.open("http://"+IP+":"+Port)访问服务器,这样,就可以向ServerSocket请求连接了。
在open之后,再向HttpConnection对象的输出流写入消息,然后刷新流再关闭HttpConnection就可以了,客户端因为本来用的就是http协议,所以不用自行加http头,底层会处理的;服务器在Accept()之后,就可以从Socket的输入流读到消息了。当然,如果要读服务器的消息的话,可以在HttpConnection关闭前读它的输入流(读的时候,如果还没有收到服务器消息,会阻塞当前线程的,直到读到为止,不怕读不到)。客户端读到的消息,是不包括http头的,所以,也就不用我们自行处理了。
要注意的是,HttpConnetion.open后,只能用一次,刷新后,它就无效了,得重新调用open方法再次建立连接。(服务器最好使用线程建立Socket与客户端连接,连接一次一个线程。)
现在在家里,未例的代码放在公司了,明天如果记得的话,回公司上传个示例代码给大家借鉴。
...全文
3677 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
hengxxh 2007-04-20
  • 打赏
  • 举报
回复
支持楼主,值得研究!
83born 2006-11-13
  • 打赏
  • 举报
回复
好贴
sunplayer 2006-11-09
  • 打赏
  • 举报
回复
感谢高手的分享,学习下
to_top 2006-11-07
  • 打赏
  • 举报
回复
收藏,以后再研究,我很菜现在看不懂
jackxing 2006-10-30
  • 打赏
  • 举报
回复
好东东,学习
grasshoper97 2006-10-30
  • 打赏
  • 举报
回复
说实话,服务器端的代码有点不好,没必要用3个类,特别是hs.s = ss.accept();这个做法太哪个了.
chengen22 2006-10-04
  • 打赏
  • 举报
回复
cuilichen(fjfjfjfj):
想要了解一下,楼主的架构商用了吗?

这个,谈不上是什么架构吧,也就一个基于j2me的连接方式而已。。。。。。
chengen22 2006-10-04
  • 打赏
  • 举报
回复
商用ing。
J2ME_IS_ALL 2006-10-04
  • 打赏
  • 举报
回复

TCP/IP协议(Socket)做服务器,HTTP协议做客户端(已实现,分享)
请问,您懂不懂TCP/IP,socket,http的关系??
请您先弄明白他们之间的关系,再发帖子,真让人笑话!

好象说这话的这位到是有点让人笑话吧?
cuilichen 2006-09-30
  • 打赏
  • 举报
回复
想要了解一下,楼主的架构商用了吗?
cccloveyf 2006-09-30
  • 打赏
  • 举报
回复
引用:woaiwanghuan(我不学习是猪)
TCP/IP协议(Socket)做服务器,HTTP协议做客户端(已实现,分享)
请问,您懂不懂TCP/IP,socket,http的关系??
请您先弄明白他们之间的关系,再发帖子,真让人笑话!
---------------------------------------------------------------
希望说这些话之前,先把你的理解贴出来。
bengan 2006-09-30
  • 打赏
  • 举报
回复
jspxnet 2006-09-29
  • 打赏
  • 举报
回复
顶你个肺,不错
chengen22 2006-09-29
  • 打赏
  • 举报
回复
可以的。
IP静不静态无所谓,如果在局域网中,局域网内的IP也可以的。
服务端用ServerSocket监听后,就可以了,不用其它设置了,当然,防火墙要开放ServerSocket监听的端口。
因为你的异常有两种可能,所以,你不妨用一个比较好的模拟器来运行你的程序,这样,可以判断是否第一种异常。嗯,在测试的时候,你就把服务器放在本机吧,这样可以避免意外。
最近挺忙的,没能及时回复你,真是抱歉!
zxh2208180 2006-09-27
  • 打赏
  • 举报
回复
顶 收藏了
allen_white 2006-09-27
  • 打赏
  • 举报
回复
服务器端需要特别的设置吗?我在一个有静态IP的机子上运行了一个一般的Tcp服务器端,可以吗?
chengen22 2006-09-27
  • 打赏
  • 举报
回复
楼上的:
这个异常的原因有两种:
1、手机不支持当前协议
2、找不到连接目标
allen_white 2006-09-27
  • 打赏
  • 举报
回复
请教搂主,我用socket连接,可是直接抛出ConnectionNotFoundException异常了,不清楚是什么原因。
谁能告诉我原因阿。。。。
Squall1009 2006-09-26
  • 打赏
  • 举报
回复
其实手机这边直接socket 也ok了
allen_white 2006-09-26
  • 打赏
  • 举报
回复
为什么客户端不直接用SocketConnection呢?
加载更多回复(15)

13,100

社区成员

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

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