通信协议的概念与传送文件的举例

[b][color=blue][color=blue]
通信协议概念——文件传送;
我们的客户端在与服务器端在交流的过程中就拿QQ来举例吧~可以聊天~可以互相传送各种文件~我们还要添加或删除好友~注册什么什么~获取好友列表~进入空间等等一大堆的事情~可是我们的输入流和输出流总是一大堆的字节~我们要准确的来设置和处理我们要发布的和接收的信息我们就必须事先准备好和服务器之间的协议~
拿发送消息和发送文件来说吧~
我们可以事先给消息一个标记位~比如消息是0x0,文件的是0x1;这样我们在接受的 时候可以通过先读取标记位就可以明白是消息还是文件了~紧接着我们可以继续定义其他的一些事情~
如果是消息~我们得把这个消息的字符长度告诉对方~紧接着就是消息内容~如果是文件我们得知道文件名和文件内容~所以我们可以定义文件名长度,文件名,文件长度,文件内容~这样按照一定的顺序和组织发出去的字节流我们就可以按照这个规则来读取~就更明了了~当然啦~这个只是举个例子~我们还可以分的再细一些~比如发送的时间~是发给谁的~怎么怎么样都行~~
下面的代码就是按照这个协议写的内容了举例了~[/b]

先建立一个客户端~我们先在客户端来按照这个协议来发送信息[/color][/color]Socket socket = new Socket(string, port);
FileInputStream fis=new FileInputStream(filename);
int length=fis.available();///返回该文件下的字符总长度
byte[] bytes=new byte[length];
int readLen = fis.read(bytes);///一次性全部读完~~于是这个字节数组就有东西了
System.out.println("readLen="+readLen);
// String s=new String(bytes);//转成字符串再输出~~
// System.out.println(s);

fis.close();//文件操作结束后应该关闭掉它~~

OutputStream out=socket.getOutputStream();
DataOutputStream dos=new DataOutputStream(out);
int size=filename.getBytes().length;//文件名的长度
dos.writeInt(size);
System.out.println("文件名长度"+size);
dos.writeInt(length);///文件的长度
System.out.println("文件长度"+length);
dos.write(filename.getBytes());

dos.write(bytes);
dos.flush();
dos.close();
[b]
[color=blue]再在服务器端按照这个协议解析这个信息~~
S是服务器端得到的Socket对象[/color][/b]
InputStream input = s.getInputStream();
output = s.getOutputStream();
DataInputStream dis=new DataInputStream(input);
int size=dis.readInt();///文件名长度
System.out.println("文件名长度"+size);
int size1=dis.readInt();//文件长度
System.out.println("文件长度"+size1);
byte[] bytes=new byte[size];
dis.readFully(bytes);

String filename=new String(bytes);
System.out.println("文件名是:"+filename);

byte[] b=new byte[size1];
dis.readFully(b);
[color=blue][b]最后生成一个文件保存起来~~并关闭所有的流~~~[/b][/color]
File f=new File("E:/AXWWWWWWWAXA.exe");
f.createNewFile();
FileOutputStream fos=new FileOutputStream(f.getAbsolutePath(),true);
fos.write(b);
fos.flush();
dis.close();
fos.close();
[size=large][color=red]总结:
俗话说无规矩不成方圆~我们只要事先制定好了规矩~就不怕一大堆的信息交汇了~我们就可以大胆的去写通信类的产品了~而且在数据库的设计和增删改查过程中也简便多~也有所启发~是不是有种豁然开朗的感觉哈?~[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值