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

问题描述

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

}

解决方案

你的代码没有问题,我测试了你的代码,传输的文件是几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();    }

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

解决方案二:
文件接受处理的时候数据编码大小是否控制对了

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

时间: 2024-10-29 17:32:24

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

c语言-linux c socket tcp客户端只能发送一次,发送第二次服务端接收不到,必须重启才行

问题描述 linux c socket tcp客户端只能发送一次,发送第二次服务端接收不到,必须重启才行 服务端循环accept,如果每次客户端只发送一次请求,就没问题, 但是如果客户端循环发送数据,服务端就接收不到一次连接中的第二次请求. 下面贴代码,求解这个问题到底咋回事 服务端 sock_serv.c #include #include #include #include #include #include #include #include #define BACKLOG 10 #def

自己写了一个用java socket通信实现的文件传输,如果我想实现不同局域网之间的传输怎么办?

问题描述 自己写了一个用java socket通信实现的文件传输,如果我想实现不同局域网之间的传输怎么办? 可不可以把自己的电脑搭建成服务器然后把文件传上去,自己电脑的服务器可以使用非web的文件么 解决方案 不同局域网之间通信要路由器交换机支持,进行路由转发.不然不能直接通信 解决方案二: 如果Socket通信的话IP地址必须相同

java-使用socket通信服务端如何处理客户端请求

问题描述 使用socket通信服务端如何处理客户端请求 场景如下: 一个服务端,一个客户端通过socket连接服务端,假如客户端要请求服务端做一件事(如调用服务端A类的a方法), 因为socket传输的是字符串,所以我现在的做法是让客户端传一个标识符a到服务端,然后服务端 通过判断传过来的是a则调用A类的a方法, 如果我要执行A类的b方法,则传b过去再判断 我想问的是有没有更好的解决方案,或现成的框架可用 解决方案 如果你这样的需求,我觉得更适合HTTP.也许玩C++的更习惯于socket.之前

最近遇到的一个Java Socket通信的小问题

问题描述 JavaSocket通信我也是最近才开始接触,写的是跟一种光纤测量设备通信的代码.总体代码很简单,主要是规则略微复杂(厂家的定的规则,代码现在公司如果需要我明天发出来),反正最后拼接成一个byte数组发送给设备也就OK了,但问题来了.我发的命令是一个给设备校时的命令,就是把设备里的时间改成计算机当前的时间.现在情况是我只发送一次的话设备时间没有改变,但我如果写一个死循环,就是while(true){...}那种,不停发送,就可以改变设备时间,但具体是第几次改变的也是不定的.这让我很头疼

线程通信-Java socket通信 使用jconsole监控发现线程数不断增加

问题描述 Java socket通信 使用jconsole监控发现线程数不断增加 Java socket 使用线程通信,作为接收方每接收一个交易信息,使用jsonsole监控线程发现线程数量增加22个左右,经生产环境运行结果,当已启动线程总数达到2600多时 tomcat出现类似于假死的状况,不再接收任何交易信息.目前正在使用系统定时任务每天定时重启(每日交易量在70-80左右),求大手帮我分析下,现在附上图片和部分代码.jsonsole监控图:部分代码;public class SimpleS

android 服务端-Android 服务端接收数据

问题描述 Android 服务端接收数据 在安卓模拟器中能从服务端接收数据在客户端显示,后台数据库怎么设置?安卓模拟器本身有没有自带数据库还是要另外装数据库? 解决方案 数据库肯定是在服务器中的,你可以在服务器中放webservice,或者用其它的方式连接服务器来交互! 解决方案二: 数据库肯定是在服务器中的,你可以在服务器中放webservice,或者用其它的方式连接服务器来交互! 解决方案三: 服务端编写相应的接口 解决方案四: 你说的是客户端的数据库还是服务器端的数据库?如果数据需要保存到

java socket通信,字节丢失问题

问题描述 java socket通信,字节丢失问题 请教高手一个问题: 我现在在多台win7和xp的主机上进行java的socket通信,主机间的源代码是通过svn同步,肯定完全一样,现在问题是(以下测试的socket通信文件完全一样):两台xp主机间通信完全没有问题,xp往win7发送也没有问题 问题出在:当win7往xp发送数据时,就会丢字节,在xp上最多接收8755个字节(接收缓冲区足够大),这样该如何解决,有没有哪位也碰到过同样的问题?麻烦指点下... 解决方案 是必现的吗......?

Java Socket通信(一)之客户端程序 发送和接收数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据. 对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容.Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容. 例1:客户端的简略写法(一). Socket clien

代码-本地测试中,客户端可以发送数据,但是服务端接收不到数据,具体如下:

问题描述 本地测试中,客户端可以发送数据,但是服务端接收不到数据,具体如下: vs2008,用C++写了一个服务端和一个客户端,本地测试中,客户端可以发送数据,但是服务端接收不到数据. 现在怀疑很可能是内存分配的问题,但是也怀疑是其他问题. 由于代码有点长就不贴上来了,我想请问一下,造成这种情况的可能原因是什么? 解决方案 想要测出原因就要利用好调试工具:可以在百度里搜索"tcp串口调试助手" 1.判断你写的客户端(命名为C)是否存在问题,"tcp串口调试助手"建立