简单学习了TCP通信,想实现一个本地向服务器上传文件的程序。由于现在还没有服务器,就用本地当服务器自娱自乐一下子。
服务端
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream());
String fileName = br.readLine(); //获取客户端传来的文件名
File dir = new File("packet"); //在服务端创建一个接受客户端文件的文件夹
dir.mkdir();
File file = new File(dir, fileName);
if (file.exists()) { //判断该文件是否存在
ps.println("exist");
socket.close();
return;
}else{
ps.println("no exist");
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); //讲客户端的文件写入服务端的本地
int b;
while ((b = is.read())!=-1)
bos.write(b);
bos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
客户端
public class Client {
public static void main(String[] args) throws IOException {
File file = getFile(); //获取文件
Socket socket = new Socket("127.0.0.1", 8888);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(file.getName()); //把文件名发送给服务端
String result = br.readLine();
if ("exist".equals(result)) { //接受服务端传来的是否存在信息
System.out.println("服务器存在该文件,不要重复上传");
socket.close();
return;
}
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); //将文件写入服务端
int b;
while ((b = bis.read())!=-1)
ps.write(b);
bis.close();
socket.close();
}
private static File getFile() {
Scanner cin = new Scanner(System.in);
System.out.println("请输入一个文件路径:");
while (true) {
String line = cin.nextLine();
File file = new File(line);
if (!file.exists())
System.out.println("文件路径不存在,请重新录入");
else if (file.isDirectory())
System.out.println("录入的是文件夹路径,请输入文件路径");
else
return file;
}
}
}