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个字节
想实现服务端接受客户端的文件时先获取文件的扩展名,然后再进行保存的功能。
请各路大神赐教呀。。

解决方案 »

  1.   

    你可以先获取文件名,然后通过字符串的split方法拿到文件的扩展名,再将字符串扩展名转换成字节数组,可以先写入一个字节,即此字节数组的长度(扩展名所占的字节数),然后再写入字节数组(扩展名)。 服务端:先定义一个字节变量,用于接受字节数组的长度(扩展名所占的字节数),然后根据这个长度创建一个数组,用于存储扩展名,这样就将扩展名存下来了
      

  2.   

    这里socket只是传文件内容,没有传文件名,可以试试将文件名通过io流传到服务器
      

  3.   

    是不是可以模仿一下http先发消息头,再发文件,读的时候先读消息头,读到某一标志位后开始存文件
      

  4.   


    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_);
    }