本文描述java如何创建网络服务器,并且发送文件给客户端接收。
一、服务端
package serverSocket;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyService {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ServerSocket ser = new ServerSocket(12345);
Socket sc = ser.accept();
System.out.println("连接客户端"+sc.getInetAddress());
//从sc中获取流,网络IO流
InputStream in = sc.getInputStream();
OutputStream out = sc.getOutputStream();
//为了简化操作,创建过滤流
ObjectOutputStream oos = new ObjectOutputStream(out);
ObjectInputStream ois = new ObjectInputStream(in);
File src = new File("E:\\Users\\Long\\Downloads\\JavaDemo\\Upload\\退伍军人就业平台建设方案.docx");
//发送文件名
oos.writeObject(src.getName());
System.out.println("向客户端发送文件名:"+src.getName());
oos.flush();
//接收客户端已有文件大小
long overSize = ois.readLong();
System.out.println("接收客户端文件大小:"+overSize);
if (overSize==src.length()) {
oos.writeObject("bu");
oos.flush();
System.out.println("告诉客户端不发送:");
}else {
oos.writeObject("xc");
oos.flush();
System.out.println("向客户端发送文件名");
//文件输入流,把文件读取到java中
InputStream fileStream = new FileInputStream(src);
byte[] bs= new byte[1024*128];//创建1K大小的缓冲区
fileStream.skip(overSize);
for (int len = 0; (len=fileStream.read(bs))!=-1;) {
out.write(bs);//写入网络
}
System.out.println("文件发送完成!!!");
fileStream.close();
}
sc.close();
ser.close();
}
}
二、客户端
package clientSocket;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class FileClient {
public static void main(String[] args) throws Exception {
Socket sc = new Socket("192.168.2.10",12345);
System.out.println("成功连接到服务器");
//从sc中获取流,网络IO流
InputStream in = sc.getInputStream();
OutputStream out = sc.getOutputStream();
//为了简化操作,创建过滤流
ObjectInputStream ois = new ObjectInputStream(in);
ObjectOutputStream oos =new ObjectOutputStream(out);
//接收文件名
String fileName = (String) ois.readObject();
System.out.println("接收文件名:"+fileName);
File xin = new File("E:\\Users\\Long\\Downloads\\JavaDemo\\DownLoad",fileName);
//告诉服务器文件大小,服务器进行比较
oos.writeLong(xin.length());
oos.flush();
System.out.println("发送已有文件大小给服务端");
//接收服务器响应,xc代表续传,xin重头传,bu不传
String order = (String)ois.readObject();
System.out.println("读取服务端信息:"+order);
if("xc".equals(order)) {//断点续传
OutputStream fileOut = new FileOutputStream(xin,true);
System.out.println("开始接收文件:"+xin.getAbsolutePath());
int n=0;
byte[] bs = new byte[1024*128];
for (int len = 0; (len = in.read(bs))!=-1; n++) {
fileOut.write(bs,0,len);//从网络读取,写入到文件
}
System.out.println("文件接收完成!!!次数="+n);
fileOut.close();
}else if ("bu".equals(order)) {
System.out.println("文件妥妥的,无需下载");
}
}
}
三、以上代码使用流程:
1、 创建项目Project,分别为服务端和客户端.
2、将代码中的IP地址更改为自己的IP地址或者相应的IP地址。
3、更改文件路径为实际的文件路径
4、先运行服务端,再运行客户端,即可实现接收文件。
5、如果传送中途中断,从新运行,可以直接再原来基础上传输。
四、可能会遇到的问题
多次点击运行同一个程序,可能会报此错:
Exception in thread "main" java.net.ConnectException: Connection refused: connect
解决办法详见此文:
https://blog.csdn.net/qq331059279/article/details/90347906
五、正常运行的结果
服务端输出:
客户端输出:
如果客户端已经接收过文件,则客户端输出(n=0):