客户端服务器的高级交互——————————文件传输

今天晚上继续学习网络编程,客户机服务器的高级交互——————文件传输。

再一次强化了网络交互协议的概念。

下图是文件传输流和客户机服务器交互的具体流执行程序:


用文件传输流把文件传送到客户端程序,然后服务器用socket.getInputStream来接收客户端的数据流,然后再用FileOutputStream把文件从服务器程序输出到本地。

今天我只实现了客户端服务器的文件传输,以后再弄客户端到客户端的文件传输。

下面是我的代码:服务器程序的

package control;

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

public class MyServer {
	public static void main(String[] args) {
		MyServer ms = new MyServer();
		ms.initMyServer();
	}
	public void initMyServer(){
		try {
			ServerSocket ss = new ServerSocket(9090);
			Socket socket = ss.accept();
			System.out.println("连接客户端成功...");
			InputStream ins = socket.getInputStream();
			FileOutputStream fos = new FileOutputStream("C:\\Users\\asus\\Desktop\\new.exe");
			DataInputStream dis = new DataInputStream(ins);
			long count = dis.readLong();
			int last = dis.readInt();
			byte[] bytes = new byte[2048];
			while( count > 0 ){
				dis.readFully(bytes);
				fos.write(bytes);
				fos.flush();
				count -- ;
			}
			if( last > 0 ){
				bytes = new byte[last];
				dis.readFully(bytes);
				fos.write(bytes);
				fos.flush();
			}
			fos.close();
			dis.close();
			System.out.println("接收数据完成");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
下面这个是客户端程序的
package control;

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

public class MyClient {
	public static void main(String[] args) {
		MyClient mc = new MyClient();
		mc.initMyClient();
	}
	public void initMyClient(){
		try {
			Socket socket = new Socket("localhost",9090);
			System.out.println("连接服务器成功...");
			OutputStream ous = socket.getOutputStream();//获取输出流
			File file = new File("C:\\Users\\asus\\Desktop\\test.exe");//定义被复制文件的路径
			FileInputStream fis = new FileInputStream(file);//声明一个输入流
			DataOutputStream dos = new DataOutputStream(ous);//包装输出流
			long length = file.length()/2048;//获取文件长度
			int last = (int)length%2048;//最后的字节
			byte[] bytes = new byte[2048];
			dos.writeLong(length);
			dos.writeInt(last);
			dos.flush();
			int value = fis.read(bytes);
			while( length > 0 ){
				dos.write(bytes);
				dos.flush();
				value = fis.read(bytes);
				length--;
			}
			if( last > 0 ){
				bytes = new byte[last];
				fis.read(bytes);
				dos.write(bytes);
				dos.flush();
			}
			dos.close();
			fis.close();
			System.out.println("发送完毕,断开连接");
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}
测试的结果



复制了一个整蛊邻居游戏的安装包。

客户端服务器的高级交互——————————文件传输_第1张图片有两百兆的大小

但是我的程序因为优化过,所以传输的速度还是比较快的。

今天在华信学习的大概就这么多了。

你可能感兴趣的:(网络编程,文件传输)