整个通信过程可以比拟成一个实际的例子,如图
一个消息从客户端1发送至服务器再从服务器发送回客户端1的过程,通过这个蓄水池的例子可以这样理解:
蓄水池1号打开放水闸放水,水通过管道1传送至净水处理器处,净水处理器打开水龙头就能接收到来自蓄水池1号的水,这些水在净水处理器经过处理之后,打开净水处理器的放水闸,经过处理的水通过管道2来到蓄水池1号处,此时蓄水池1号的水龙头打开,便能接收到来自净水处理器的经过处理的水了。
在这个例子中,服务器是净水处理器,客户端1就是蓄水池1号,两者都有着向对方发送消息的功能(放水闸)和从对方接收消息的功能(水龙头),水就是传送的信息,放水闸就是输出流,水龙头就是输入流咯。
那么,用代码实现一下这几个东西吧:
ServerSocket server = new ServerSocket(port);
//建立一个socket对象(客户机) Socket client = new Socket(this.serverIp, this.port); // 得到输入输出流 InputStream inp = client.getInputStream(); BufferedReader bfr = new BufferedReader(new InputStreamReader(inp)); //使用BufferedReader较直接使用inp更为方便 OutputStream oup = client.getOutputStream();
你一定注意到了,服务器还没有输入输出流呢,怎么办?
服务器和客户端是不同的,客户端想要传送数据只需要一个水龙头和一个放水闸就够了,但是服务器可能需要同时处理多个客户端的信息,也就是说,这个净水处理器会同时处理许多个蓄水池里的水,那么净水处理器就会需要多个水龙头和放水闸,并且每一个指定的水龙头和放水闸要对应一个指定的蓄水池,并修筑专门对应该蓄水池的管道,这样才不会乱套。而由于一个净水器要对应多个蓄水池,要修筑多条同时使用的管道,这时可以使用线程来作为管道。代码实现如下:
while (true) { // 让服务器进入等待状态:阻塞状态 Socket client = server.accept();//服务器新接收到一个客户端 ConnectThread cot = new ConnectThread(client,this);//新建一个线程,传入新的客户端 arr1.add(cot);//把新建的线程存入线程的队列中 cot.start();//开启线程 }
//线程的构造器 public ConnectThread(Socket client, ChatServer cs) throws IOException { this.client = client; //获得输入输出流 inp = client.getInputStream(); oup = client.getOutputStream(); bfr = new BufferedReader(new InputStreamReader(inp)); this.cs = cs; }
这样,每有一个新的蓄水池连接净水处理器,就会修筑好两者之间的全套设备。
那么接下来就说一下放水和接水的方法:
使用放水闸放水,就是使用OutputStream类的write()方法,
使用水龙头接水就是使用InputStream类的read()方法,
也可以使用BufferedReader类的readLine()方法
需要注意的是
该方法读取一句消息时,以"\r","\n"和"\r\n"为标记结尾,也就是每读到这三个标记时自动结束该方法并将其前面的消息记为一句话发送出去,因此使用该方法读取的数据必须是有这三种标记结尾的。
知道了这些,就可以实现,从客户机发送给服务器一些数据再从服务器读取出来了,但是要实现真正的通信,是在客户端与客户端之间的。
客户端之间聊天的实现
客户端通过服务器得到别的客户端所发的消息,继续使用最初的例子就是,蓄水池1可以得到来自蓄水池2的经过净水处理的水。在实例中,我们会这样操作,首先打开蓄水池2的放水闸,净水处理器打开对应蓄水池2的水龙头,净水处理器打开对应蓄水池1的放水闸,蓄水池1打开水龙头。通信也是这样实现的。
客户端1,2分别连上客户端之后,客户端2使用OutputStream对象的write()方法通过管道3向服务器写消息,服务器对应客户端2 的线程会使用BufferedReader对象的readLine()方法从客户端2读取消息,再将此消息通过对应客户端1的线程的OutputStream对象的write()方法通过管道2发送给客户端1,客户端1又通过自己的BufferedReader对象的readLine()方法从服务器读取了消息,这样就实现了从客户端2到客户端1的消息传递。
相关推荐
举个例子,在Flash中定义一个接受两个参数的函数: ```actionscript ExternalInterface.addCallback("callFromCSharp", function(param1, param2) { // 处理来自C#的调用 }); ``` 在C#中,可以这样调用: ```...
举个例子,一个GET指令可以配置成从从站的M820.0开始的10个字节读取数据,并将这些数据存储到主站的M620.0。反之,PUT指令可以将主站M720.0的10个字节数据写入到从站的M920.0。 编程工作完成后,我们还需对程序块...
举个例子,家中的智能插座、冰箱、空调、洗衣机等设备,都可以通过WiFi连接到网络,从而实现远程控制和数据交换。然而,随着移动设备的普及和用户对通信质量要求的提升,WiFi技术的高功耗问题逐渐暴露出来。尤其对于...
在这种设计中,系统被划分为多个逻辑层,每个层都有特定的职责,层与层之间通过接口进行通信。例如,展示层负责用户界面,业务层处理业务逻辑,数据访问层则管理数据库交互。分层设计有助于保持代码的模块化,降低...
- **Interface回调**:如果需要更复杂的通信,可以定义一个接口,由Fragment的宿主Activity实现。Fragment通过接口方法调用Activity,传递数据或执行特定操作。这种方式适用于需要Activity参与交互的情况。 - **...
最近研究安卓客户端和jsp网站服务器的交互通信。然后找到了不止这一种通信的方式。全部六种很齐。各位同学可以根据自己的需求取用其中的例子。也可以系统的研究一下。 都是代码偶。...同意的同学举个爪。
### 进程运行/就绪/堵塞三个状态的转化以及通信调度算法 #### 一、进程的基本概念 在操作系统(OS)中,进程是程序的一次动态执行过程,它是系统进行资源分配和调度的一个基本单位。一个进程由程序段、数据段及...
本示例将探讨一个基于C#语言的电子商务在线交易系统,该系统详细展示了如何处理从用户购物到资金转账的全过程。 首先,让我们理解在线交易的基本流程。在电子商务网站上,用户浏览商品,将心仪的商品添加到购物车,...
举个例子,假设有一个IP地址221.130.25.33,子网掩码为255.255.255.224。通过与运算,我们可以确定网络号为220.130.25.32,这是一个C类地址。子网掩码255.255.255.224表示从主机部分划出3位作为子网,因此有8个子网...
举个例子,当发生紧急情况时,车地通信系统可以迅速地将紧急疏散指令传送到每一节车厢的显示屏上,乘客们可以第一时间了解情况并作出正确的反应。 然而,随着5G技术的引入,车地通信技术将面临新的发展机遇和挑战。...
Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。Modbus支持的具体协议有:Modbus TCP、Modbus UDP、Modbus RTU、ModbusRtuOverTcp、...
DWR(Direct Web Remoting)是一个开源的Ajax框架,它简化了客户端JavaScript与服务器端Java之间的通信过程,使得开发者可以像调用本地对象一样轻松地调用远程Java对象。DWR的核心功能包括: - **简化Ajax调用**:...
举个例子,如果每秒传输1200位数据,且每个字符由12位组成,则每秒可以传输100个8位字符。 在实际的异步通信中,波特率与收发时钟频率密切相关。波特率通常是由发送方的时钟频率除以波特因子得出的,而波特因子可能...
标题:TCP与UDP的区别、用途、例子 描述:本文旨在深入解析传输控制协议(TCP)与用户数据报协议(UDP)的关键差异、应用场景以及实际案例,帮助读者更好地理解这两种网络通信协议。 一、TCP与UDP的基本概念 1. *...
举个例子,假设我们有一个全局变量`g_counter`,两个线程`ThreadA`和`ThreadB`都需要修改这个计数器。为了保证安全,我们需要在修改`g_counter`之前先获得一个`Mutex`对象的锁: ```cpp #include <windows.h> // ...
在交通咨询方面,寻找交通路网中两个城市间最短的行车路线就是最短路径问题的一个典型的例子.在网络通信领域,信息包传递的路径选择问题也与最短路径问题息息相关.举个例子,OPSF开放路由选择协议,每个OPSF路由器都...
举个例子,每个24芯光缆可以支持12个光端机或路由器。当然,具体的信号传输路径需要根据实际的通信运行需求来规划,以确保通信的有效性和经济性。 随着“互联网+”概念在电网行业的普及,电力系统通信的作用愈发...
举个例子,在网络支付领域,5G的高带宽和低延迟特性可以为用户提供几乎无延迟的支付体验,同时,先进的加密技术可以确保交易的安全性。 5G通信技术的低延迟特性对于许多实时性要求极高的应用场景而言,是至关重要的...
举个简单的例子,人们可以通过一部手机或者计算机,就可以完成信息的获取和传递、购物、远程操作、工作等诸多事情,这就是科技发展给人们生活所带来的改变。科学技术支撑着智能化的发展,其中通信工程和电子信息工程...
举个简单的例子,一个UDP服务器可能如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #...