先写服务器端,必须先执行服务器端。这个是在本机的,所以IP地址使用的是127.0.0.1。如果服务器不是本机,修改服务器的IP地址即可。
package wangluobiancheng;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* TCP通信两端需要创建socket对象
* 使用TCP通信的知识,编写一个文件上传的程序,完成将本地计算机F盘中的1.jpg文件上传到F盘中名称为upload的文件夹中,
* 要求把客户端的IP地址加上count标识作为上传后的文件名。即IP(count)的形式,其中,count随着重命名文件的增多而增大,如127.0.0.1(1).jpg,127.0.0.1(2).jpg
* 需要一个服务器端接受文件,需要一个客户端上传文件
*/
public class FileServer {
public static void main(String[] args) throws Exception {
// 创建ServerSocket对象,端口号为10001
ServerSocket ssk = new ServerSocket(10001);
while(true) {
// 调用accept()方法接受客户端请求,得到Socket对象
Socket sk = ssk.accept();
// 每当和客户端建立Socket连接后,单独开启一个线程处理和客户端的交互
new Thread(new ServerThread(sk)).start();
}
}
}
/*
* 编写服务器端程序来接受图片,服务器端用ServerSocket对象的accept()方法接受客户端请求,
* 由于一个服务器可能对应多个客户端,所以当客户端与服务器端建立连接后,服务器端需要单独开启一个新的线程来处理和客户端的交互,这时需要在服务器端编写开启新线程的方法
* 在新线程中,需要获得客户端的端口号,并且使用输入输出流来传输图片到指定目录中
*/
class ServerThread implements Runnable{//服务器端开启新线程
private Socket sk2;//持有一个Socket类型的属性
public ServerThread(Socket sk) {//构造方法中把Socket对象作为实参传入
this.sk2 = sk;
}
@Override
public void run() {
// 获取客户端的IP地址
String ip = sk2.getInetAddress().getHostAddress();
int count = 1;//上传图片个数,初始值为1,往后每多上传一个,就加一
try {
InputStream in = sk2.getInputStream();//创建输入流对象in,输入是对程序而言
// 创建上传图片目录的File对象,文件位置本来一个“\”就可以了,但是java为了和转义字符区分开,用\\
File parentFile = new File("F:\\upload\\");
// 如果不存在,就创建这个目录
if(!parentFile.exists()) {
parentFile.mkdir();
}
// 把客户端的IP地址作为上传文件的文件名
File file = new File(parentFile,ip+"("+count+").jpg");
while(file.exists()) {
// 如果文件名存在,则把count++
file = new File(parentFile,ip+"("+count+").jpg");
}
// 创建FileOutputStream对象,文件输出对象,输出是对程序而言
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;//定义一个int类型的变量len,初始值为0
while((len = in.read(buf))!=-1) {//循环读取数据,接收文件读取输入,存入buf,同时读取的个数赋值给len;
fos.write(buf,0,len);//将读取到的内容输出给File指定的文件
}
OutputStream out = sk2.getOutputStream();//获取服务端的输出流,向客户端输出
out.write("上传成功".getBytes());//上传成功后向客户端写出“上传成功”。
fos.close();//关闭输出流对象
sk2.close();//关闭Socket对象
}catch(Exception e) {
throw new RuntimeException(e);
}
}
}
然后再写文件上传的客户端,(即再写一个JAVA文件)
package wangluobiancheng;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class FileClient {
public static void main(String[] args) throws Exception {
// IP地址使用"127.0.0.1"是因为服务器在本机,端口号和服务器提供的一致
Socket s = new Socket("127.0.0.1",10001);//创建客户端Socket
OutputStream out = s.getOutputStream();//获取Socket的输出流对象
// 创建FileInputStream对象,文件的输入流对象,输入输出都是对程序而言的
FileInputStream fis = new FileInputStream("F:\\1.jpg");
byte[] buf = new byte[1024];//定义一个字节数组
int len ;//定义一个int类型的变量len
while((len = fis.read(buf))!=-1) {//循环读取数据
out.write(buf,0,len);//向服务器端输入
}
s.shutdownOutput();//关闭客户端输出流
InputStream in = s.getInputStream();//获取客户端的输入流对象,是服务器端传过来的
byte[] bufMsg = new byte[1024];
int num = in.read(bufMsg);//接受服务端的信息
String Msg = new String(bufMsg,0,num);
System.out.println(Msg);
fis.close();
s.close();
}
}