白日何短短,百年苦易满

JAVA文件传输(Client端)

 

文件传输虽然只是JAVA socket编程基础的应实现的功能,但对于初学者而言,若没细致的理清思路及各种流的转换关系,则掌握这部分知识肯定很吃力。闲来无事,整理了下关于Client端与Server端的消息发送及文件传送(客户端向服务器端发送文件)的源码,并介绍下答题思路,以供初学者朋友学习。

总的思路:

客户端:读取本地文件,将文件转换成输出流,并自定义传输协议字符串,先将协议传给服务器端,然后再将流传过去。

服务器端:先将接收到的客户端传过来的协议解析出来(也就是拆分字符串),然后根据协议内容创建文件,再将接收过来的流写入新建的文件中。

public class Myclient {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//创建socket对象
Socket so=new Socket();
Scanner scan=new Scanner(System.in);
//=======================================================================================
//文件传输 应该自己定义一个格式(协议)==文件名、大小、自己设定的协议码 然后将此格式先发送给服务器,让其坐准备(比如创建文件)
try {
//连接服务器
so.connect(new InetSocketAddress(“127.0.0.1”,5121));
//创建字节输出流
OutputStream outst= so.getOutputStream();
File file=new File(“D:\\te\\test.txt”);
if(!file.exists()){
System.out.println(“要发送文件不存在!”);
}
FileInputStream tofile=new FileInputStream(file);
BufferedInputStream tobr=new BufferedInputStream(tofile);
//自定义协议格式 协议码、文件名、文件大小
//PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
//available() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
PrintStream prin=new PrintStream(outst);
prin.println(“888/$”+file.getName()+”/$”+tobr.available());// prin.println(Object obj)
prin.flush();
//将本地读取的文件传送给服务器
int n=0;

byte [] by=new byte[200];//数组存储本地读取并写入的文件
//循环读取文件 直到读取完
while((n=tobr.read(by))!=-1){
outst.write(by, 0, n);//使用socket的outputStream对数据包进行输出
outst.flush();
}
if(tobr!=null){
tobr.close();
}

//=======================================================================================
//字符串发送
//Socket so=new Socket(“192.168.4.20″,9876);
//创建字节输入流
InputStream ins= so.getInputStream();
//字节输入流转换为字符输入流
InputStreamReader reader=new InputStreamReader(ins);
//字符缓存输入流
BufferedReader br=new BufferedReader(reader);
String readstr=br.readLine();//读取
System.out.println(readstr);//将服务器传过来的信息输出
//向服务端发送数据
BufferedWriter buffwrite= new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
while(true){//如果不循环输入 输入一次后就会结束
String s= scan.nextLine();
buffwrite.write(s+”\n”);
buffwrite.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

未经允许不得转载:徐宏涛博客 » JAVA文件传输(Client端)

分享到:更多 ()

评论 2

评论前必须登录!

  1. #2

    回复@哎呀可有可无:[偷乐][偷乐][偷乐][偷乐][喵喵][喵喵][喵喵]

    一次远足6年前 (2015-04-23)
  2. #1

    So,我看不懂