为了账号安全,请及时绑定邮箱和手机立即绑定

传送文件的问题,自己找不到问题,希望能够帮我解决一下困扰

服务端*************
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();


	}

}
************************************错误信息***************************************
Exception in thread "main" java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(SocketInputStream.java:168)
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
	at java.io.InputStreamReader.read(InputStreamReader.java:167)
	at java.io.BufferedReader.fill(BufferedReader.java:136)
	at java.io.BufferedReader.readLine(BufferedReader.java:299)
	at java.io.BufferedReader.readLine(BufferedReader.java:362)
	at com.imooc.Server.main(Server.java:36)


正在回答

2 回答

首先你应该把你的错误提示也贴出来,其次你在服务端并没有关闭流。

0 回复 有任何疑惑可以回复我~
#1

慕粉Coder 提问者

老师,我想问一下,服务端没有关闭流指的是? serverSocket.close(); socket.close(); is.close(); isr.close(); br.close(); is1.close(); ois.close(); fos.close(); 我自己认为是都关闭了的,请指教
2016-07-07 回复 有任何疑惑可以回复我~

老师,我想问一下,服务端没有关闭流指的是?

 serverSocket.close();

        socket.close();

        is.close();

        isr.close();

        br.close();

        is1.close();

        ois.close();

        fos.close();

我自己认为是都关闭了的,请指教

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

传送文件的问题,自己找不到问题,希望能够帮我解决一下困扰

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信