chengen
注册于:2005年7月28日 等级:高级会员 帖子数:97 积分:1124 阅读权限:40 | |
以下文章chengen发表于Java/VC++技术交流群(18547717)。 以下讨论技术广泛应用于所有语言,这里基于Java ME讨论。 因为目前很多手机仍不支持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与客户端连接,连接一次一个线程。) 已将示例代码上传于附件,有兴趣的可以下载来看看。[attach]158[/attach]
|
Using codes to create beauty, that is my pride. |
|
| 🗓2006-9-18 22:56(约18年前) 👁1304 |
|
|
chengen
注册于:2005年7月28日 等级:高级会员 帖子数:97 积分:1124 阅读权限:40 | |
[em08]
|
Using codes to create beauty, that is my pride. |
|
|
|
Jeminai
自称:雙子騎士注册于:2005年5月26日 等级:站长 帖子数:6428 积分:41808 阅读权限:200 | |
|
|
|
chengen
注册于:2005年7月28日 等级:高级会员 帖子数:97 积分:1124 阅读权限:40 | |
从理论上来说,用UDP的话,只要在内容前加上http头就可以了,不过,没试过 \N我用UDP的时候,一般是为了实现大数据量的广播发送,特别是在局域网中;UDP属于广播型协议,发http也像不太适合,还是TCP好。 \N个人觉得在互联网中,还是TCP好。 \N\N另外,大版主,论坛怎么不可以自动登陆了?明明选了保存一年,但,每次总是要我重新输入用户名和密码。晕死了。
|
Using codes to create beauty, that is my pride. |
|
|
|
Jeminai
自称:雙子騎士注册于:2005年5月26日 等级:站长 帖子数:6428 积分:41808 阅读权限:200 | |
我喜欢UDP不只是因为能组播,关键是他能进行P2P发送数据。而且可以在不建立联接时发包,据说效率也高。由于它利大于弊,所以我才喜欢UDP。TCP在用路由网关的电脑和远程电脑之间几乎无法进行联接,除非路由给你开端口。有空你可以实验一下,在你家电脑上开个服务端,然后到网吧运行客户端,看看是否联的起来、、、? \N“自动登陆”;也许是你系统的问题,我这里只是偶尔要我重新输入用户名和密码,决不是每次。
|
我的Blog网址:blog.geminight.com |
|
|