socket服务器文件名和客户端一致,socket传送文件,不能正常运行,自己又找不到问题,急求解...

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.ObjectInputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

/**

* 服务端:实现接收客户端发送的文件

*

* @throws IOException

*/

public static void main(String[] args) throws IOException {

String filename = null;

String filesize = null;

File file=null;

// 1.创建ServerSocket实例,指定绑定的端口号,并监听次端口

ServerSocket serverSocket = new ServerSocket(8235);

// 2.调用accept()方法开始监听,等待客户端的连接

Socket socket = serverSocket.accept();

System.out.println("***启动服务器,等待连接…………………………");

// 3.读取客户端发送的请求信息

InputStream is = socket.getInputStream();

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

String info=br.readLine() ;

// 4.解析客户端发送的文件信息,正确的,保存文件名以及文件的大小,为下面接收文件内容做准备

int index = info.indexOf("/#");// 查找/#在字符串中的索引位置

String daima = info.substring(0, index);// 获取字符串从0位置-index(不包括)之间的字符串内容

if (!daima.equals("111")) {

System.out.println("服务器收到的文件的协议代码和客户端的文件协议代码不匹配!!");

} else {

System.out.println("文件的协议代码一致!!!");

String infoChild = info.substring(index + 2);

// 获得info字符串的子字符串,该子字符串从指定索引处的字符开始,直到此字符串末尾部分的内容

int indexC = infoChild.indexOf("/#");

filename = infoChild.substring(0, index).trim();// trim忽略前导空白和尾部空白

filesize = infoChild.substring(index + 2).trim();

}

// 将接收到的文件保存在本地

file = new File(filename);

if (!file.exists()) {

file.createNewFile();

} else {

System.out.println("本路径已存在相同文件,进行覆盖");

}

// 5.服务器接收文件内容,并将内容保存到本地文件中

InputStream is1 = socket.getInputStream();// 获取传送文件的字节流

ObjectInputStream ois = new ObjectInputStream(is1);

// long fileSize = Long.parseLong(filesize);//将文件大小转换成有符号的十进制形式

/** 将文件包装到文件输出流对象中 */

FileOutputStream fos = new FileOutputStream(file);

byte[] data = new byte[ois.available()];

// ObjectInputStream的available()方法,读取字节数

int len;

while ((len = ois.read()) != -1) {// ObjectInputStream的read()方法,读取数据字节;如果读取的字节已到达流的末尾,则返回

// -1。

fos.write(data, 0, len);

fos.flush();

}

serverSocket.close();

socket.close();

is.close();

isr.close();

br.close();

is1.close();

ois.close();

fos.close();

}

}

客户端*******************************

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

public class Client {

/**

* 客户端:向服务端发送文件

* 1、建立与服务器端的连接,

* 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器

* 3、循环读取本地文件,将文件打包发送到数据输出流中

* 4、关闭文件,结束传输

*

*/

public static void main(String[] args) throws UnknownHostException, IOException {

String filename=null;

int filesize;

//1.指定要发送的文件,并确保文件存在

File sendfile = new File("C:\\Users\\Lbb\\Desktop\\API.CHM");

if(!sendfile.exists()){

System.out.println("客户端:要发送的文件不存在");

}

//2.创建Socket实例,指定服务器的IP地址和端口号

Socket socket=new Socket("localhost",8235);

//3.向服务器发送文件的协议编码(/#),文件名(/#)和文件大小的信息

FileInputStream fis=new FileInputStream(sendfile);

ObjectInputStream ois=new ObjectInputStream(fis);

filename=sendfile.getName();//获取文件名

filesize=ois.available();//获取文件的字节数(文件大小)

OutputStream os=socket.getOutputStream();

PrintWriter pw=new PrintWriter(os);

pw.write("111/#"+filename+"/#"+filesize);

pw.flush();

socket.shutdownOutput();

//4.向服务器传送文件的内容

byte[]data=new byte[ois.available()];

int len;

while((len=ois.read())!=-1){

os.write(data, 0, len);

os.flush();

}

socket.close();

fis.close();

ois.close();

os.close();

pw.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值