不久前实现了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();
}
}
}
,现在只是简单的实现了一个文件传输的功能,还未能实现界面以及对客户端间的文件传输,后面的功能会慢慢完善,会把聊天功能整合在一起。