GEMINIGHT 警告:您的浏览器不支持JavaScript将无法正常浏览!
Warning: Your browser does not support JavaScript!
注册(Register) | 登录(Login)
看随机帖

主站(Home) »  论坛(Forum)  » 程序编写(Program)
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
TCP/IP协议做服务器,http协议做客户端的实现 1樓
Tags: 协议

Tags引力关联贴
以下文章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]
SIGNATURE
Using codes to create beauty, that is my pride.
发表于:2006-9-18 22:56(约17年前)  访问量:1301
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
2樓
[em08]
SIGNATURE
Using codes to create beauty, that is my pride.
发表于:2006-9-20 13:23(约17年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6414
积分:41794
阅读权限:200
3樓

谢谢指教,我对网络编程了解不是很深。

\N

我喜欢用UDP(C++语言),能否发HTTP包啊?

\N

另外,以后上传东西建议去上传专区:http://www.geminight.com/upload

SIGNATURE
我的Blog网址:blog.geminight.com
发表于:2006-9-20 16:44(约17年前)
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
4樓

从理论上来说,用UDP的话,只要在内容前加上http头就可以了,不过,没试过

\N

我用UDP的时候,一般是为了实现大数据量的广播发送,特别是在局域网中;UDP属于广播型协议,发http也像不太适合,还是TCP好。

\N

个人觉得在互联网中,还是TCP好。

\N\N

另外,大版主,论坛怎么不可以自动登陆了?明明选了保存一年,但,每次总是要我重新输入用户名和密码。晕死了。

SIGNATURE
Using codes to create beauty, that is my pride.
发表于:2006-9-20 20:28(约17年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6414
积分:41794
阅读权限:200
5樓

我喜欢UDP不只是因为能组播,关键是他能进行P2P发送数据。而且可以在不建立联接时发包,据说效率也高。由于它利大于弊,所以我才喜欢UDP。TCP在用路由网关的电脑和远程电脑之间几乎无法进行联接,除非路由给你开端口。有空你可以实验一下,在你家电脑上开个服务端,然后到网吧运行客户端,看看是否联的起来、、、?

\N

“自动登陆”;也许是你系统的问题,我这里只是偶尔要我重新输入用户名和密码,决不是每次。


SIGNATURE
我的Blog网址:blog.geminight.com
发表于:2006-9-21 07:24(约17年前)

标题(Title):
关键字标签(Tags):
路人:回贴可以不必登录