当初接下这个任务的时候,并不曾想会搞的这么复杂。
业务需求很简单,用socket发一堆数据到服务器上,读取返回信息。
第一次用socket,新手能犯的错误都被完美的演绎了。
很快写完一个测试程序,但是发现读不到服务器返回的数据。于是开始热身第一战,socket的数据读取。
通过调试发现,程序卡在下面一行不动了
while((buf=br.readLine())!= null)
readLine是个阻塞的方法,如果没有数据会一直等待。再仔细的排查,数据是已经提交到过去了的,服务器用telnet测试是会有数据返回的。但是怎么读不到呢?
睡了一个晚上后,灵光一闪,readLine()是读一行,要是服务器没有发送换行符,是不是就一直等待了?
修改读数据代码如下:
byte[] b = new byte[10];
StringBuffer str = new StringBuffer("");
while (stream.read(b) > -1) {
str.append(new String(b));
}
万幸,能读到数据了。但是但是~~我不知道一个数据包什么时候结束--!而且程序也不能一直这么阻塞在这里,我需要结构良好反应快速的应用,而不是这么一个发一条hello信息的测试程序。
于是乎,SocketChannel闪亮登场。本来想用apache mina(希望没拼错),可是发现实在太难用了。虽然SocketChannel也很难用,至少一个测试程序还能一个屏幕显示的下。。。
改成SocketChannel后,惊讶、郁闷的发现,消息发不出去了~~
发消息的代码如下:注意这个是错误代码,跑不起来的
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
String s="hello";
buf.put(s.getBytes());
channel.write(buf);
这个回合打的非常辛苦,一个下午加一个晚上的时间,不停的baidu,google,调程序,测程序,。。。。此处省略1000字。。。
一直到凌晨2点,都快哭了~~
女孩子熬夜老的快,一边担心脸上长皱纹,一边担心程序调不通。就在快要崩溃的时候,程序正常跑完了。
都忘了是怎么调通的了,精神恍惚,记忆错乱,当时以为是因为发送的消息没带换行符,后来才知道好像是另外个原因,至于那时候加的换行符,却引发了另外一个莫名其妙的问题,而我却陷在自己的思维怪圈中。
上述代码修改如下:
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
String s="hello\n";
buf.put(s.getBytes());
buf.flip();
channel.write(buf);
不管怎么样,我总算是得到一个能正常工作的程序,功能是用SocketChannel向服务器发送一个消息,然后把返回的数据显示出来。
未完待续
业务需求很简单,用socket发一堆数据到服务器上,读取返回信息。
第一次用socket,新手能犯的错误都被完美的演绎了。
很快写完一个测试程序,但是发现读不到服务器返回的数据。于是开始热身第一战,socket的数据读取。
通过调试发现,程序卡在下面一行不动了
while((buf=br.readLine())!= null)
readLine是个阻塞的方法,如果没有数据会一直等待。再仔细的排查,数据是已经提交到过去了的,服务器用telnet测试是会有数据返回的。但是怎么读不到呢?
睡了一个晚上后,灵光一闪,readLine()是读一行,要是服务器没有发送换行符,是不是就一直等待了?
修改读数据代码如下:
byte[] b = new byte[10];
StringBuffer str = new StringBuffer("");
while (stream.read(b) > -1) {
str.append(new String(b));
}
万幸,能读到数据了。但是但是~~我不知道一个数据包什么时候结束--!而且程序也不能一直这么阻塞在这里,我需要结构良好反应快速的应用,而不是这么一个发一条hello信息的测试程序。
于是乎,SocketChannel闪亮登场。本来想用apache mina(希望没拼错),可是发现实在太难用了。虽然SocketChannel也很难用,至少一个测试程序还能一个屏幕显示的下。。。
改成SocketChannel后,惊讶、郁闷的发现,消息发不出去了~~
发消息的代码如下:注意这个是错误代码,跑不起来的
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
String s="hello";
buf.put(s.getBytes());
channel.write(buf);
这个回合打的非常辛苦,一个下午加一个晚上的时间,不停的baidu,google,调程序,测程序,。。。。此处省略1000字。。。
一直到凌晨2点,都快哭了~~
女孩子熬夜老的快,一边担心脸上长皱纹,一边担心程序调不通。就在快要崩溃的时候,程序正常跑完了。
都忘了是怎么调通的了,精神恍惚,记忆错乱,当时以为是因为发送的消息没带换行符,后来才知道好像是另外个原因,至于那时候加的换行符,却引发了另外一个莫名其妙的问题,而我却陷在自己的思维怪圈中。
上述代码修改如下:
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
String s="hello\n";
buf.put(s.getBytes());
buf.flip();
channel.write(buf);
不管怎么样,我总算是得到一个能正常工作的程序,功能是用SocketChannel向服务器发送一个消息,然后把返回的数据显示出来。
未完待续