浅谈网络通信
暑假集训这段时间,我们重点学习了网络通信。还没有接触网络通信时,我认为网络通信是一件很神奇的事情。你看看,现在几乎所有的应用软件都是基于网络的,可想而知,网络通信是多么的重要。抱着对通信的几分期待的同时,我想,这网络通信是不是很难学呢?
在老师没讲课之前,我拿了那本刚刚发的书看了一下。首先我觉得通信做的事情多了,因为通信是双方的事情。所以,要完成一个通信项目,至少得有两个模块要被搭起来,一个是服务器,另一个就是客户机。由于刚刚开始对这方面很好奇,所以,我就按照书上的,一遍遍的抄代码,慢慢理解。但是,抄来抄去,我感觉就那几句话,就那么一个套路,是死的东西。这时候我就想,肯定是有什么细节书上没提到。
// 创建服务器对象 ServerSocket server = new ServerSocket(port); System.out.println("服务器创建成功在端口" + port); // 等待客户端连接 Socket s = server.accept();
到了胡老师上课,第一节课他就开门见山的指出,网络通信如果说有新的东西的话,那么就是一句话,一个套路。至于你想把通信做成什么样子,那都是靠前面的知识了。反正第一结课我觉得好无聊,就那么几句话整来整去的。到了第二节课以后,我才明白网络通信的精髓。通信就是两个人打电话,首先肯定是个套路,要建立连接。然后就是两个人之间的信息交互。所以说重点就落在信息交互这一块了。
// 获取输入输出流对象 dis = new DataInputStream(client.getInputStream()); dos = new DataOutputStream(client.getOutputStream());
两个人打电话时怎么知道对方讲的是什么呢?他们首先了解对方的语言。听的懂,电话打的才有意义。否则打电话干什么呢?而怎么才能让服务器和客户机能正常的交流呢?这里就引入了一个协议的概念。
/** * 处理客户端发送的信息 */ public void recvMsg() { try { while (true) { // 读取信息类型 int shape = dis.readByte(); switch (shape) { case 0:// 接收到的是一个字符串消息 int len = dis.readByte();// 字符串长度 String s = ""; for (int i = 0; i < len; i++) { s += dis.readChar(); } ta.append(s); System.out.println("服务器接受到:" + s); break; case 1:// 接受到一条直线 int x1 = dis.readInt(); int y1 = dis.readInt(); int x2 = dis.readInt(); int y2 = dis.readInt(); g.drawLine(x1, y1, x2, y2); break; case 2: break; case 255:// 与服务器断开连接 System.out.println("客户端断开连接"); client.close(); break; } } } catch (Exception ef) { ef.printStackTrace(); } }
首先要明白的就是,双方必须遵守协议才能通信。就像打电话一样,我在这边说汉语,你在那边说英语(假设双方只懂一门语言),我根本就不知道你在说什么,你也不知道我在说什么,通信就根本没通起来。所以如果要让通信通起来的话,必须要有一门共同的语言支持,对服务器和客户端来说这就叫协议。
总体来说呢,通信我主要就花时间在处理协议这一块。学习协议给我的感受就是,无规矩不成方圆,自由是建议在规则之上的。