客户端代码
package cn.hiluna.demo4;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 实现tcp图片上传客户端
* 实现步骤:
* 1.Socket套接字连接服务器
* 2.通过Socket获取字节输出流,写图片
* 3.使用自己的流对象,读取图片数据源
* FileInputStream
* 4.读取图片。使用字节输出流,将图片写到服务器
* 采用字节数组进行缓冲
* 5.通过Socket套接字获取字节输入流
* 读取服务器发回来的上传成功
* 6.关闭资源
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost",8000);
//获取字节输出流,图片写到服务器
OutputStream outputStream = socket.getOutputStream();
//创建字节输入流,读取本机上的数据源图片
FileInputStream fileInputStream = new FileInputStream("C:\Users\zhang\Pictures\Saved Pictures\t.jpg");
//开始读写字节数组
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
}
//给服务器写终止序列,告诉服务器没数据了
socket.shutdownOutput();
//获取字节输入流,读取服务器的上传成功
InputStream inputStream = socket.getInputStream();
len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
fileInputStream.close();
socket.close();
}
}
服务器端代码
package cn.hiluna.demo4;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/**
* TCP图片上传服务器
* 1.ServerSocket套接字对象,监听端口7000
* 2.方法accept()获取客户端连接对象
* 3.客户端连接对象获取字节输入流,读取客户端发送的图片
* 4.创建File对象,绑定上传文件夹
* 判断文件夹存在,不存在,在创建文件夹
* 5.创建字节输出流,数据目的,File对象所在的文件夹
* 6.字节流读取图片,字节流将图片写入到目的文件夹中
* 7.将上传成功回写客户端
* 8.关闭资源
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7000);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
File file = new File("E:\uploads");
if (!file.exists()){
file.mkdirs();
}
//防止文件同名被覆盖,从新定义文件名
//规则:域名+毫秒值+6位随机数
String filename = "hiluna"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
//创建字节输出流
FileOutputStream fileOutputStream = new FileOutputStream(file+File.separator+filename);
//读写字节数组
byte[] bytes = new byte[1024];
int len = 0;
while ((len = inputStream.read(bytes)) !=-1){
fileOutputStream.write(bytes,0,len);
}
//通过客户端连接对象获取字节输出流
//上传成功客户端
socket.getOutputStream().write("上传成功".getBytes());
fileOutputStream.close();
socket.close();
serverSocket.close();
}
}
多线程上传图片
创建一个线程接口实现类:
package cn.hiluna.demo4;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Random;
public class Upload implements Runnable{
private Socket socket;
public Upload(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
File file = new File("E:\uploads");
if (!file.exists()) {
file.mkdirs();
}
//防止文件同名被覆盖,从新定义文件名
//规则:域名+毫秒值+6位随机数
String filename = "hiluna" + System.currentTimeMillis() + new Random().nextInt(999999) + ".jpg";
//创建字节输出流
FileOutputStream fileOutputStream = new FileOutputStream(file + File.separator + filename);
//读写字节数组
byte[] bytes = new byte[1024];
int len = 0;
while ((len = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
//通过客户端连接对象获取字节输出流
//上传成功客户端
socket.getOutputStream().write("上传成功".getBytes());
fileOutputStream.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
修改服务端程序修改服务端程序
package cn.hiluna.demo4;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPThreadServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
while (true){
Socket socket = serverSocket.accept();
new Thread( new Upload(socket)).start();
}
}
}