这两天步入java通信的学习。
首先来说一下服务器。服务器严格的讲是管理资源并为用户提供服务的计算机。通俗一点讲就是等待用户连接
并对用户发过来的信息进行处理。而客户机是连接服务器并访问服务器资料的计算机。
因此,一个简单服务器的构建步骤为:1、创建服务器对象 2、等待客户机的连入 3、一旦有客户机连入后获取
客户机的输入输出流 4、对客户机发来的数据进行处理
而一个简单的客户机的构建步骤就更为简单了:1、创建客户机对象,并连接服务器 2、用输入输出流发送数据或获取
服务器发来的数据
但是在服务器与客户机之间收发消息必须有网络协议:
1、客户机与服务器都必须了解对方发来的数据是什么样的协议并且预先知道所要处理的所有步骤
2、客户机与服务器都必须遵守协议
3、协议必须明确并无歧义
先演示一下简单的服务器(协议为以回车为结束符号的字节)
public class ServeThread extends Thread { private java.net.Socket client; private java.io.OutputStream out; public ServeThread(Socket client) { this.client = client; } public void run() { dealChat(client); } /** * 处理客户机发来的消息 * * @param client */ private void dealChat(Socket client) { try { // 数据的读入和输出 out = client.getOutputStream(); java.io.InputStream ins = client.getInputStream(); DataInputStream dis = new DataInputStream(ins); // 输入 String s = "欢迎来到游戏世界\r\n"; sendMsg(s); String input = readString(ins);// 读入字符串 while (!input.equals("bye")) { System.out.println("客户机说" + input); // 将客户机发送来的内容发回客户机 s = "服务器收到" + input + "\r\n"; sendMsg(s); input = readString(ins);// 读入字符串 } // 客户机断开与服务器的连接 s = "欢迎下次再来"; sendMsg(s); client.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 从输入流中读取的字节形成一句话返回 * * @param ins * 输入流 * @return 字符串 * @throws IOException */ private String readString(InputStream ins) throws IOException { StringBuffer sb = new StringBuffer();// 字符缓冲区 char c = 0; while (c != 13) {// 当未换行时 int i = ins.read();// 读取客户机发来的一个字节 c = (char) i;// 将字节转换成一个char sb.append(c);// 将这个字符加入到字符缓冲区中 } String inputs = sb.toString().trim();// 将字符缓冲区中的字符连成字符串 return inputs; } /** * 封装发送方法 * * @param s * 要发送的字符串 */ private void sendMsg(String s) { try { byte[] date = s.getBytes(); out.write(date); out.flush(); } catch (IOException e) { e.printStackTrace(); } } }
而深入一点的是各种不同数据(如文件,消息等等)的传输,这个的话就要设计协议了,
例如
4 byte(类型) | 4 byte(整数) | a byte | ||
1(表示消息) | 消息长度 a | 消息内容 | ||
2(表示文件) |
文件名长度 a | 文件长度 b | 文件名 | 文件数据 |
4 byte(类型) | 4 byte(整数) | 4 byte(整数) | a byte | b byte |
在数据的传送接收过程中,大概来说总是会遇到这些小问题:
1、如客户机输出的消息长度为a,但是输出的消息内容却并没有达到长度a,这个就必须在客户机输出之前要进行验证,否则传送过去的数据会出错
2、服务器接收到的数据要从字节数组转换成字符串,String s=data.tostring();这样写是错误的,会直接把data数组的地址转成string,而应该改写成String s = new String(data);
3、用什么方法输出的,就必须用什么方法接收
如 用OutputStream 输出,服务器就必须用InputStream读入;用DataOutputStream输出,就要用DataInputStream读入
相关推荐
2019通信行业年度策略报告:5G元年开启,通信行业步入新周期.pdf
通信设备行业跟踪报告:Q2通信基金持仓触历史低位,行业步入景气周期、机会看好-0724-海通证券-13页.pdf
通信行业周周谈(2020年第7周):5G室内频段许可正式下发,小基站建设步入全新阶段-200216.rar
通信行业:通信测试,5G时代的卖水人~通过是德科技看全球测试产业步入多维增长时代-0214-中泰证券-46页.pdf
通信设备行业跟踪报告:2019Q2通信基金持仓触历史低位,行业步入景气周期、机会看好-20190724-海通证券-13页.pdf
bec步入商界文本
通信行业周报:物联网连接规模首次超过非物联网,万物互联步入快车道.pdf
步入Matrix函数 步入Matrix函数 步入Matrix函数
通信行业全球云计算前瞻研究专题:云计算步入扩张周期,数通产业迎来升级拐点.pdf
LTE-V2X直连通信频率规划出台 车联网将步入发展快车道.pdf
通信行业全球云计算前瞻研究专题:云计算步入扩张周期,数通产业迎来升级拐点
学习通信已经三年了,即将步入大四,我们马上要结束大学的课程,很多人要步入社会,很多人要进入实验室进行专业领域的研究学习,这个时候,就该把书本上的知识运用到实际中,真正把这些知识学到手。所以,大四开学...
然而,这种局面最近有了很大的改观,由于政策上的扶持和技术本身的发展,在沉寂多年后,FTTH网再次成为热点,步入快速发展期。新技术、新设备、新的网络建设计划不断推出,引起了业界的关注。很多有识之士把FTTH网...
通信行业2019年年报及2020年一季报总结:新基建提速,步入5G与云新周期.pdf
通信行业主题研究:AIOT浪潮将至,国产IC厂商步入成长新台阶(33页).pdf
通信电子行业周观点第9期:晶晨股份将步入高速成长通道,21Q1机构大幅加仓电子.pdf
通信电子行业周观点第6期:MLCC龙头业绩靓丽,量价齐升驱动三环风华步入高速发展期.pdf
通信行业2019年年报及2020年一季报总结:新基建提速,步入5G与云新周期
通信实习报告 学习通信已经三年了,即将步入大四,我们马上要结束大学的课程,很多人要步入 社会,很多人要进入实验室进行专业领域的研究学习,这个时候,就该把书本上的知识 运用到实际中,真正把这些知识学到手。...