客户端代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCP_Client_Demo4 {
public static void main(String[] args) throws IOException {
method_1();
}
private static void method_1() throws IOException {
/*方法说明:(用字节流传输文本不会出现乱码问题)
*上传图片——客户端,对应的服务端分单线程和多线程版
*/
//1,创建客户端socket。
Socket s = new Socket("127.0.0.1",10006);
//2,确定源(图片),用file字节流关联要上传的图片文件。
FileInputStream fis = new FileInputStream("c:\\Bliss.jpg");
//3,确定目的字节流(socket输出流),将读到图片数据发送给服务端。
OutputStream out = s.getOutputStream();
//4,一顿狂写
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
out.write(buf,0,len);
}
//5,告诉服务端文件传完了!可以让服务端结束while循环了!
s.shutdownOutput();
//6,使用Socket输入流读取服务端反馈信息。字节流+new String
InputStream in = s.getInputStream();
byte[] bufIn = new byte[1024];
int lenIn = in.read(bufIn);
String text = new String(bufIn,0,lenIn);
System.out.println(text);
fis.close();
s.close();
}
}
(单线程版)服务端代码:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Server_Demo4 {
public static void main(String[] args) throws IOException {
/*方法说明:(用字节流传输文本不会出现乱码问题)
*上传图片——服务端,单线程版!
*/
method_1();
}
private static void method_1() throws IOException {
ServerSocket ss = new ServerSocket(10006);
Socket s=ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ".....connected");
// 确定源字节流(Socket输入流),读取客户端发来的数据。
InputStream in = s.getInputStream();
//确定目的,用字节流关联
FileOutputStream fos = new FileOutputStream("c:\\1.txt");
//一顿狂写
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
//被告知文件上传完了之后,反馈信息给客户端
// 获取socket输出流,将上传成功字样发给客户端。write+getBytes()
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}
}
(多线程版)服务端代码:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Server_Demo4_2 {
public static void main(String[] args) throws IOException {
/*方法说明:(用字节流传输文本不会出现乱码问题)
*上传图片——服务端,多线程版!服务端不用关闭
*/
//创建tcp的socket服务端。
ServerSocket ss = new ServerSocket(10006);
while(true){
Socket s = ss.accept();//阻塞式方法,针对while
new Thread(new TCP_Demo4_Task(s)).start();
}
}
}
(多线程版)任务代码:
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCP_Demo4_Task implements Runnable {
private static final int SIZE = 1024*1024*3;//限定图片大小3M
private Socket s;
public TCP_Demo4_Task(Socket s) {
super();
this.s = s;
}
public void run() {
/*方法说明:
*限定图片大小3M,存放C盘pic文件夹
*如果图片已经存在,图片名称自动进行重命名存储!
*/
int count = 0;//图片重名时候用~
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ".....connected");
try {
// 确定源字节流(Socket输入流),读取客户端发来的数据。
InputStream in = s.getInputStream();
// 将读取到数据存储到一个文件中。
File dir = new File("c:\\pic");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, ip + ".jpg");
//如果文件已经存在于服务端
while(file.exists()){
file = new File(dir,ip+"("+(++count)+").jpg");
//比如:127.0.0.1(2).jpg
}
//确定目的,用字节流关联
FileOutputStream fos = new FileOutputStream(file);
//一顿狂写
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
if(file.length()>SIZE){
System.out.println(ip+"文件体积过大");
fos.close();
s.close();
System.out.println(ip+"...."+file.delete());
return ;
}
}
//被告知文件上传完了之后,反馈信息给客户端
// 获取socket输出流,将上传成功字样发给客户端。write+getBytes()
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();//关闭该客户端
} catch (Exception e) { }
}
}