1.客户端引入库
代码如下(示例):
package TCP_and_UDP;
import java.io.*;
import java.net.Socket;
2.客户端代码
代码如下(示例):
public class Client {
private static final int SIZE = 1024*1024;
public static void main(String[] args) throws IOException {
in();
}
public static void in() throws IOException {
//创建缓冲区存储从键盘录入的信息,主要是一整行一整行地读
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//获取文件路径
System.out.println("请输入文件所在的目录以及文件名称,以回车键结束(例如:G:\\IdeaProjects\\untitled\\一路向北.mp3)");
String dir = bufr.readLine();
//获取文件类型
System.out.println("请输入上传的文件类型,以回车键结束(例如:.mp3)");
String name = bufr.readLine();
//获取IP地址
System.out.println("请输入你要上传的IP地址,以回车键结束");
String ip = bufr.readLine();
//关闭资源
bufr.close();
//调用运行客户端所在的方法,并将文件路径,文件类型和IP地址作为参数传入
free(dir,ip,name);
}
public static void free(String dir,String ip,String name) throws IOException {
//创建Socket对象,这是必须要做的,因为客户端和服务端就是靠这个连接,10005为端口号
//不建议使用1024以内的端口号
Socket s = new Socket(ip,10005);
//读取客户端要上传的文件
FileInputStream bufi = new FileInputStream(dir);
//将读到的文件数据发送给服务端
PrintStream out = new PrintStream(s.getOutputStream(),true);
//将文件类型告诉服务器,以便于生成对应类型的文件
PrintWriter out1 = new PrintWriter(s.getOutputStream(),true);
out1.println(name);
//创建数组存储读到的文件的字节信息
byte[] buf = new byte[SIZE];
int len = 0;
while((len = bufi.read(buf))!=-1)
{
//将读到的数据传给服务器端
out.write(buf,0,len);
}
//告知服务端数据发送完毕,让服务端停止读取,否则服务端将一直等待读取
s.shutdownOutput();
//读取服务端发回来的应答消息,这里用缓冲区是不想创建一个数组了
BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
//这里没有加while语句是因为已经知道应答消息只有:上传成功,所以不需要,但为了严谨,根据需求添加
String str = bufr.readLine();
//输出从服务端获取的应答消息
System.out.println(str);
//关流,关闭资源,PrintStream和PrintWriter会随着Socket的关闭而关闭
s.close();
bufi.close();
bufr.close();
}
3.服务端引入库
package TCP_and_UDP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
4.服务端代码
public class Server {
private static final int SIZE = 1024*1024;
public static void main(String[] args) throws IOException {
free();
}
public static void free() throws IOException {
//创建服务器端ServerSocket对象,客户端和服务器端的端口必须一致才能进行连接
ServerSocket ss = new ServerSocket(10005);
//获取连接进来的客户端Socket对象......这里可能说得不对
Socket s = ss.accept();
//打印连接进来的客户端的IP,并且打印是否连接成功
System.out.println(s.getInetAddress().getHostAddress()+".......连接成功");
//从流中读取客户端发来的数据
InputStream in = s.getInputStream();
//这个是从流中获取文件的类型,因为是用字符流传过来的是字符串,所以用字符流
BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
String name = bufr.readLine();
//创建文件
FileOutputStream fos = new FileOutputStream("server"+name);
byte[] buf = new byte[SIZE];
int len = 0;
while((len = in.read(buf))!=-1)
{
//将数据写入文件
fos.write(buf,0,len);
fos.flush();
}
//创建PrintWriter对象,告诉客户端文件上传成功
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
out.println("上传成功");
//关闭资源
s.close();
ss.close();
fos.close();
}
总结
以上就是全部内容,本文仅仅粗略地实现了客户端向服务端上传文件,
每次只能上传一个文件,如果需要同时上传多个文件,就需要运用到多线程任务来实现,可能有些地方的解释不对,以及有一些地方浪费了资源,也就是有更好的方式,还希望路过的大佬能够指出,谢谢大佬!!!!