花了很多天去学习了解通信这一块的东西,虽然还是有很多没明白也没有做出来的东西,但是,对于自己来说,重要的不
是没有的东西,而是把握好已经拥有的东西。所以,先把自己有的珍惜好了,再去找寻其他的想要的。
通信这里一直有两个难点困扰着我:
1.建立客户端和服务器之后对于客户端对象和服务器对象的理解;
2.建立连接之后对输入输出流的使用;
尽管对于有的人来说,就比如教我java的胡哥,理解一个东西似乎永远不如学会使用来的强,但就我自己的学习来说,
无法理解就无法运用,而运用的功能之一就是为了加强理解。所以,害怕以后的我还是对这一方面的东西忘记又产生困惑,
或者如果万一有像我这样困惑,而又一不小心点到我这一篇博客的人,对于我自己对这些东西的理解还是再说一说。还有
就是更正一下之前对于输入输出流的误解作出也不知道是不是对的更正吧。
先说一下我认为在这里最为重要的也让我困惑了许久的几行代码吧:
1.ServerSocket server=new ServerSocket(int port);
2.Socket socket=server.accept();
3.Socket socket=new Socket(String host,int port);
第一行和第二行代码是创建服务器时在服务器端使用的,因此一开始就让我产生了误解,误以为两行代码所产生的对象都
是服务器对象。但是,在第一行的代码中所新建的server对象确实是服务器对象,而第二行代码中的socket并不是
新建的对象,而是调用服务器的accept()方法获取的客户端对象,所以,此后,以这一行代码中的socket得到的输
入输出流都是客户端对象的输入输出流;
然后是第三行在连接客户端时所用的的代码。好吧,这里又曾经让我产生过误解。但是误解是什么已经不重要了,重要的
是我现在知道此处的socket所指代的对象是确确实实的“服务器”就行了。看到new字千万不要以为是新建了一个啥,
而是在实际意义上理解成为在地址为host,接口为port上产生的一个服务器,并不是新建,而是取出这个服务器对象,
以便调用。这里需要将三行代码连起来看,毕竟是通信嘛,1新建了一个服务器,接口为port,然后执行2,等待客户端
接入,只有客户端接入后才能运行2之后的代码,然后,在客户端那边,执行3,虽然意义上是新建了一个连接上服务器的
客户端,但该客户端对象确是在2执行时由服务器得到,客户端这边得到的事这个客户端对象连接到的服务器对象(似乎
还是有点晕晕的,亲爱的未来的我,静下心来仔细想想当时写下这段话是自己的逻辑吧)。
然后就是关于相互连接上的没有实际区分的客户端和服务器之间的输入输出流了。
不管是客户端还是服务器,获得输入输出流的方法都是一样的,读取byte时直接getInputStream()和
getOutputStream()。但是对于输入输出流的从属以及对于从输入输出流读取和写入数据的区分对于新接触到他们
的人来说还是有点难以理解的。主要还是对象的理清吧。从哪个对象得到的输入流,读取的就是哪个对象的数据;从哪个
对象得到的输出流,就是向哪个对象写入数据。而对于已经连接好了的服务器和客户端,服务器的输入流与客户端的输出
可以看做是相对应的同一条流,同理,服务器的输出流与客户端的输入流也是同一条流。
例如,
//此处的socket1是服务器对象
String s="服务器发送的消息";
OutputStream ous=socket1.getOutputStream();//获得服务器的输出流
byte[]b=(s).getBytes();//向服务器的输出流中写入数据
ous.write(b);
//此处的socket2是客户端的对象
InputStream ins=socket2.getInputStream();//获得的输入流是客户端的输入流
String s=readMsg(ins);//从客户端输入流中读取数据,而该数据来自与服务器同过服务器的输出流写入
好吧,以上就是我认为的在实现通信群聊中最难以解决的关于知识方面的东西。在这里,要很感谢很有耐心的康哥,已经
过谢了,但一想到自己之所以能不再纠结这些基础性的东西,一想到康哥那样耐心的一遍一遍的解释,还是感觉到很感谢
吧。
但是就算都了解了这些,程序也似乎还是完完全全重新写了三次(除了还有不计其数的小变动),由此而感受到的就不仅
尽是写代码的那啥了。写程序必需要先构建框架,算是这一次最大的教训吧。哪怕就是这么小的一个程序,如果不理清之
间的逻辑和流程,所要多花费的时间和精力就这么多,还好,亡羊补牢,为时未晚,养成先建大框架再考虑小细节的习惯,
就算会因为暂时的经验不足等原因还是需要花费很多劳力,但是磨刀不误砍柴工,这个习惯,不管是在敲代码还是以后真
正意义上的做事情之后都会有很大的用途。
一直在被说,通信这一块的大头是文件,是协议,这个,过两天再说吧。
前两天看了自己的第一篇博客,当时竟然不知天高地厚的说要每天写一篇,看看过来十天才更新的这一篇博客,真有一种
对不起当时激情昂扬的自己的感觉。怎么办,当然也知道那时的话怕是没机会实现了,还是给自己宽松一点的限制,争取
在学习的时候,一个月四五篇吧,有机会争取超额完成自己的任务。
还有我在实现通信群聊的基本类图,虽然是写完程序之后再理清的,也是第一次用那个什么uml画的,但是,哪怕百分中
只有五分能用到它,那也值得把它贴上一回了。
- 大小: 25.1 KB
分享到:
相关推荐
本篇文章将深入探讨WINSOCK的I/O模型及其在实现C/S(客户端/服务器)模式的群聊服务软件中的应用。 首先,让我们了解什么是I/O模型。在计算机科学中,I/O模型定义了应用程序如何与硬件进行数据传输的方式。常见的I/...
在本文中,我们将探讨如何使用Java来实现一个小型局域网内的群聊功能,采用C/S(客户端/服务器)架构,并基于TCP协议进行通信。TCP(Transmission Control Protocol)是一种面向连接、可靠的传输协议,适用于需要...
【C++编写的C/S聊天室程序】 C/S(客户端/服务器)架构是一种常见的网络...总的来说,这个C++编写的C/S聊天室程序涵盖了网络编程、多线程、面向对象设计等多个关键知识点,是学习和实践网络通信与C++编程的优秀实例。
本教程将深入讲解如何利用TCP SOCKET技术在Java中编写一个C/S(Client/Server)模式的聊天程序,该程序具备群聊和私聊功能,并能处理多个并发连接以及正确识别消息边界。 首先,TCP(Transmission Control Protocol...
C/S架构是一种典型的两层或三层结构,其中客户端(Client)负责用户界面展示和部分业务逻辑处理,服务器端(Server)则负责数据管理和核心业务处理。在这种模式下,客户端发送请求至服务器,服务器处理请求并返回...
这个应用基于C/S(客户端/服务器)架构,使用Socket通信协议来实现实时的数据交换。通过这样的设计,用户可以在同一WiFi网络下的设备之间进行即时聊天。 首先,我们需要理解Android系统对WiFi连接的支持。Android...
在C/S架构中,客户端(Client)和服务器端(Server)是通信的两端。客户端负责发起请求,而服务器端则处理这些请求并返回响应。在无连接的聊天系统中,每个通信的数据包(datagram)都独立发送,不依赖于之前或之后...
在本文中,我们将深入探讨如何使用C语言进行网络编程,特别是构建一个基于TCP/IP协议的聊天室应用。TCP/IP协议是互联网通信的基础,它确保了数据的可靠传输。聊天室是一种支持多用户实时交流的应用,这里我们将关注...
1. C/S架构:客户端发送消息至服务器,服务器广播消息至所有在线客户端,实现群聊。私聊时,消息通过服务器中转或直接使用UDP打洞技术。 2. 多线程:服务器可能需要为每个连接的客户端创建单独的线程,以处理并发的...
- **架构设计**:可采用C/S(客户端/服务器)架构,服务器负责管理和转发消息,客户端用于用户交互。 - **代码组织**:定义清晰的函数职责,如`accept_client()`、`broadcast_message()`等,便于理解和维护。 ...
Y7 j/ |- c) O5 M' V6 S 9_多线程-yield-join-daemon-synchronized; o, E; \* I: E2 W 10_多线程-同步代码块-同步方法 11_多线程-生产消费问题 12_多线程-死锁问题 13_字符集问题' X4 e; v9 q' U2 W% f" l7 f$ F 14...
在C/S(客户端/服务器)架构下,服务器端负责接收并分发消息,客户端则用于展示聊天内容和发送用户的输入。 首先,我们来看看"socket"这一关键概念。Socket是进程间通信(IPC)的一种方式,特别适用于网络通信。在...
- 监听用户连接,建立I/O通道。 - 验证用户账号和密码,允许合法用户登录并记录登录信息。 - 存储用户发送的消息到数据库,并广播给所有聊天室成员。 - 清除异常连接。 - 提供系统管理功能,如设置最大在线用户...
在Java中,我们可以利用Socket编程或者NIO(非阻塞I/O)来实现网络通信,这些API提供了创建套接字连接、读写数据等方法。 对于“c.exe之间就可以通话了”,这意味着客户端之间的通信是通过服务端进行中继的。这种...
- 异步通信:客户端和服务器端使用非阻塞I/O或异步I/O模型,提高性能。 - 用户认证和安全性:添加用户登录功能,使用SSL/TLS加密通信,确保数据安全。 - 多客户端支持:服务器端应能同时处理多个客户端的连接,实现...
- **C/S体系结构**:系统采用两层架构,客户端(C)负责用户交互,效劳器端(S)处理业务逻辑和数据管理。 5. **网络交互原理**: - 效劳器端启动后,创建一个监听Socket等待客户端连接。 - 客户端连接时指定...
在实现“代码”部分,我们需要编写服务器端和客户端的代码,处理网络I/O、解析和构建消息、实现各种功能。此外,还要考虑异常处理、错误恢复和性能优化。例如,使用缓冲区提高数据传输效率,使用线程池管理并发连接...
一般会采用C/S(客户端/服务器)结构,服务器负责接收客户端连接、处理消息和广播,客户端则用于用户交互。考虑到并发性,服务器端可能需要多线程或者EventLoopGroup来处理多个连接,确保系统的高并发能力。 **安全...
2. **输入/输出流**:Java的I/O流机制用于在网络连接中传输数据。一旦Socket连接建立,双方可以通过`InputStream`和`OutputStream`进行数据的读写。例如,服务器端可以使用`ObjectOutputStream`向客户端发送消息,而...
本项目采用C/S架构,使用I/O多路服用技术epoll模型结合线程池实现的模拟Proactor模式来实现并发服务。MySQL用于存储用户的账号信息、Redis缓存记录用户的登录状态,并通过加入布隆过滤器减少了对于MySQL的查询数量...