该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-09
bachmozart 写道 另外,dennis_zane 老大,诚心向你请教我对IO模型理解哪里有问题呀? 哈哈,追到这个帖子里来了。 |
|
返回顶楼 | |
发表时间:2009-02-09
最后修改:2009-02-09
哈哈,是呀,dennis_zane 老大也太不讲究啦,光告诉我说我理解不对,就是不告诉我哪里不对,我很想知道的呀,o(∩_∩)o...
我只知道我少说了一个信号驱动模型,呵呵 决定了以后每次看到dennis_zane老大的帖子,都问他一遍,他不告诉我答案,我誓不罢休.o(∩_∩)o... |
|
返回顶楼 | |
发表时间:2009-02-09
嘿嘿,准备翻翻rmi,hassian,jdbc driver的源码,看看里面对于网络流是怎么控制的,这个帖子应该继续讨论下去
|
|
返回顶楼 | |
发表时间:2009-02-09
TCP网络流的控制在于协议
|
|
返回顶楼 | |
发表时间:2009-02-09
如果要写一个网络通讯程序,你会像hassian一样,先写一组自己的IO包么,基于原始outputStream再次封装,考虑一下几种情况
1、请求-》数据 例如“我要用户名为admin的用户的详细信息”,则把"admin"和服务器端处理这个请求的服务类“serachuser”作为参数写入socket的outputStream。 2、请求+数据-》状态 例如“我要把file1文件存到服务器的c盘下”,则把命令“save”,路径“c:”和文件流写到socket的outputStream中,返回存储成功。 那么该如何组织这些通讯,把admin和serachuser拼装在一起“serachuser_Admin”到服务器上拆开解析还是分为两次通讯第一次发送serachuser返回ready状态再发送admin?? 如果更复杂的第二种情况,将命令save和文件字节流拼在一起再解析显然比较困难,我以前的解决方法是用xml文件,<command>save</command><content>文件的2进制码的base64编码</content>,这样写会让文件变得非常的大,增加了不必要的传输量。如果将文件和“save”分为2此通讯,那这两次通讯应该是属于同一个事务,又怎么保证事务的完整性。 |
|
返回顶楼 | |
发表时间:2009-02-12
不错的分享,不过有一些细节可能楼主忽略了
1.一般来说发送的http request正文并没有\0这么一个ending flag,而且大多数情况client的request在网络上并没有ending flag,这时候你的程序就没法判断了。 而在http协议中是通过Content-length这个属性来设置长度的,这个是正文byte数组的长度(并非char数组的长度,例如中文若以UTF-8编码则每个汉字占3个字节),只有按照这个读取才能保证准确无误。 2.网络字节流是基于byte的,如果你一上来就 linliangyi2007 写道 BufferedReader br = new BufferedReader( new InputStreamReader(in) , 4096); 会把inputstream的字节流强制转换成你的JVM charset,可能是GBK,GB18030或是UTF-8。 那么两边编码解码不一致,你的读也就不会正确了。 |
|
返回顶楼 | |
发表时间:2009-02-12
unsid 写道 (3) 之前和别人讨论过关于网络通讯如何判断字节流是否接收完毕的话题,有人说"-1"是判断从文件读取的流,不能用来判断网络流,还有有人用in.avaliable()来判断该读取多少,你认为是否合理?我用in.avaliable()判断过,结果是不对的... in.available()是说无阻塞情况下当前所能读的长度,不能用这个来判断。 我试过程序里如果流很大这个值有可能是8k(流是超过8k的),但有时候可能会是0(网络阻塞)。 所以有时候你会现程序在run模式这个值是0,而debug模式这个值并不是0,因为程序debug模式下一般是不会阻塞的。 |
|
返回顶楼 | |
发表时间:2009-02-12
swift 写道 不错的分享,不过有一些细节可能楼主忽略了
1.一般来说发送的http request正文并没有\0这么一个ending flag,而且大多数情况client的request在网络上并没有ending flag,这时候你的程序就没法判断了。 而在http协议中是通过Content-length这个属性来设置长度的,这个是正文byte数组的长度(并非char数组的长度,例如中文若以UTF-8编码则每个汉字占3个字节),只有按照这个读取才能保证准确无误。 2.网络字节流是基于byte的,如果你一上来就 linliangyi2007 写道 BufferedReader br = new BufferedReader( new InputStreamReader(in) , 4096); 会把inputstream的字节流强制转换成你的JVM charset,可能是GBK,GB18030或是UTF-8。 那么两边编码解码不一致,你的读也就不会正确了。 这位兄弟说的是。不过你回的急了些,我在回帖中已经说了使用byte的两种情况,其中就包括了协议过程中包含length标记的 |
|
返回顶楼 | |
发表时间:2009-02-12
我做过的一个项目正好相反,是Java的服务端和C++的客户端通讯.
对于Java的Server,大家有什么建议. |
|
返回顶楼 | |
发表时间:2009-02-12
danielzhan 写道 我做过的一个项目正好相反,是Java的服务端和C++的客户端通讯.
对于Java的Server,大家有什么建议. 在网络通信方面,最终的处理跟语言的干系不大,还是看双方的通信协议是怎样的,一切以通讯协议的特点出发吧。 |
|
返回顶楼 | |