这几天公司要个用java写server、vc写client的socket。但在这之前,我不但不会java,就连socket为何物,也没听过。
第一个java的问题,好在上周装了一个eclipse,也下了本java学习的书籍,但只是花了半天的时间浏览了前三章,就丢开了。而第二个问题,倒好像比较容易解决——Google、baidu、java帮助、vc的MSDN,随你查。
据说高手写程序都是看协议写程序的,虽说I不是高手,但估计第一步还是省不了的,然而第二步就不是直接写程序了,我是找程序。网上找,一大把。但大略对比一下,也就两种,不知当初是哪位老兄写的,也不晓得传了几代。而且都是java一套,vc一套,用java写server、vc写client的几乎没有。即使有,也不知是哪位老兄在前面几位java、vc老兄基础上,java截一段vc截一段,真是聪明。
不管它,拿来看看,发现了几个值得注意的问题:
1、本地IP代号是“localhost”或“127.0.0.1”;
2、addrSrv.sin_port=htons(6000)中htons将主机的无符号长整形数转换成网络字节顺序,很多说连接不了的,都是因为没有htons转换的原因,不过我没遇到。
3、socket的建立模式差不多,这里列出VC的程序过程:
server:创建一个socket——blind绑定socket到端口——监听listen——accept接受某个client的连接请求——recv/send
client:创建一个socket——connect——recv/send.
4、不管java or vc,if the server/client already recv,you mush send 在另一头,否则,recv这里,将定格在recv语句中,跳不下去。也就是说一收必要一发,多少个revc就多少个send。由于对java的调试不熟悉,这里可是花了我不少时间才发现的。
注意完这些,终于实现vc和vc,java和java的通信,但关键问题还是不行——实现java的server和vc的client的通讯。网上找,倒不少人遇到这个问题,但在解决方法方面,众说纷纭,这里就花了半天,累的要死。不过总算OK.
原来java的BufferedReader.ReadLind()是以'\n'或'\r'结束的,开始我也注意到了这个问题,所以就在vc的程序里加了一个“\n\r”,结果不行。原因是“\n\r”会被他当成两行,呵呵,真晕。所以只要加一个“\n”就行了。
后来才知道,造成这些问题的根本原因是:阻塞和不阻塞的问题 !由于我的程序是阻塞型socket,所以才会造成第四点跳不下去的后果了。
|