怎样才能通过TCP传输协议用Java实现文件的传输?

slowside45 2017-05-24 01:03:49
问题背景:

正在学习Java编程,在学习TCP传输协议的时候遇到了问题。

Receive端有一个名为prepare.txt的空文档,用来接收数据。

Sender端有一个名为data.txt的有内容的文档,用来传输数据。

我希望在本机上完成文件的传输。

Receive端代码:


public class pro1Receiver {
public static void main(String args[]){
try {
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
String pathName = "D:\\prepare.txt"; //空文本,用来接收数据。
File file = createFile(pathName);
InputStream in = s.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
System.out.println("开始接数据...");
byte[] buffer = new byte[1024];
int len = 0;
int dataCounter = 0;
while((len=in.read(buffer))!=-1){
fos.write(buffer, 0, len);
dataCounter+=len;
}
fos.close();
in.close();
s.close();
ss.close();
System.out.println("数据传输完毕,大小为" + dataCounter + "字节");
} catch (IOException e) {
e.printStackTrace();
}
}
public static File createFile(String pathName){
File file = new File(pathName);
if(file.exists()&&file.isFile()){
System.out.println("使用已存在的文件");
}
else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
}



Sender端代码:

public class pro2Sender {
public static void main(String[] args){
String pathName = "D:\\data.txt"; \\有内容的文本,期望将内容传输到 Receive端用来接收数据的文件里
File file = new File(pathName);
byte[] IP = new byte[]{127,0,0,1};
if (!(findFile(pathName))){
return;
}
System.out.println("正在连接到目标主机……");
try{
System.out.println("正在连接到目标主机...");
InetAddress addr = InetAddress.getByAddress(new byte[] { 127, 0, 0,1 });
Socket s = new Socket(addr, 9999);
OutputStream output = s.getOutputStream();
FileInputStream fis = new FileInputStream(sourceFile);
System.out.println("连接成功,正在传输数据...");
byte[] buffer = new byte[1024];
int len = 0;
int dataCounter = 0;
while ((len = fis.read(buffer)) != -1) {
output.write(buffer, 0, len);
dataCounter += len;
}
fis.close();
output.close();
s.close();
System.out.println("数据传送完毕,共传送" + dataCounter + "字节。");
}catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static boolean findFile(String pathName){
File file = new File(pathName);
if(file.isFile())
return true;
else return false;
}
}

错误信息:

先运行Receiver端,然后运行Sender端,console显示传输了0字节的内容

看起来已经成功建立连接,但在文件传输的时候出现了错误,准备好的data.txt中的内容没有传输到prepare.txt中。

望前辈们不吝赐教。
...全文
913 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
slowside45 2017-05-24
  • 打赏
  • 举报
回复
引用 1 楼 bcsflilong 的回复:
output

关闭前  你是不是应该output.flush(); 操作一下呢
没错!加了flush以后就传输成功了。 但是Receive端代码里的CreateFile方法无法被调用了,只能提前创建好txt文件,这是怎么回事呢
爱摸鱼de老邪 2017-05-24
  • 打赏
  • 举报
回复
结果 正在连接到目标主机…… 正在连接到目标主机... 连接成功,正在传输数据... 数据传送完毕,共传送379440字节。
爱摸鱼de老邪 2017-05-24
  • 打赏
  • 举报
回复
发送端

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class pro2Sender {
	public static void main(String[] args) {
		String pathName = "D:\\data.txt";
		File file = new File(pathName);
		byte[] IP = new byte[] { 127, 0, 0, 1 };
		if (!(findFile(pathName))) {
			return;
		}
		System.out.println("正在连接到目标主机……");
		try {
			System.out.println("正在连接到目标主机...");
			InetAddress addr = InetAddress.getByAddress(IP);
			Socket s = new Socket(addr, 9999);
			OutputStream output = s.getOutputStream();
			FileInputStream fis = new FileInputStream(file);
			System.out.println("连接成功,正在传输数据...");
			byte[] buffer = new byte[1024];
			int len = 0;
			int dataCounter = 0;
			while ((len = fis.read(buffer)) != -1) {
				output.write(buffer, 0, len);
				dataCounter += len;
			}
			fis.close();
			output.close();
			s.close();
			System.out.println("数据传送完毕,共传送" + dataCounter + "字节。");
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static boolean findFile(String pathName) {
		File file = new File(pathName);
		if (file.isFile())
			return true;
		else
			return false;
	}
}
接收端

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class pro1Receiver {
	public static void main(String args[]) {
		try {
			ServerSocket ss = new ServerSocket(9999);
			Socket s = ss.accept();
			String pathName = "D:\\prepare.txt"; // 空文本,用来接收数据。
			File file = pro1Receiver.createFile(pathName);
			InputStream in = s.getInputStream();
			FileOutputStream fos = new FileOutputStream(file);
			System.out.println("开始接数据...");
			byte[] buffer = new byte[1024];
			int len = 0;
			int dataCounter = 0;
			while ((len = in.read(buffer)) != -1) {
				fos.write(buffer, 0, len);
				dataCounter += len;
			}
			fos.close();
			in.close();
			s.close();
			ss.close();
			System.out.println("数据传输完毕,大小为" + dataCounter + "字节");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static File createFile(String pathName) {
		File file = new File(pathName);
		if (file.exists() && file.isFile()) {
			System.out.println("使用已存在的文件");
		} else {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;
	}
}
bcsflilong 2017-05-24
  • 打赏
  • 举报
回复
output

关闭前  你是不是应该output.flush(); 操作一下呢
Re:计算机网络  应用层 诸多协议 实验环境搭建  DNS、DHCP、HTTP、FTP、Telnet、RDP、STMP、POP3、IMAP======================# 应用层 诸多协议 域名系统 DNS 动态主机配置协议 DHCP 超级文本传输协议 HTTP 文件传输协议 FTP Telnet 协议和 RDP(远程桌面协议) 发送电子邮件的协议 SMTP  接收电子邮件的协议 POP3 和 IMAP # 什么是域名 整个Internet网站和各种服务器数量众多,各个组织的服务器都需要给一个名称,这就很容易重名。如何确保Internet上的服务器名称在整个Internet唯一呢?这就需要Internet上有域名管理认证机构进行统一管理。如果你的公司在互联网上有一组服务器(邮件服务器、FTP服务器、Web服务器等),你需要为你的公司先申请一个域名,也就是向管理认证机构注册一个域名。 域名的注册遵循先申请先注册为原则,管理认证机构要确保每一个域名的注册都是独一无二、不可重复的。 # 动态主机配置协议 DHCP 静态地址和动态地址应用场景 DHCP 地址租约 DHCP 租约生成过程 DHCP 地址租约更新 # Telnet 协议 Telnet是一个简单的远程终端协议(非加密、且简单),它也是因特网的正式标准。用户使用telnet客户端就可以连接到远程运行Telnet服务的设备(可以是网络设备例如:路由器、交换机,也可以是操作系统,比如Windows或Linux等),进行远程管理。 Telnet能将用户的键盘指令传到远地主机,同时也能将远地主机的输出通过TCP连接返回到用户屏幕。这种服务是透明的,因为用户感觉到好像键盘和显示器是直接连在远地主机上。因此,Telnet又称为终端仿真协议。 Telnet并不复杂,以前应用得很多。现在由于操作系统(Windows和Linux)功能越来越强,用户己较少使用Telnet了。不过配置Linux服务器和网络设备还是需要 Telnet 来实现远程管理和配置 # 远程桌面协议 RDP 现在Windows操作系统很少使用telnet进行远程管理了,更多是使用远程桌面进行远程管理。 Windows系统启用远程桌面,客户端使用远程桌面客户端(mstsc)进行连接。 它们之间使用RDP协议进行通信,RDP协议默认使用TCP的3389端口。 # http 协议、版本和网页 创建网页(准备创建网站、需要设计网页和安装Web服务器) 统一资源定位符URL 绝对路径和相对路径 创建Web站点 HTTP协议版本 HTTP请求报文和响应报文 HTTP响应报文: Cookie 通过代理服务器访问网站 # 文件传输协议 FTP FTP 是File Transfer Protocol(文件传输协议)的英文简称。用于Internet上的控制文件的双向传输。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。 在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和“上传”(Upload)。“下载”文件就是从远程主机拷贝文件至自己的计算机上;“上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。 简单地说,支持FTP协议的服务器就是FTP服务器。 # 安装和配置邮件服务器  模拟整个互联网发送邮件的过程 发送电子邮件的协议 SMTP  接收电子邮件的协议 POP3 和 IMAP--------------------------------------              

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧