网络通信初识

                                               网络通信初识

1.通信必须在两方建立:服务器端和客户端。

执行这行代码:java.net.ServerSocket server=new java.net.ServerSocket(port);就可以创建一个服务器对象。port是服务器的端口,当服务器对象创建成功后,调用:server.accept()方法,等待客户机与之建立连接。该方法会阻塞,也就是:必须有客户端与之建立连接得到一个连接对象,才会执行下行代码,否则会一直等待客户机的连接。

Socket client=server.accept()建立好了连接。

2.InputStream ins=client.getInputStream()调用该方法就可以接受服务器端发送来的消息。

OutputStream ous=client.getOutputStream()调用这个方法则可以向服务器发送消息。

3.当一切准备就绪时,还必须规定双方通信的规则,这个规则并不是唯一的,而是通信双方协商好的。比如我们之前写的简单的聊天系统,当通信双方遇到"/r/n"就认为是一条聊天消息。又比如我们写的xmpp聊天系统,双方的协议是<msg>总的消息内容</msg>,通信双方则认为:遇到</msg>则认为之前的是一条消息。所以,在写服务器端与客户端时,协议是最重要的。双方都必须遵守协议。

4.在聊天系统中除了accept()方法会阻塞,read()方法也会阻塞,它必须等待对方发送字节过来。readLine()方法也会阻塞,它是整行读取。它必须等待对方发送一条回车换行的消息。

5.并不是所有的while(true)都是死循环,当程序中的方法有阻塞时,就不会。线程可以在阻塞时休眠。

在程序中学到的知识点:

1.Scanner sc=new Scanner(System.in);//可以再命令行输入

String msg=sc.next();//得到输入的值。

当输入为:xiao yi

msg的值却是xiao,并不是xiao yi.

这是跟StringBuffer的区别,StringBuffer对象得到的值就是:xiao yi.

2.在编写聊天系统时,我们经常会犯这种错误:显示不出来对方发送的消息。这可能就有两种原因:第一,对方发送消息失败。第二,本身读取消息有误。我们可以通过测试:看是哪方出现错误。

比如:我今天写的xmpp聊天系统:服务器端发送下线通知时,并没按照协议把整个xml字符串发送给客户端。而只是发送了下线用户的名字:当在客户端打印时:并没打印。原因:客户端解析一条消息时,是以</msg>结束符的,而发送来的消息没有这个结束符,那就自然不会显示打印啊。最好的办法就是:打印字节。

猜你喜欢

转载自willyii.iteye.com/blog/1135315