通信总结
我们的目的是做出一个实现通信功能的小项目,这个小项目将要实现以下的功能:
1. 服务器端创建服务器
2. 客户端连接服务器
3. 实现服务器和客户端、客户端与客户端之间的文本通信(即聊天)
4. 实现服务器与客户端、客户端与客户端之间的画图通信(这里以线和圆为例)
这虽然是一个看似简单的通信项目,可要好的实现并不容易。
那么什么叫做“好的实现”?这是个值得深思的问题。有人会说,能够实现你所需要的功能,就算是“好的实现”。这种观点我并不否认,可是,如果一个软件仅仅是能够实现功能,缺少了一定的可再造性,那么,这样的软件一定不是一个值得赞美的软件。
这里我也想来说道一把了。正如胡哥所说,一栋房子,要想建的有多高,绝不取决与民工们板砖的能力,而是取决与设计师们鬼斧神工般的设计!一个软件,就像微信,qq等等,随着时间的推移,不断地在推陈出新更新版本,增加或者完善功能,这就像给一栋大楼加层,要想加得舒坦,那么在设计软件的时候,就应该考虑全面,结构清晰。
㈠ . “高内聚,低耦合”问题的分析
这里涉及到了一个“高内聚,低耦合”问题。“高内聚,低耦合”是我们要追求的效果,那么什么是“高内聚,低耦合”呢?什么又是“低内聚,高耦合”呢?看看下面的图你就能明白了。
“低内聚,高耦合”:看看下面的图片吧,创建了A,B,C,D四个类,在每个类中又调用了其他的类,这样一来,这四个类的关系就变得错综复杂,就像是一个深院里的大家庭,人与人之间都有着一定的关系,这样一来就组合成了一张极其复杂的关系网,如果A是B的叔叔,C是D的妹妹,A是C的弟弟,请问B的儿子应该喊D什么呢。不用想了,我也不知道,或许这更本就不成立。一个软件,如果是按照上述这种思路编写,那么,别说以后添加、完善功能了,“牵一发则动全身”,这样的代价,恐怕设计师都会被自己吓到,这简直就是天方夜谭。
所以说,我们需要的是一个简明易懂的思路;
“高内聚,低耦合”:看着下面这幅关系图,明显比上面那张图要舒服、清楚的多,这就像一个简单的三口之家,儿子是爸爸妈妈的儿子,爸爸妈妈是儿子的爸爸妈妈,那么儿子的儿子自然是喊爸爸妈妈叫做爷爷奶奶,这样一来,关系变得简单明了得多,而且处理事情也变得容易很多。如果编写软件按照这样的一种思路,类与类之间只是像图示的这种简单的关系,那么我想,要查找错误要更加容易,要完善程序也更加简单,想要添加功能,也不过只是在下面这些简单的线条里多加几条线而已。
弄明白了我们编程的思路,那么接下来,我们不应该急于动手去用代码来完成,而是结合目的,来整理一下程序的整体结构,包括整个程序的板块,有多少类,类里应该有哪些属性,又应该有哪些方法••••
㈡ .通信项目的整体分析
这里,结合上文说的通信小项目,做出如下整体思路分析:
从服务器的角度上:
这是一个大体的思路。本来是想把类中的属性以及方法也一并写上去,可是,后来怎么都觉得在没有实际操作前实在是难以想全应该要有哪些方法和属性,所以我觉得,具体的属性以及方法我们可以等到实际操作的时候在进行写入,以上图示只是给自己提供一个大概的思路,从该图不难看出应该创建几个板块。
客户端:
㈢ .分析关键代码
在整理好编写思路后,我们开始着手用代码解决问题。
① .服务器的创建以及客户端的连接
要实现通信,两个不可或缺的成分分别是服务器和客户端,那么实现服务器的开启与客户端与服务器的连接我们就要靠接下来的几行代码:
ServerSocket server = new ServerSocke(port)
这是实现服务器连接的代码,当然,服务器创建成功后,接下来是等待客户端的连接,代码如下:
Socket client = server.accept();
客户端来连的代码如下
Socket client =new Socket(String address,int port);
这里很容易混淆,在服务器端,等待客户端来连时有一个Socket对象client,而在客户端连接时,又有一个Socket对象client,这两个client有区别么?
答案是毫无疑问的,有区别!前者建立的是服务器与客户端的联系,在获取它的输入输出流以后,输出流表示的是从服务器向客户端写消息,输入流表示的服务器读取客户端的信息;而后者恰恰与前者相反,建立的是客户都啊与服务器的联系,在获取它的输入输出流后,输出流表示的是从客户端向服务器写消息,输入流表示的客户端读取服务器的消息。
②.队列的使用
要实现群聊功能,我们需要把每个客户端与服务器建立的联系的这个对象保存下来,这样,我们用到系统提供的数组队列,并将其封装到一个类中,像这样的类包括Line(线类,保存线),Circle(圆类,保存圆),chatSave(保存客户端与服务器的联系),接下来以chatSave为例:
//创建该类来保存启动的线程用户
public class chatSave {
//创建一个线程数组队列,用static声明,这样其他类中不需要实例化对像就可以使用
private static ArrayList<chatThread> list = new ArrayList<chatThread>();
//写一个将线程对象保存到数组队列中
public static void saveChat(chatThread ct){
System.out.println(" 加入了一个线程对象");
list.add(ct);
}
//移走其中一个线程对象
public static void removeChat(chatThread ct){
System.out.println("删除了一个线程对象");
list.remove(ct);
}
//返回数组中线程对象的数量
public static int getLength(){
return list.size();
}
//得到数组中第I个对象
public static chatThread getChatThread(int i){
return list.get(i);
}
//给数组里所有的线程用户发送信息
public static void chat(String inString) throws IOException{
System.out.println("向所有的客户发送了消息!");
for(int i = 0;i<list.size();i++){
chatThread ct = list.get(i);
ct.sendChat(inString);
}
}
//给数组里所有的线程用户发送线
public static void sendAllLine(int x1,int y1, int x2, int y2){
for(int i = 0;i<chatSave.getLength();i++){
chatThread ct = list.get(i);
ct.sendLine(x1, y1, x2, y2);
}
}
//给数组队列里所有的线程对象用户发送圆
public static void sendAllCircle(int x1,int y1, int x2, int y2){
for(int i = 0;i<chatSave.getLength();i++){
chatThread ct = list.get(i);
ct.sendCircle(x1, y1, x2, y2);
}
}
}
其中sendChat(inString),sendLine(x1, y1, x2, y2),sendCircle(x1, y1, x2, y2)是线程对象中服务器向某一客户端发送文本信息,线信息,圆信息的方法。
③.分隔符的设计
那么要服务器、客户端这些有联系的对象之间交换信息(文本、线、圆),那么如何发送和读取信息是关键,也是就是通信的本质-----协议!怎么才能让接受信息的一段判断得出现在接受的信息是文本信息,还是线信息,还是圆信息?那么又需要做一番精心的设计。
在这里,我做了简单的处理,用最初的一个字节来判断是什么信息,如字节1代表的是文本信息,在发送文本消息时先发送一个“1”,再读取消息时,若最先读到的是“1”,那么可以判定这是文本信息:
/***************************************************************/
这样能够实现对不同种类信息的判断
大家可能也发现了,inString+=“#”;是什么意思。在读取一个文本消息的时候,我们采用的是一个字节一个字节的读取,也就是每次只能读取一个字母,但是我们需要的是字符串,这样的话,我们采用字符串缓冲区寄存的办法,先把读到的每一个 字母放入到字符串缓冲区中,当遇到了一个分隔符(这里是“#”),我们再把这些字母从缓冲区中取出,整合成一个字符串:
解决了以上一系列问题后,整个程序将变得很简单,只要稍微细心,我想,要实现这么一个项目是不难的。
㈣ .成果展示
这里,给大家演示一下群聊功能的实现:
以上是服务器的创建以及客户机的连接;
成功后,可以实现群聊以及发送简单画图的功能:
通过这个小项目的展示,我们可以更加深入地了解到通信操作过程中的核心问题。这只是一个跳板,我们通过这个跳板将可以实现更多的更强大的项目,如五子棋对战等等小游戏平台。
- 大小: 20.5 KB
- 大小: 12.7 KB
- 大小: 68.4 KB
- 大小: 80.5 KB
- 大小: 52.9 KB
- 大小: 77.2 KB
- 大小: 77.6 KB
- 大小: 57.1 KB
- 大小: 73.5 KB
分享到:
相关推荐
- 页面结构:使用WXML构建游戏界面,包括画板、计时器、聊天窗口、玩家列表等组件。 - 样式设计:通过WXSS实现美观且响应式的布局,适应不同设备屏幕。 - 事件绑定:用JavaScript处理用户交互,如点击开始游戏、选择...
在这个系统中,用户可以通过聊天室进行文字交流,同时利用共享画板进行实时的图形绘制和协作,这在远程教育、团队协作、创意讨论等场景中具有广泛的应用价值。 首先,我们来看看这个系统的技术栈。"Java"是主要的...
- **客户端到服务器(C2S)通信**:用户通过客户端软件连接到服务器,进行登录认证及消息发送等操作。 - **服务器到服务器(S2S)通信**:不同域之间的服务器间进行数据交换,实现跨网络的即时通讯功能。 - **...
这个简单的例子展示了基本的聊天器功能,通过修改和扩展,可以创建更复杂的应用,如多人聊天室或文件传输工具。了解并掌握WINSOCK.OCX的使用方法,对于开发基于PowerBuilder的网络应用程序至关重要。
5. **课堂多人语音聊天讨论功能**:类似一对一视频,但需支持多用户同时发言。这需要服务器端的语音混音技术,比如声网Agora或 agora.io 提供的多人音频通话解决方案。同时,客户端需要处理用户的音频输入和输出,...
JAVA开发的电子白板源代码....服务器端和客户端程序都在压缩文件中,在局域网内测试成功,服务器与多客户端之间通过SOCKET机制进行通信,支持多人同时绘图,写字聊天等功能.代码结构非常清晰,易懂,功能还是比较强大的!
- **多线程**:为了实现并发处理,游戏可能会用到多线程技术,比如一个线程处理用户输入,另一个线程负责网络通信。 - **数据序列化**:图像和其他复杂对象可能需要序列化以便在网络上传输,这可能涉及到Java的...
【WebSocket】是一种在客户端和服务器之间建立持久性连接的协议,它克服了HTTP协议下每次通信都需要重新建立连接的缺点,实现了低延迟、双向通信,非常适合于需要实时数据交换的场景,如在线游戏、聊天室、协同编辑...
2. **协作工具**:多人协作编辑文档、画板应用等,实时显示其他用户的操作。 3. **实时统计**:实时显示网站访问量、用户活动等。 4. **游戏**:实时多人在线游戏,实时同步玩家状态和动作。 5. **金融应用**:实时...
- **实时协作工具**: 尝试使用 Vue.js 构建一个实时协作工具,如在线文档编辑或多人画板等,学习 WebSocket 或其他实时通信技术。 #### 六、Vue.js 社区和资源 - **社区**: 参与 Vue.js 的社区讨论,与其他开发者...
10.3 利用websocket实现简单的聊天室 / 283 10.4 做一款多人在线的坦克大战 / 293 10.4.1 服务器 / 293 10.4.2 客户端 / 293 10.5 小结 / 307 第四部分 技能提高篇 第11章 提高效率的分析 / 310 11.1 绘图时...
1. **WebRTC**:这是一个允许浏览器之间进行实时通信的API,用于视频通话、音频聊天和数据共享。在“聚在一起”的场景中,WebRTC可以用于实时传输用户的绘图动作,使得所有参与者都能看到并同步画布上的变化。 2. *...
- **实时通信**:例如,在多人在线游戏中,玩家的动作和状态可以即时同步到其他所有玩家的界面。 - **实时通知**:当服务器有新的数据更新时,客户端可以立即收到通知,比如股票价格变动、新闻更新等。 - **协作工具...
2d图形,实现一个2d画板,能够画2d的线、圆和矩形,能指定图形的颜色并且能够撤销和恢复图形,command.java; 3d图形,Graphic3d.java; 一个时钟程序,能够显示星期和日期,变化背景和透明度Clock.java; 11 java...