0 0

Java TCP文件服务器,下载到的文件和原文件大小不一致5

本人编程新手,要求用java写一个tcp文件服务器,客户端向服务器端发送请求,下载服务器端的文件。我出现的问题是:客户端从服务器端下载到的文件大小不一致,而且下载到的文件也带不开,真诚请教解决办法。
//客户端代码
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;


public class SendFileClient
{

    
 
    public static void main( String[] args ) throws IOException
    {
        // TODO Auto-generated method stub

        System.out.println( "This is client" );
        byte[] buf = new byte[1024];

        System.out.println("Please input the Ip Address that you connect");
		//Create the scanner s1 to let user input the server IP address
        Scanner s1 = new Scanner(System.in);
        String ip = s1.nextLine();
        System.out.println("Please input the port");
		//Create the scanner s2 to let user input the server port
        Scanner s2 = new Scanner(System.in);
        String portStr = s2.nextLine();
		//Convert the String portStr to integer
        int port = Integer.parseInt(portStr);

        try
        {
            // Create the socket
            Socket s = new Socket();
            s.connect ( new InetSocketAddress (ip,port ));
			//Create the outstream
            OutputStream os = s.getOutputStream( );
			//Create the inputstream
            InputStream is = s.getInputStream( );
			//Read the buf though the inputstream
            int len = is.read( buf );
			//Print out the data by converting it to a String
            System.out.println( new String( buf, 0, len ) );
            System.out.println("Please input the request");
			//Create scanner s3 to Let the user input the request
			//The request format has to be:Send filename
            Scanner s3 = new Scanner(System.in);
            String req = s3.nextLine();
            os.write( req.getBytes( ) );
			//Read the data to buf though the inputstream
            int len2 = is.read(buf);
            String file = new String(buf,0,len2);
            System.out.println("Wait...");
			//Create the dataoutputstream for receiving the file
           DataOutputStream fos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
            byte[] buff = new byte[1024];
			//Receive the file, write it out.
            int data;
            while ( -1 != ( data = is.read(buff) ) )
            {
                fos.write( buff );
            }
            
     
            
           
            System.out.println("\nFile has been received successfully.");
			fos.flush();
			fos.close();
			//Close the outputstream
			os.flush();
            os.close();
			//Close the inputstream
            is.close();
			//Close the socket
            s.close( );
        } catch ( Exception ex )
        {
            ex.printStackTrace();
        }
    }
    

}




import java.net.*;
import java.io.*;

//服务器端代码
public class SendFileSocket extends Thread
{
    /**
     * @param args
     */
    public static void main( String[] args )
    {
	//Start the server
        server( );

    }
	//Set the Server port =10000
    private static final int  PORT  = 10000;
    private Socket  s;

    public SendFileSocket( Socket s )
    {
	//Create the socket object
        this.s = s;
    }

    public void run()
    {
        try
        {
		//Create the outputstream
            OutputStream os = s.getOutputStream( );
			//Create the inputstream
            InputStream is = s.getInputStream( );
            os.write( "Hello,welcome you!".getBytes( ) );
			//Define the data byte as buf
            byte[] buf = new byte[10240];
            while ( true )
            {
				//Read the buf though the inputstream
                int len = is.read( buf );
                String revStr = new String( buf, 0, len );
				//Print out the request information from the client
                System.out.println( "This client wants to "+revStr );
                String fileName;
				//The requet should starts with Send
                if ( revStr.startsWith( "Send " ))

                {
					//Get the file name from the request by using
					//The method getFileName
                    fileName = getFileName( revStr );
					//Print out the filename
                    System.out.println( "The file name is :"+fileName);
					//Write out the filename though the outputstream 
                    os.write(fileName.getBytes());
                    System.out.println("Start to send file " +fileName);
                    String filePath = "C:/";
                    String file = (filePath+fileName);
					//Combine the filepath and the filename
                    File fi = new File(file);
                   //Declare a datainputstream
				   DataInputStream fins = new DataInputStream(
                        new BufferedInputStream(new FileInputStream(file)));
                    DataOutputStream ps = new DataOutputStream(s.getOutputStream());
					//Start to read the data from the file
                    byte[] buff = new byte[10240];
                    int data;
                    while ( -1 != ( data = fins.read(buff) ) )
                        {
                            //send the file data to the client
                            ps.write( buff );
							
                        }
                        System.out.println("Transfer complete.");
						ps.flush();
						ps.close();
                        break;
						
                 }
                  	else{

                  		System.out.println("Request is wrong");
                  		System.exit(0);


                  	}

            }
			
			
			os.flush();
			//Close the outputstream
            os.close( );
			//Close the inputstream
            is.close( );
			//Close the socket
            s.close( );
        } catch ( Exception e )
        {
		//Catch the exception
            e.printStackTrace( );
        }

    }

    /* 
     * Function:Get the filename from the request which is sent from the client
     * param:The request from the client has to start with"Send"
     * Return: The filename
     */
    private String getFileName( String revStr )
    {
        String fileName;
        fileName = revStr.substring( 4 );
        while ( fileName.startsWith( " " ) )
        {
            fileName = fileName.substring( 1 );
        }
        return fileName;
    }

    public static void server()
    {
        System.out.println( "This is server" );
        try
        {
            ServerSocket ss = new ServerSocket( PORT );
            int count = 0;
            while ( true )
            {
				//Create a socket for waiting for the client connect
                Socket s = ss.accept( );
				//Count the client and print out
                count++ ;
                System.out.println( "This is the " + count + "'st client connetion!" );
				//Start new thread for this socket
                new Thread(new SendFileSocket(s)).start();

            }
        } catch ( Exception ex )
		//Catch the exception
        {
            ex.printStackTrace( );
        }
    }


}


2014年5月19日 07:52

4个答案 按时间排序 按投票排序

0 0

采纳的答案

            byte[] buff = new byte[1024];  
            //Receive the file, write it out.  
            int data;  
            while ( -1 != ( data = is.read(buff) ) )  
            {  
                fos.write( buff,0,data );  
            }  

你这里读到的不一定就是1024,特别是最后一次,不太可能是1024的整数,所以你写出的时候,应该以读到的为准来写出,而不是把整个buff都写出

2014年5月19日 08:38
0 0

建议采用mina或者netty这样的框架来做,会简单很多。

2014年5月21日 09:06
0 0

1.你服务器端

while (-1 != (data = fins.read(buff))) {
// send the file data to the client
// 这种表示将buff 全部发送过去,如果buff 不是满的,会多出限制。
// 比如你缓冲区1024*1024 1M,但是你发送1KB 的文件,那么也会导致客户端接受1M的数/据,多出来的默认是0,表示是byte 空的
ps.write(buff);

// 正确的做法应该是这样,获取多少发多少,两边这样改了就OK了
ps.write(buff,0,data);

}


2.你客户端也可以采取同样的方式,你也可以采用自带的缓冲流:public BufferedInputStream(InputStream in, int size) 类似的,多看看API 很多的。

3.一般网络传文件,最好先发送一段数据,表示文件的大小,先接受,然后在读取文件流,比较大小,确定文件大小是否一致。

4.如果文件比较大,或者比较多,你可以采用多线程,但是每个线程你最好都监听一下获取了多少字节,然后再合并到一起,等等措施。自学,可以多尝试哦~.~

2014年5月19日 13:18
0 0

服务器端代码第36行和66行byte[] buf = new byte[10240];10240改为1024

2014年5月19日 11:10

相关推荐

    基于java的局域网文件管理系统

    - **重命名**:涉及到更改文件名的操作,需要在服务器端进行,同时更新所有相关的索引和元数据,以保持一致性。 - **查找**:实现文件查找功能,可能涉及文件名、内容或属性的搜索算法,这需要高效的检索策略。 5...

    java工具类 ftp 文件比较 socket http

    例如,`java.io.File`类可以获取文件的基本信息,通过比较文件大小和修改时间进行初步判断。对于内容比较,可以使用`java.nio.file.Files`的`readAllBytes()`方法读取文件内容,然后进行字节对齐比较。如果文件较大...

    java版飞鸽传书 TCP/IP连接

    Java版的飞鸽传书是基于TCP/IP协议实现的一款文件传输程序,它允许用户通过网络在不同的设备之间发送和接收文件。TCP/IP(Transmission Control Protocol/Internet Protocol)是一组通信协议,构成了互联网的基础,...

    java实现基于UDP协议的简单聊天室,带文件分享功能

    2. 使用Socket建立TCP连接,将文件名和文件大小信息发送给服务器。 3. 服务器确认接收后,客户端开始发送文件内容,服务器接收并写入本地文件。 4. 文件传输完成后,双方关闭连接。 为了确保文件的完整性和一致性,...

    JAVA文件传输(LW+源代码).zip

    综上所述,"JAVA文件传输(LW+源代码).zip"包含了一个全面的Java文件传输系统的实现,涉及到的技术和知识点广泛,对学习和理解Java网络编程、文件操作、多线程、数据安全等方面具有很高的参考价值。通过深入研究和...

    JAVA文件传输(+源代码).rar

    这需要计算已传输文件大小与总大小的比例,并实时更新UI。 8. **文件校验**:传输完成后,通过计算MD5或SHA哈希值来验证文件是否完整无误。服务器和客户端分别计算文件的哈希值,如果一致,表明传输成功。 9. **源...

    多线程实现文件下载,代码规范明了

    1. 分割文件:根据文件大小,将文件分割成多个部分,每个部分对应一个线程的任务。 2. 创建线程:为每个文件部分创建一个线程,每个线程负责下载其对应的部分。 3. 下载处理:每个线程使用相应的传输协议(如...

    课程设计_聊天文件java_java_java聊天室_

    同时,需要考虑文件的命名冲突、文件大小限制以及传输进度的反馈等问题。 6. **用户界面** 为了提供良好的用户体验,聊天室通常会包含图形用户界面(GUI)。Java的Swing或JavaFX库可用于创建GUI,提供文字输入框、...

    Java在游戏服务器开发中的应用.docx

    Java在游戏服务器开发中扮演着重要的角色,尤其在网页游戏和手机游戏市场快速增长的背景下,其跨平台性、安全性、面向对象特性和强大的分布式能力使其成为游戏服务器开发的理想选择。以下将详细介绍Java在游戏服务器...

    java网络编程技术

    这个例子中,文件上传后的处理包括了数据库操作,这通常涉及事务管理和错误处理,以确保数据的一致性和完整性。在实际应用中,还需要考虑安全性问题,例如防止SQL注入,限制上传文件类型和大小以防止服务器被溢出...

    纯Java音乐共享平台

    开发者需要熟练掌握Java的I/O流技术,以便高效地处理音乐文件,同时考虑到文件大小和网络速度的影响,可能还需要实现断点续传的功能,以提高用户体验。 6. **安全性与错误处理**: 在任何网络应用中,安全性都是不可...

    TFS JavaAPI源码(附带JUinit测试用例)

    3. **元数据管理**:TFS支持文件的元数据存储,如文件大小、创建时间等。API提供了获取和修改元数据的方法。 4. **分块上传**:对于大文件,TFS支持分块上传,确保上传的可靠性和效率。API中会有对应的数据分块处理...

    socket 文件传送代码

    在给定的"文件传送代码"压缩包中,可能包含了服务器端和客户端的Java代码示例,这些示例可以帮助初学者理解如何使用Socket进行文件传输。通过阅读和运行这些代码,你可以更深入地了解Socket编程的实际应用。 总的来...

    wenjiachuanshu.rar(这是一段自己写的javasocket文件传输的代码)

    3. **单元测试**:编写测试用例,模拟不同的网络环境和文件大小,以覆盖更多可能的问题场景。 4. **代码审查**:检查是否有同步问题,如在多线程环境中,确保对共享资源的访问是安全的。 通过以上分析,我们可以...

    GFS(Google File System)架构

    首先,GFS的核心架构由三个主要组件组成:文件客户端、主服务器(Master)和存储服务器(Chunk-server)。文件客户端作为用户与系统的接口,提供了基本的文件操作功能。主服务器是系统中的单点,负责管理文件元数据...

    文件收发socket,一个接收,一个发送

    在文件收发中,TCP Socket可以确保文件在传输过程中的完整性和一致性。 创建TCP Socket的第一步是在服务器端创建一个Socket实例,绑定到特定的IP地址和端口号,然后调用listen()方法进入监听状态。例如,在Python中...

    java swing 聊天程序

    10. **网络编程**:使用Java的`Socket`或`ServerSocket`类进行网络通信,建立客户端和服务器之间的连接。考虑到性能和可靠性,可能还需要使用线程池管理和异常处理。 这个项目涵盖了Java Swing GUI开发、数据库操作...

    模拟迅雷案例

    实现断点续传需要保存已下载的部分文件信息,包括文件大小、已下载的字节数和当前的文件校验值。当用户再次启动下载时,程序会检查本地的存储状态,然后向服务器请求剩余部分的数据。 在项目中,"迅雷.sql"可能是一...

    布式系统期末大作业:模拟一个简单的分布式文件系统.zip

    此外,他们还需要理解并应用网络协议(如TCP/IP)、数据结构(如B树、哈希表)和算法(如一致性哈希)等相关知识。 这个项目的完成不仅要求学生具备扎实的计算机科学基础,还需要他们具备解决实际问题的能力,理解...

    JAVA试题及参考答案

    15. **TCP/IP客户端和服务器**:在Java中,`Socket`和`ServerSocket`类用于实现TCP/IP的客户端和服务器通信。 此外,API是Application Programming Interface的缩写,它提供了各种预先定义的类和方法供开发者使用。...

Global site tag (gtag.js) - Google Analytics