文件传输需要一个服务器和一个客户端,在建立起连接以后对文件进行传输。
首先是服务端
写的时候犯的错误
1.监听的时候忘了给循环,导致文件只能传输一次传输一次文件以后就结束了。
2.得到客户的ip,我只写了getInetAddress(),没有写getHostAddress(),得到的IP会多一条“/”。
3.把while写成了if,导致只会运行一次,文件下载的时候只有1kb。
4.忘了关闭数据流,导致文件传输后损坏了。
public static void main(String[] args) throws IOException {
File file = new File("这里的内容是你要传输的文件的目录及名字");
// 这是首先创建一个服务但是不给端口,在后面再进行设置
// ServerSocket server = new ServerSocket();
// server.bind(new InetSocketAddress(8888));
//占据8888端口创建一个服务 192.168.4.198
ServerSocket server = new ServerSocket(8888);
System.out.println("服务已创建,等待连接...");
//循环监听
while(true){
//开始监听,一旦客户端连接则返回Socket对象
Socket s = server.accept();
System.out.println("客户端已连接!"+s.getInetAddress().getHostAddress());
//获取Socket的输出流
OutputStream os = s.getOutputStream();
FileInputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(os);
byte[] b = new byte[1024];
int len;
while((len = bis.read(b)) != -1) {
bos.write(b,0,len);
}
bis.close();
bos.close();
}
}
}
客户端
犯的错误
1.在写目标文件的时候没有写文件名,导致程序报错,文件夹拒绝访问。(后缀名不能错)
2.ip地址是动态的,一直用前一天的ip导致报错。
3.完了关流和文件,用完要关,用完要关,用完要关!
public class MyClient {
public static void main(String[] args) throws UnknownHostException, IOException {
File file = new File("这里的内容是你要写如的文件路径及文件名");
// 连接到指定ip,指定端口的服务
Socket s = new Socket("192.168.1.110", 8888);
// 获取基于Socket的字节输入流
InputStream is = s.getInputStream();
//创建一个基于目标文件的字节输出流
FileOutputStream fos = new FileOutputStream(file);
//将低级字节流转换为高级缓冲流
BufferedInputStream bis = new BufferedInputStream(is) ;
//向底层输出流写入字节
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] b = new byte[1024];
int len = 0;
//判断文件读完了没有
while((len = bis.read(b) ) != -1) {
//控制最后一次写入时不会写入多余的内容导致文件损坏
bos.write(b,0,len);
}
bos.close();
bis.close();
}
}
写代码遇见错误很正常,但是要学会调试,学会分析问题出在哪里,并把出问题的范围确定下来,找到逻辑的错误在哪,并用小本本记下来,没事就瞅一眼,谨防再次踩坑!!!