当前位置:编程学习 > JAVA >>

Socket进行文件上传时,服务端如何先获取文件的扩展名?

package test;

import java.awt.Toolkit;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

//接受多媒体数据服务端思路
/*1,创建服务端socket服务,并明确端口
2,创建一个流,将接受到的文件保存到本地
3,获取客户端socket对象
4,获取socket对象的读取流
5,将接受到的数据写入硬盘
6,关闭流*/
public class ServerSocketDemo {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("服务端启动。。。。");

//创建服务端socket服务,并明确端口
ServerSocket server = new ServerSocket(5005);

//创建一个输出流,由于将读取到的数据写到服务端
BufferedOutputStream bufout = new  BufferedOutputStream(new FileOutputStream(new File("C://my3.mp3")));

//获取客户端socket对象
Socket so = server.accept();
//获取客户端读取流
BufferedInputStream bufin = new BufferedInputStream(so.getInputStream());
byte[] name = new byte[6];
bufin.read(name, 0, name.length);
String str = new String(name);
System.out.println(str);
//读取文件
byte[] by = new byte[1024];
int len = 0;
while((len = bufin.read(by))!=-1)
{
bufout.write(by, 0, len);
bufout.flush();
}
//关闭流
bufout.close();
server.close();
}

}



客户端
package test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

//发送多媒体数据思路
//1,创建客户端socket服务,并确定要发送的主机端口
//2,创建一个流与要发送的文件相关联
//3,获取socket流的输出流对象
//4,定义一个缓冲区,发送数据
//5,关闭流
public class ClientSocketDemo {

public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
System.out.println("客户端启动。。。。");
//客户端socket服务
Socket so = new Socket(InetAddress.getLocalHost().getHostAddress(),5005);

File file = new File("F://my.mp3");
//与要发送的媒体文件相关联
BufferedInputStream buin =  new BufferedInputStream (new FileInputStream(file));

//获取socket流的输出流对象,将数据发送出去
BufferedOutputStream buout = new BufferedOutputStream(so.getOutputStream());

byte[] byname = file.getName().getBytes();
// System.out.println(byname.length);
buout.write(byname);
// buout.write(file.getName().getBytes());
//发送数据
byte[] by = new byte[1024];
int len = 0;
while((len = buin.read(by))!=-1)
{
buout.write(by,0,len);
buout.flush();
}
//关闭流
buin.close();
so.close();
}

}






这是我写的,可是不可能每个文件名称都占6个字节
想实现服务端接受客户端的文件时先获取文件的扩展名,然后再进行保存的功能。
请各路大神赐教呀。。。。。 --------------------编程问答-------------------- 你可以先获取文件名,然后通过字符串的split方法拿到文件的扩展名,再将字符串扩展名转换成字节数组,可以先写入一个字节,即此字节数组的长度(扩展名所占的字节数),然后再写入字节数组(扩展名)。 服务端:先定义一个字节变量,用于接受字节数组的长度(扩展名所占的字节数),然后根据这个长度创建一个数组,用于存储扩展名,这样就将扩展名存下来了 --------------------编程问答-------------------- endwith() --------------------编程问答-------------------- 这里socket只是传文件内容,没有传文件名,可以试试将文件名通过io流传到服务器 --------------------编程问答-------------------- 是不是可以模仿一下http先发消息头,再发文件,读的时候先读消息头,读到某一标志位后开始存文件 --------------------编程问答-------------------- 可以自己定义一个数据结构,包含文件名,文件长度,文件内容。。。。 --------------------编程问答-------------------- 划定数据的存储区域即可 --------------------编程问答--------------------

public static void main(String[] args) throws IOException {
final String Encoding = "GBK";
String name = "D:\\log.txt";
File file = new File(name);
String fileName = file.getName();

byte[] fileNameBytes = fileName.getBytes(Encoding);
int fileNameLen = fileNameBytes.length;
long fileLen = file.length();

byte[] buffer = new byte[4+fileNameLen+8];
buffer[0] = (byte)((fileNameLen>>24)&0xFF);
buffer[1] = (byte)((fileNameLen>>16)&0xFF);
buffer[2] = (byte)((fileNameLen>> 8)&0xFF);
buffer[3] = (byte)((fileNameLen>> 0)&0xFF);
System.arraycopy(fileNameBytes, 0, buffer, 4, fileNameLen);
buffer[4+fileNameLen+0] = (byte)((fileLen>>56)&0xFF);
buffer[4+fileNameLen+1] = (byte)((fileLen>>48)&0xFF);
buffer[4+fileNameLen+2] = (byte)((fileLen>>40)&0xFF);
buffer[4+fileNameLen+3] = (byte)((fileLen>>32)&0xFF);
buffer[4+fileNameLen+4] = (byte)((fileLen>>24)&0xFF);
buffer[4+fileNameLen+5] = (byte)((fileLen>>16)&0xFF);
buffer[4+fileNameLen+6] = (byte)((fileLen>> 8)&0xFF);
buffer[4+fileNameLen+7] = (byte)((fileLen>> 0)&0xFF);

//假设输出流为 out 对象。
OutputStream out = new ByteArrayOutputStream();
out.write(buffer);

//假设输入流为 in 对象。
InputStream in = new ByteArrayInputStream(buffer);
byte[] buff = new byte[4];
in.read(buff);
int fileNameLen_ = (buff[0]&0xFF<<24) | (buff[1]&0xFF<<16) | (buff[2]&0xFF<<8) | (buff[3]&0xFF);
System.out.println(fileNameLen_);
buff = new byte[fileNameLen_];
in.read(buff);
String fileName_ = new String(buff,Encoding);
buff = new byte[8];
in.read(buff);
long fileLen_ = (buff[0]&0xFF<<56) | (buff[1]&0xFF<<48) | (buff[2]&0xFF<<40) | (buff[3]&0xFF<<32) | (buff[4]&0xFF<<24) | (buff[5]&0xFF<<16) | (buff[6]&0xFF<<8) | (buff[7]&0xFF);
System.out.println("文件名     :\t"+fileName_);
System.out.println("文件长度:\t"+fileLen_);
}
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,