我眼中的Java通信
通信学习小结
学习通信已有半个月的时间了,对于io,刚接触时只觉得这完全是一个全新的领域,无从下手,初期也只是通过分析胡哥,强哥例举的代码和教材上的代码示例寻找规律,其中的弯路可没少走。然而,通过这么一段时间的接触和不断的尝试,验证,也掌握了一些基本的知识,但又总感觉自己仿佛是在原地打转,没向前走不远,便又退回来对一些基础的东西进行新一轮的审视,提出一些或许一觉醒来就会觉得无比幼稚的问题。通过这么一段磕磕碰碰学习,不能说收货颇丰,但也总算是对自己有些交代了。
在我的眼中,通信的对象只有两种,主机端和客户端,而我们要做的,就是让这两者之间实现实时的信息交换。就代码流程而言,二者存在一定的区别,主机端:1、ServerSocket一个主机端对象,并绑定一个计算机开放的端口;2、Socket一个连接对象client(客户机),通过ServerSocket.accept()等待客户机接入;至此一个主机端建立完成;客户机:Socket一个client对象并指定接入的主机IP和端口即可。就服务器和客户机的本质而言,二者不过是相互的向对方发送消息,又相互读取对方所发来的消息,并无主机和客户之分,他们的核心内容是读写消息的方法,就读写方法而言,主机和客户机是平等的。下面将进行详细说明。
首先说读取消息,在读取消息之前,我们要知道从那读取,这就需要一个指定的Socket 对象,我们称其为连接对象client(我们可以将其理解为连接两者的通道),接下来要做的,就是从client对象上取得输出流并封装:
InputStream ins = client.getInputStream();//得到输入流
BufferedReader br = new BufferedReader (ins);//封装
得到输出流后开始读取消息
while (true) {
String line = null;
while (null != (line = (br.readLine()))) {
System.out.println("从服务器端得到的信息:" + line);
}
client.close();//关闭连接对象
}
至此读取消息的基本流程便走完了。
再来说说发送消息。与读取消息一样,首先我们要取得一个 Socket 对象client,在client之上取得输出流:
OutputStream ous = client.getOutStream();//得到输出流
BufferedWriter bw = new BufferedWriter (ous);//封装
开始向输出流中写入消息并发送:
String str ;//要发送的消息
bw.write(str+ "\r"); //将消息格式优化并写入
bw.flush(); //强制输出
client.close();//关闭连接对象
发送消息完毕。
在实现主机端与单个客户机实现界面聊天的项目中,其各自读写消息的方法大同小异,上述的读写方法二者都能使用。在实现群聊的项目中,只需要给主机端添加一个线程来保存连接对象(接入的客户机),在添加一个群发消息(给所有客户机发送收到的消息)的方法即可,有待实现!
注:文章中的代码是直接敲上去的。在实际操作中会抛出异常,其处理异常的代码需要在实际操作中自行添加!