2 fitch Fitch_ 于 2016.01.28 20:50 提问

java socket 通信 服务端接收的文件大于客户端发出的文件 是什么鬼

//服务端
package Socket;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class Server2User extends Thread{
private Socket socket;
private InputStream is;
private BufferedInputStream bis;
private FileOutputStream fos;
private File file;
private byte name[] = new byte[1024];
private byte transport[] = new byte[1024];
private File path;

public Server2User(Socket socket)
{
    this.socket= socket;
}

public void run()
{
    try {
        is = socket.getInputStream();
        bis= new BufferedInputStream(is);
        bis.read(name);
        String filename = new String(name);
        filename = filename.trim();
        System.out.println("得到文件名"+filename);

         path = this.createFile(filename);
         System.out.println(path.getName());
        int length;
        fos = new FileOutputStream(path);
        int i = 0;
        while((length=bis.read(transport))!=-1)
        {
                this.write2file(transport);
                i++;
        }
        this.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}


private void write2file(byte[] transport)
{
    try {
         fos.write(transport);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


private File createFile(String filename)
{

    try {
        file = new File("f:/test/"+filename);
        file.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return file;

}
private void close()
{

        try {
            if(is!=null)
                is.close();

            if(bis!=null)
                bis.close();
            if(fos!=null)
                fos.close();
            if(is!=null)
                is.close();
            if(socket!=null)
                socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}

}
//客户端
package Socket;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSocket_upload {
private Socket socket;
private OutputStream os;
private BufferedOutputStream bos;
private String path;
private FileInputStream fis;
private File file;
public ClientSocket_upload(String path)
{
this.path = path;
}
public void uploadfile(){
try {
//1.创建客户端Socket,指定服务器地址和端口
socket= new Socket("10.104.77.108", 1080);
//2.获取输出流,向服务器端发送信息
os = socket.getOutputStream();//字节输出流
bos = new BufferedOutputStream(os);
file = new File(path);
fis= new FileInputStream(file);
String name = file.getName();
byte[] temp = name.getBytes();
byte[] bname = new byte[1024];
byte[] by = new byte[1024];
for(int i = 0 ;i<=bname.length-1;i++)
{
if(i<=temp.length-1)
{
bname[i] = temp[i];
}
else
{
bname[i]=0;
}
}
bos.write(bname);

        while((fis.read(by))!=-1)
        {
            bos.write(by);
        }

        fis.close();
        bos.close();
        os.close();
        socket.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

3个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.28 22:40
已采纳

你的代码没有问题,我测试了你的代码,传输的文件是几k的小文件没有问题,又传输一个300MB的大文件时也没有问题。
我的测试代码是:自定义一个Server类.
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(1080);
while(true){
Socket socket = server.accept();
new Server2User(socket).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端的main方法是:

    public static void main(String[] args) {
        ClientSocket_upload u = new ClientSocket_upload("D:/WoodWang/JavaSoft/eclipse-jee-mars-R-win32-x86_64.zip");
        u.uploadfile();
    }

不知道你的测试代码是怎么写的呢?

wojiushiwo945you
wojiushiwo945you 回复Fitch_: 看你的代码没有问题的。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复Fitch_: 我是本机测试的,客户端、服务器端测试代码都贴在上面了。不知道你的测试代码是怎么写的。
2 年多之前 回复
Fitch_
Fitch_ 还有非常感谢帮我看代码
2 年多之前 回复
Fitch_
Fitch_ 我的天呐,300m都没有问题么。我是两个电脑传的时候几kb的没有问题,但是稍微大点的就出错了,我觉得可能是我的读取有些问题
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2016.01.28 21:05

文件接受处理的时候数据编码大小是否控制对了

91program
91program   Ds   Rxr 2016.01.28 21:07

大于,大了多少?
先检查一下接收过程,统计一下接收到的大小是否正确?如果不正确,可能是发送端就出错了;如果正确,则是可能是写文件出错了。

Fitch_
Fitch_ 传输小一点的没有问题,但是我又传输了一个120kb的txt文件里面全都是1,发现多了6kb的1我觉得我可能是读取时有错吧
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++和java通过Socket批量发送和接收文件(C++客户端发送,java服务端接收)
C++客户端代码: #include #include #include #include #include #include #pragma comment(lib,"ws2_32.lib") using namespace std; size_t getSize(string path) { FILE * file; file = fopen(path.c_str
Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
项目目的实现C#客户端向Java服务端发送消息以及文件的功能设计思路使用Socket通讯,客户端采用C#开发界面,服务端使用Java开发,最终实现向服务端发送文件和消息的功能。
Java Socket学习(二)——客户端服务端相互传输数据
上一篇文章记录的是最基础的Socket和服务端连接,这篇文章记录的内容是:客户端与服务端相互传输数据的过程,其中客户端为安卓。如有不正确(有争议)的地方希望大家予以指正。服务端服务端如题使用Java编写,继续使用上一篇文章的部分代码。服务端代码package com.imudges.j2se.network;import com.google.gson.Gson;import java.io.*;
Java,Socket&TCP编程 实现多线程端对端通信与文件传输
因为要用Java,Socket&TCP编程实现多线程端对端通信与文件传输,现学的Java
Tcp从Socket客户端上传文件到ServerSocket服务端
目的: 从客户端上传指定的文件到服务端,服务端返回上传结果 思路: 一、客户端:        1.创建客户端Socket,指定好IP地址和端口号        2.创建要上传的文件流对象        3.创建写入流(网络流),从Socket获取。将指定文件写入到网络流中,以便服务端接收        4.从网络流中接收服务端返回的信息        5.关闭流资源 二
socket ( java ) 简单多个客户端、服务端通信(多线程)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/love254443233/article/details/7897269 实现: 客户端:多个socket(多个端口),其中一个客户端的一个端口用于接收服务端发送过来的消息,其一个用于向服务端发送消息。其它客户端只有发消息的功能。 服
网络编程(22)—— socket客户端和服务端收发数据包需要一对一的关系吗?
其实这个题目应该是一个疑问句,接触了这么久的TCPIP网络编程,一直不敢确定是不是在客户端和服务端分别进行读和写时,write和read要成对出现? 我想这也是很多网络编程的新手存在的疑问吧。         下面,就针对这个问题进行试验,以解答长久以来的疑惑。   我们写这样一个服务端,每当接收到客户端的数据是重复发送三次,发回给客户端。 #include #include #inclu
Java Socket实现客户端服务端相互发送文本
Socket是网络编程的接口,它抽象成线程之间的接口。两个线程,不管它的操作系统,不管它的硬件,只要有Socket接口,在同一主机中或者在不同的主机中都能通信。我们见到的大大小小的网络程序大多都是通过Socket实现的,比如游戏服务器,ftp服务器,浏览器等。所以理解Socket编程,是网络编程的的必修课。在本篇文章中我们将讲到用Socket实现简单的服务端与客户端互相传送纯文本的例子。
Java Socket通信 客户端与服务器端的连接 和信息传输
一.建立客户端和服务器端的连接。 方法分2步: 1.在客户端创建Socket对象,用来发送连接请求 2.在服务器端穿件ServerSocket对象,用来接收请求。 //客户端 public class socket1 { Socket socket; public static void main(String[] args) { new socket1().setUpIn
java用socket客户端和服务器之间通信,传输文件经典例子(详细分析)
参考:http://blog.csdn.net/hlhakey/article/details/47030295