java socket文件传输

不久前实现了java的多人聊天室,通过多线程实现了多个客户端之间互相收发其他人的消息。

而文件的传输的原理大体上与聊天的原理差不多,通过socket建立客户端与服务器端的连接,客户端可以发送请求,服务器端处理请求。

工作原理大概如下:

客户端:

1.在本地选取要传输的文件

2.通过socket建立与服务器端的连接

3.建立输出流将数据打包

4.将文件写入数据包并传到网络

服务器端:

1.建立新文件等待文件的传输

2.通过socket连接客户端

3.接受网络中的数据包并进行解析

4.将数据写入文件接收完毕

 

之前写了一个文件传输debug的时候没有问题,可是文件从服务器端一直接收不到传来的文件。后来在网上看了一下别人的代码,发现了一个没用过的函数RandomAccessFile(File file, String mode),看了一下jdk,用法是创建从中读取和向其中写入(可选)的随机访问文件流,该文件由File参数指定。也还是没怎么看懂,不过顺手用了一下。代码如下:

客户端:

package 传文件;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import 服务器v1.ChatThread;

public class SocketClient {
	private Socket client;
	
	public static void main(String[] args){
		SocketClient sc= new SocketClient();
		sc.connectSocketServer(9527);
		sc.sendFile("2.jpg");
	}
	
	public void connectSocketServer(int port) {  
		try {   
			ServerSocket server= new ServerSocket(port);
			client= server.accept();
				} catch (Exception e) {   
					e.printStackTrace();  
					} 
		}
	
	//发送文件
	public void sendFile(String str) {  
		byte[] b=new byte[1024]; 
		File f = new File(str);  
		try {   //数据输出流  
			OutputStream dout = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));//文件读入流
			InputStream ins=new FileInputStream(f);
			int n = ins.read(b);
			while (n != -1) {    //向网络中写入数据    
				dout.write(b);   //发送文件内容
				dout.flush();    //再次读取n字节    
				n = ins.read(b);   
				}      //关闭流   
			ins.close();   
			dout.close(); 
			} catch (IOException e) {   
					e.printStackTrace();  
			} 
		}
}

 服务器端:

package 传文件;

import java.net.*;
import java.io.*;
/** * Socketserver从客户端读取文件并保存为本地文件! *  * */
public class Socketserver { 
	private Socket s;
	
	public static void main(String[] args) {  
		Socketserver sk = new Socketserver(); 
		sk.initServer(9527);  
		sk.getFile(); 
		} /**  * 初始化服务器端  * @param port  *         服务器端要使用的端口  */ 
	public void initServer(int port){  
		try {  
			s = new Socket(InetAddress.getLocalHost(),9527); //连接到服务器端
			} catch (IOException e) {   
				e.printStackTrace();  
				} 
		} // 从SocketClient读取文件 
	public void getFile() {  
		byte[] b=new byte[1024];  
		try {   //定义输入流,
			InputStream in = s.getInputStream();   
			DataInputStream din = new DataInputStream(new BufferedInputStream(in));      //创建要保存的文件   
			File f = new File("copy.jpg");   
			RandomAccessFile fw = new RandomAccessFile(f, "rw");      
			int num = din.read(b);   
			while (num != -1) {    //向文件中写入0~num个字节    
				fw.write(b, 0, num);    //跳过num个字节再次写入文件   
				fw.skipBytes(num);    //读取num个字节    
				num = din.read(b);   
				}   //关闭输入,输出流  
			din.close();   
			fw.close();  
			} catch (Exception e) {   
				e.printStackTrace();  
				}
		} 
	}

 
,现在只是简单的实现了一个文件传输的功能,还未能实现界面以及对客户端间的文件传输,后面的功能会慢慢完善,会把聊天功能整合在一起。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值