一个JAVA编写的TCP上传文件程序
编写客户端的代码:
创建将要上传的文件读入客户端内存的流对象
FileInputStream fis = new FileInputStream("D:\\Music1.mp3"); BufferedInputStream bis = new BufferedInputStream(fis);
创建客户端套接字对象(构造方法中传入的是服务端的IP地址和端口号)
Socket cs = new Socket("192.168.1.105",33333);
获取输出流对象(多态形式)
OutputStream os = cs.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
定义缓冲数组(length用于记录从文件冲读取的字节数)
byte[] buffer = new byte[64];
int length = 0;
利用循环读取文件中的字节并发送给服务端
while((length = bis.read(buffer))!=-1) {
bos.write(buffer,0,length);
}
告知服务端传输完毕
cs.shutdownOutput();
接收服务端发来的反馈信息:
InputStream is = cs.getInputStream(); byte[] buffer2 = new byte[64]; int length2 = is.read(buffer2); System.out.println(new String(buffer2,0,length2));
关闭资源:(关闭资源的时候可能会报错:套接字在另一个方向已关闭,将向服务端的输出流关闭的代码去掉即可)
is.close();
bis.close();
cs.close();
//bos.close();
编写服务端的代码:
创建服务端套接字对象(指定监视的端口号):
ServerSocket ss = new ServerSocket(33333);
获取服务端的套接字对象
Socket cs = ss.accept();
获取输入流对象,并利用缓冲流提升效率
InputStream is = cs.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is);
创建输出流对象,指定上传后的文件位置,这里不能写死,所以可以根据当前系统时间命名文件
String filename = Long.toString(System.currentTimeMillis()); filename = filename.substring(filename.length()-12, filename.length()); FileOutputStream fos = new FileOutputStream("d:\\upload\\"+filename); BufferedOutputStream bos = new BufferedOutputStream(fos);
利用循环将来自客户端的字节写入服务端输出流中
int length = 0; while((length = bis.read())!=-1) { bos.write(buffer,0,length); }
传输完毕,服务端提示一下
System.out.println(cs.getInetAddress()+"上传了一个新文件!");
再通知客户端文件上传成功(需要新建一个输出流)
OutputStream os = cs.getOutputStream();
os.write(("文件上传成功,用时"+(time2-time1)/1000.0+"秒").getBytes());
关闭各种资源:
os.close();
bos.close();
bis.close();
cs.close();
ss.close();
运行效果:



浙公网安备 33010602011771号