当前位置:  技术问答>java相关

用Socket传输文件的问题 (很多分,想要吗?)

    来源: 互联网  发布时间:2015-11-03

    本文导语:  //Server.java package test; import java.net.*; import java.io.*; import java.util.zip.*; import java.util.*; public class Server {   static int PORT = 9999;   public static void main(String[] args) throws IOException {     //Server server1 = new Ser...

//Server.java

package test;

import java.net.*;
import java.io.*;
import java.util.zip.*;
import java.util.*;

public class Server {

  static int PORT = 9999;

  public static void main(String[] args) throws IOException {
    //Server server1 = new Server();

    if(args.length != 1){
      System.out.println("Usage:java Server file.name");
      System.exit(1);

    }

    File inFile = new File(args[0]);
    if(inFile.canRead() != true){
      System.out.println("Can't read File:" + args[0]);
      System.exit(1);
    }
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(inFile));

    ServerSocket server = new ServerSocket(Server.PORT);
    System.out.println("Waiting connection ...");
    Socket socket = server.accept();
    System.out.println("Socket connected in");

    BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(socket.getOutputStream()),4096);

    System.out.println("Writing ...");
    System.out.println(new Date());
    byte[] c = new byte[4096];
    while ((in.read(c)) != -1) {
      out.write(c);
    }
    System.out.println("Writing done!");
    System.out.println(new Date());
    in.close();
    out.close();
    socket.close();
    System.out.println("Socket closed.");

  }

}

//Client.java

package test;

import java.net.*;
import java.io.*;
import java.util.zip.*;
import java.util.*;

public class Client {

  public static void main(String[] args) throws IOException{
    //Client client1 = new Client();

    if(args.length != 1){
      System.out.println("Usage:java Client hostName");
      System.exit(1);
    }

    File outFile = new File("out");
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outFile));

    Socket client = new Socket(args[0], Server.PORT);
    System.out.println("Connect ...");
    System.out.println(new Date());

    BufferedInputStream in = new BufferedInputStream(new GZIPInputStream(client.getInputStream()),4096);
    System.out.println("Reading ...");

    byte[] c = new byte[4096];
    while ((in.read(c)) != -1) {
      out.write(c);
    }
    System.out.println("Reading down.");
    System.out.println(new Date());
    in.close();
    out.close();
    client.close();
    System.out.println("Closed.");
  }

}

//---------------------------------------------------------------
传163M的文件用了204秒,文件没错误,可以使用

传1k的就坏了,文件变大了,知道原因,但不知道怎么解决

|
对不起,错了:(
给你提供一个思路
    byte[] c = new byte[4096];
    while ((in.read(c)) != -1) {
      out.write(c);
    }
==〉
    byte[] c = new byte[4096];
    int count = in.read(c);
    while (count != -1) {
      out.write(c, 0,count);
    }
也就是判断一下到底读了多少字节
读的时候也一样

|
有这么麻烦?

byte[] buf = new byte[1024];
int len;
while((len=in.read(buf)) != -1){
out.write(buf,0,len);
}

|
错误就出再这里,
byte[] c = new byte[4096];
    while ((in.read(c)) != -1) {
      out.write(c);
    }
 
当所传的数据不到4K时程序也传了4K,不足的部分程序补上了空值,应该在这里加上所传数据的大小,按实际大小传送。
用int count=c.length()查出数据的大小,再用out.write(c,ount);

|
import java.net.*;
import java.io.*;
import java.util.zip.*;
import java.util.*;

public class Server {

  static int PORT = 9999;

  public static void main(String[] args) throws IOException {
      String filename = "Client.java";
  if(args.length >= 1){
      filename=args[0];
    }
    File inFile = new File(filename);
    if(inFile.canRead() != true){
      System.out.println("Can't read File:" + filename);
      System.exit(1);
    }
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(inFile));
    ServerSocket server = new ServerSocket(Server.PORT);
    System.out.println("Waiting connection ...");
    Socket socket = server.accept();
    System.out.println("Socket connected in");
    BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(socket.getOutputStream()),4096);

    System.out.println("Writing ...");
    System.out.println(new Date());
    byte[] c = new byte[4096];
int count=1;
    while (count>0) {
count=in.read(c);
if(count>0)
      out.write(c,0,count);
  else
  System.out.println("stop here,invalid read count:"+count);
    }
    System.out.println("Writing done!");
    System.out.println(new Date());
    in.close();
    out.close();
    socket.close();
    System.out.println("Socket closed.");

  }

}

import java.net.*;
import java.io.*;
import java.util.zip.*;
import java.util.*;

public class Client {

  public static void main(String[] args) throws IOException
  {
   String hostname;
    if(args.length == 1)
    {
      hostname=args[0];
    }
    else
    {
hostname = InetAddress.getLocalHost().getHostName();
}
    File outFile = new File("out");
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outFile));

    Socket client = new Socket(hostname, Server.PORT);
    System.out.println("Connect ...");
    System.out.println(new Date());

    BufferedInputStream in = new BufferedInputStream(new GZIPInputStream(client.getInputStream()),4096);
    System.out.println("Reading ...");

    byte[] c = new byte[4096];
int readnum=1;
    while (readnum>0)
{
readnum=in.read(c);
if(readnum>0)
        out.write(c,0,readnum);
        else

  System.out.println("stop here,invalid read count:"+readnum);

    }
    System.out.println("Reading down.");
    System.out.println(new Date());
    in.close();
    out.close();
    client.close();
    System.out.println("Closed.");
  }

}

|
我建议传文件前先传文件长度,再传文件内容。

前面我还没写完就错点了提交按钮,sorry!
下面是我写的代码,希望对你有用。呵呵

    int length = in.readInt();
    int count = 0;
    byte[] c = new byte[4096];
    
    while (true) {
        int len = in.read(c);
        if(len != -1) {   
            count += len;        
            if(count 

    
 
 

您可能感兴趣的文章:

  • socket实现多文件并发传输,求助多线程实现问题?
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • linux无线网络传输也可以直接使用socket接口编程吗?
  • 如何用socket一次传输多个文件,如何确定文件一个文件结束
  • linux 下如何图片如何通过socket传输?
  • JB5 Socket传输的汉字如何正常显示???
  • socket传输二进制文件输出是不是要用DataOutputStream?
  • socket(套接字)怎么传输二进制数据?急
  • socket传输
  • (在下等)如何解决socket 传输的丢包问题
  • linux下tcp协议的socket可靠传输
  • 对于socket UDP传输,一个端口只能被一个进程绑定?
  • socket 实现图片传输?
  • socket传输int型数字的问题
  • 用ARMV41-UNKNOWN_LINUX-GCC编译出的Socket程序传输结构体出问题,请大家帮忙分析一下
  • 各位高手,怎么在J2ME中进行socket传输呀?请帮忙给个提示。
  • Socket传输中文字符处理!!高分求救
  • 难道还有第3条分支???怎么判断 socket 的数据已经传输
  • 如何通过Socket传输对象?
  • 帮我看下UNIX下用SOCKET实现文件传输哪出错了
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于文件操作和Socket网络编程!
  • Linux下怎么用socket接收zip文件流?怎么把zip文件读成流?
  • liunx下面包含socket头文件了,close时提示尚未声明???
  • 初来者,试问winsock改造成gcc socket需要什么头文件?
  • socket程序中,查看error需要什么头文件?
  • socket传送文件 客户端收到的文件和服务器端发送的不一样?
  • [高分相送200] 谁有linux下socket编写的发送文件源代码?(解决另开贴)
  • 内核源文件/net/socket.c中调用其他模块的函数,该如何实现
  • socket编程为什么.cpp文件编辑通不过
  • 请教linux下c用下载FTP站点中文件的socket程序思路
  • 请问一下,有谁知道linux源代码中socket(int domain, int type, int protocol);函数的定义是在哪个文件中啊?小弟我找了很久,都没找到,谢谢哈。
  • hpunix gcc 包含socket.h 文件报错
  • 如何利用socket传文件(不同格式的)?高分求救!!---在线等待
  • 一个简单的SOCKET服务端程序,生成执行文件的出错!
  • 包含了头文件sys/socket.h等,编译链接的时候却报错,是什么问题呢
  • gcc编译socket小程序成功,但生成的文件却无法执行
  • socket传送文件问题
  • 高分求救:SOL_SOCKET,SO_RCVTIMO,SO_SNDTIMEO,IPPOTO_TCP,TCP_NODELAY这些是在哪个头文件定义的呢?
  • php与flash as3 socket通信传送文件实现代码
  • close掉socket后,在accept了1024次后,出现打开文件最大限制1024的问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3