读书人

java的容易文件传输

发布时间: 2013-03-28 10:20:24 作者: rapoo

java的简单文件传输
package FileConvey;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner;/** * 创建文件传输客户机类 * @author Administrator * */public class ChatClient {private DataOutputStream dous;//输出流对象/** * 主函数 * @param args */public static void main(String[] args){ChatClient cc=new ChatClient();cc.ConnServer("localhost", 1234);}/** * 启动客户机的方法 * @param ip:服务器ip地址 * @param port:指定的端口 */public void ConnServer(String ip,int port){try {//实例化连接对象Socket client =new Socket(ip,port);//得到输入输出流对象InputStream ins=client.getInputStream();OutputStream outs=client.getOutputStream();dous=new DataOutputStream(outs);//实例化输出流对象int testCount=0;while(true){System.out.println("登陆服务器成功,请你选择你要发送的类型(1:聊天文本 2:文件)");//从命令输入行输入要发送的文件的名字Scanner sc=new Scanner(System.in);int type=sc.nextInt();if(type==1){//当是文本聊天内容时SendTextMsg("聊天内容"+testCount,8888);}else if(type==2){//当时文件时SendFileMsg("D:/argh文件夹说明.txt",8888);}testCount++;}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 发送文件的方法 * @param fileName:要发送的文件名 * @param destNum:接受者的号码 */private void SendFileMsg(String fileName, int destNum) {try {//根据文件名字创建文件对象File file=new File(fileName);//根据文件对象,构造一个输入流InputStream ins=new FileInputStream(file);int fileDataLen=ins.available();//得到文件数据的总长System.out.println("文件数据的长度"+fileDataLen);int totalLen=9+256+fileDataLen;//得到要写入的总长度dous.writeInt(totalLen);dous.writeByte(2);//写入文件类型dous.writeInt(destNum);//写入接受者的账号//得到文件的短名字String shortfileName=file.getName();System.out.println("文件的短名字是:"+shortfileName);//写入文件名,不足256个长度时,补\0writeString(dous,shortfileName,256);byte[] filedata=new byte[fileDataLen];ins.read(filedata);//读入文件数据dous.write(filedata);//将数据写入到服务器dous.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/** * 向流中写入指定长度字节的方法 * @param dout:输出流对象 * @param str:要写入的字符串 * @param len:要写入的长度 */private void writeString(DataOutputStream dout, String str, int len) {try {byte[] data=str.getBytes();dout.write(data);//写入相应的字符串//假设要写入的都是短的while(len>data.length){dout.writeByte('\0');len--;}} catch (IOException e) {e.printStackTrace();}}/** * 发送文本信息的方法 * @param msg:要发送的文本信息 * @param destName:接受者的名字 * @throws IOException :抛出的异常 */private void SendTextMsg(String msg, int destName) throws IOException {byte[] strb=msg.getBytes();int totalLen=9+strb.length;//获得文件的总长度dous.writeInt(totalLen);//写入总长度dous.writeByte(1);//写入文件的类型dous.writeInt(destName);//写入接受者的名字dous.write(strb);//写入消息内容}}

?服务器类:

package FileConvey;import java.io.DataInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/** * 创建文件传输的服务器类 * @author Administrator * */public class ChatServer {/** * 主函数 */public static void main(String[] args) {ChatServer cs=new ChatServer();cs.setUpServer(1234);}/** * 在指定端口上启动一个服务器的方法 * @param port:指定的端口 */public void setUpServer(int port){try {ServerSocket server=new ServerSocket(port);//在指定端口上创建服务器对象System.out.println("服务器创建成功");//让服务器进入阻塞状态while(true){//服务器循环等待Socket client=server.accept();System.out.println("服务器地址:"+client.getRemoteSocketAddress());//调用处理连接对象的方法processChat(client);}} catch (IOException e) {e.printStackTrace();}}/** * 处理连接对象的方法 * @param client:连接对象 */private void processChat(Socket client) {try {OutputStream out=client.getOutputStream();//得到输出流对象InputStream in=client.getInputStream();//得到输入流对象//将输入流包装为DataInputStream一边读取原始类型的流DataInputStream dins=new DataInputStream(in);while(true){//开始按照格式读取每一条消息//读取消息的长度int totalLen=dins.readInt();System.out.println("*****这条消息的总长度为:"+totalLen);//读取消息的类型标示byte flag=dins.readByte();System.out.println("*****消息的类型为:"+flag);//读取目标客户号码int destNum=dins.readInt();System.out.println("*****目标客户号码为:"+destNum);//根据消息的类型,读取消息体if(flag==1){//当消息为1时,是文本聊天消息//创建对应消息体部分的字节数组byte[] data=new byte[totalLen-9];dins.readFully(data);String msg=new String(data);//转化为相应的字符串System.out.println("发给"+destNum+"的文本为"+msg);}else if(flag==2){//文件数据包解析System.out.println("发文件给"+destNum);byte[] data=new byte[256];//储存文件名的byte数组dins.readFully(data);//解析文件名,并除去末尾的空格String fileName=new String(data).trim();System.out.println("读到的文件名为:"+fileName);//读取余下文本内容的字节data=new byte[totalLen-9-256];System.out.println(data.length);dins.readFully(data);System.out.println("到此了");//保存文件到当前目录下:FileOutputStream fous=new FileOutputStream(fileName);fous.write(data);//写出该文件fous.flush();//刷新fous.close();System.out.println("文件保存完成了");}else{System.out.println("收到未知数据包:"+flag);client.close();}}} catch (IOException e) {e.printStackTrace();}}}

?

读书人网 >编程

热点推荐