该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-17
难道不是么?
开始一堆的socket参数设置,其实不同的应用场景有不同的设置,这个跟优雅无关。 使用char读数据,charset也完全是跟c服务器要一致,如果优雅,应该使用一个通用的解决方案。其实这个问题还有c以0结尾的问题,都属于通讯协议的设计问题。似乎跟优雅也无关吧。 把这些东西扒掉,就剩下建立连接,最简单的读写数据,然后关闭连接。这不是hello world,还是啥? |
|
返回顶楼 | |
发表时间:2009-02-17
成抬杠贴了
|
|
返回顶楼 | |
发表时间:2009-02-17
luanma 写道 难道不是么?
开始一堆的socket参数设置,其实不同的应用场景有不同的设置,这个跟优雅无关。 使用char读数据,charset也完全是跟c服务器要一致,如果优雅,应该使用一个通用的解决方案。其实这个问题还有c以0结尾的问题,都属于通讯协议的设计问题。似乎跟优雅也无关吧。 把这些东西扒掉,就剩下建立连接,最简单的读写数据,然后关闭连接。这不是hello world,还是啥? 原来是这样啊,看来兄弟的要求很高,无话可说了。 java原来就是以简单为优雅的,程序结构清晰,逻辑越简单约好。 我发贴要说的都在贴的最后说了,这个贴本来就不是给高手准备的,怠慢了,呵呵! |
|
返回顶楼 | |
发表时间:2009-02-17
socket的tcp协议,是按照流来抽象的。所谓流,就是与发送的时间和次数无关的,只和发送字节序无关。
比如发送"ABC",是一次发出"ABC",还是分三次发出"A","B","C",即使这A,B,C都处在三个报文中,对于接收端来讲都是没有区别的。 如果分三次发出,对于接收端的read函数会怎么样?它一般会在读到A的时候,返回1次,读到B的时候,返回1次,读到C的时候返回1次。每次返回长度都是1个字节。所以,对这种情况,就应该读到所有的字节,才返回。 这些都是一些处理socket的基本常识。跟代码是否优雅无关。 楼主的代码,似乎竭力想把一个完整的报文一次发出,这个概念就是错误的。就算1个字节1个字节的发,服务端的程序也应该能处理,否则服务端的程序就是错误的。因为在网络不正常的时候,可能会采用较小的报文。比如,当前双方的通讯速度是5个字节/秒,那tcp协议栈就不会一下子发出一个1000字节的报文。 |
|
返回顶楼 | |
发表时间:2009-02-17
wandou 写道 socket的tcp协议,是按照流来抽象的。所谓流,就是与发送的时间和次数无关的,只和发送字节序无关。
比如发送"ABC",是一次发出"ABC",还是分三次发出"A","B","C",即使这A,B,C都处在三个报文中,对于接收端来讲都是没有区别的。 如果分三次发出,对于接收端的read函数会怎么样?它一般会在读到A的时候,返回1次,读到B的时候,返回1次,读到C的时候返回1次。每次返回长度都是1个字节。所以,对这种情况,就应该读到所有的字节,才返回。 这些都是一些处理socket的基本常识。跟代码是否优雅无关。 楼主的代码,似乎竭力想把一个完整的报文一次发出,这个概念就是错误的。就算1个字节1个字节的发,服务端的程序也应该能处理,否则服务端的程序就是错误的。因为在网络不正常的时候,可能会采用较小的报文。比如,当前双方的通讯速度是5个字节/秒,那tcp协议栈就不会一下子发出一个1000字节的报文。 谢谢,第一次有人这么清晰理论的解释了“流”,受教了!一段非常简单的程序,能得到大家的关注,让某人我收益良多! 至于“优雅”更多是出于我对java的喜爱,我的有一系列的blog都用“优雅java编程”来起头的,哈哈,大家就不用在这上面较真了。 |
|
返回顶楼 | |
发表时间:2009-02-18
没天理啊,好心找雷劈,写个帖子还被评新手贴,倒扣10分。无语
|
|
返回顶楼 | |
发表时间:2009-09-15
char lastChar = 0; do { size = br.read(charBuf , 0 , 4096); lastChar = charBuf[size-1]; if(lastChar == 0){ //去除尾部的\0字符 received.write(charBuf, 0, size - 1); } }while(lastChar != 0); 也遇到了类似的问题。这样确实可以解决 |
|
返回顶楼 | |
发表时间:2010-01-29
多谢分享,看了这么多的回复,收益颇多。
|
|
返回顶楼 | |