Java使用Socket传输文件遇到的问题(转)

1.写了一个socket传输文件的程序,发现传输过去文件有问题。找了一下午终于似乎找到了原因,记录下来警示一下:

接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题。

个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误。

//--------------------------------------------------------------------------------------------------------------------

12-29:最近看了本书<<Java Tcp/IP Socket 编程>>,似乎了解了如题这个问题的原因:

不能假设在连接的一端将数据写入输出流和在另一端从输入流读入的数据间有任何的一致性。虽然发送端都是1024bytes为单位发送的,但是由于网速问题接收端不一定是按照1024bytes为单位接受的,可能小于1024。所以buf[0]=5这种手段是行不通的,接受方收到的buff的第一个字符可不一定是5。

注:若以1024bytes为发送和接受缓冲区的话。

//---------------------------------------------------------------------------------------------------------------------

12-29晚:我彻底知道了原因。就是网络传输的问题,发送端以1024byte为单位发送,接收端以1024byte为单位接受。但是由于网络传输速度的限制,发送端发送出去的1024byte不能同时到达接收端,而接收端使用read独到的可能少于1024byte。下次从上次读到的下一个位置继续读,所以以1024byte数组的开头设为标识位的做法是行不通的,是错误的。解决办法是在接收端每次read之前,Thread.sleep(mileseconds);一会。这样就有足够的时间等待发送端发送的数据完全到达接受端后再接受,这样的话buff[0]的值就可以最为标示位了。

但是还是不提倡这种设置buff[0]为表示位的做法。好的做法是,接收端收到发送文件的请求收,接受文件,不考虑标识,就没有标识位,发送端发送完文件后调用close(),以发送结束标识,接收端会通过read()收到-1。接收端关闭接受流。则,文件传输过程结束。

http://www.cnblogs.com/wangjiyuan/p/3493186.html

时间: 2024-08-29 01:51:31

Java使用Socket传输文件遇到的问题(转)的相关文章

java下socket传文件

package cn.stat.p4.ipdemo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.ne

Python Socket传输文件

发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一: #-*- coding: UTF-8 -*- import socket,time,SocketServer,struct,os,thread host='192.168.50.74' port=12307 s=socket.socket(socket.AF_INET,socket.SOCK_S

Linux C++ TCP Socket传输文件或图片实例

环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服务器端建立连接.连接建立成功后,读取文件内容(/root/workspace/socket-picture/bizhi.jpg),发送给服务器端,服务器端新建new1.jpg文件,将接收到的文件内容保存到new1.jpg中,new1.jpg在当前目录下: Server.cpp 1 #include<

Java 运用流传输文件

实例1 package IO; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.Writer; /** * 案例:利用字符流实现字符文件的拷贝1.txt -> 3.txt * 1.字符文件的读取:FileReader * 2.字符文件的写入:FileWriter * 3.循环上面的过程 */ public class FileCopyDemo1 { public

Visual C++网络编程经典案例详解 第8章 网络文件传输 使用Socket传输文件 服务器代码 程序初始化

控件初始化状态使部分控件处于禁用状态代码禁用控件 BOOL CMyDlg::OnInitDialog(){ CDialog::OnInitDialog(http://www.amjmh.com); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDC_ABOUTBOX < 0xF000); CMenun* pSysMenu = GetSystemMenu(FALSE); ... //省略部分代码 SetIcon(m_hIcon

Java学习笔记——Socket实现文件传输

我越是逃离,却越是靠近你. 我越是背过脸,却越是看见你. 我从你开始, 我在你结束. 需求:实现局域网下socket传输文件. 客户端步骤: 1.建立与服务器的连接 2.创建client输出流 3.创建输入流,绑定本地文件 4.读取文件后输出给服务器 服务器端步骤: 1.启动服务器 2.创建accept输入流 3.创建输出流绑定本地文件 4.读取客户端信息写入本地文件 1.字节流传输文件. 1 public class Client { 2 3 public static void main(S

java socket通信-传输文件图片--传输图片

ClientTcpSend.java   客户端发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.InetSocketAddress; import java.net.Socket; public class ClientTcpSend { public static String clien

Java基于Socket文件传输示例(转)

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream;

Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package localSocket; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStrea