一、简介
本文讲述了Java IO流 多线程 网络编程的基础操作;同时附上如何将客户端的图片上传至本地服务器的代码。
二、知识点
1、IO流的读写操作
①将文件内容转换为字节输出流
InputStream is = new FileInputStream(file);
②将输入流中的内容读写到数组中
int len=0;
byte[] bytes = new byte[1024];
while(len != -1){
int len = is.read(bytes);
}
③创建字节输出流 并将数组内容写入字节输出流中
OutputStream os = new FileOutputStream(file);
os.write(bytes);
2、多线程操作
①创建子线程(通过实现Runnable接口)
new Thread(new Runnable() {
@Override
public void run() {
//线程中需要执行的程序
}
}.start()
3、网络编程
①创建客户端(需要指定服务器网址,端口号) 和服务端(指定端口号)
//客户端
Socket socket = new Socket("127.0.0.1",8888);
//服务端
ServerSocket server = new ServerSocket(8888);
②客户端与服务端的交互
客户端
//客户端创建网络字节输出流至服务端,并写入数据
OutputStream gos = socket.getOutputStream();
gos.write("你好,服务器。".getBytes())
//客户端接收来自服务端的网络字节输入流,并读取数据
InputStream gis = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(gis));
System.out.println("服务器发来消息:"+ br.readLine() );
服务端
//服务端接收来自客户端的网络字节输入流,并读取数据
InputStream gis = socket.getInputStream();
int len=0;
byte[] bytes = new byte[1024];
while(len != -1){
len = gis.read(bytes);
}
//服务器创建网络字节输出流至客户端,并写入数据
OutputStream gos =socket.getOutputStream();
gos.write("上传成功".getBytes());
三、代码
以下代码作用:
将客户端上D;\Desktop\QQ截图20200816154043.png 图片上传至本机服务器。
3.1 客户端
package TCP;
import java.io.*;
import java.net.Socket;
/**
* @Author: E.M.C.P
* @Description:
* @Date Created in 2020-08-16 14:25
* @Modifled By:
**/
public class User {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8888);
//向服务端发送信息
OutputStream gos = socket.getOutputStream();
InputStream is = new FileInputStream("D:\\Desktop\\QQ截图20200816154043.png");
int len=0;
byte[] bytes = new byte[1024];
while((len=is.read(bytes)) != -1){
gos.write(bytes);
}
//为防止阻塞
socket.shutdownOutput();
//接收服务器的信息
InputStream gis = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(gis));
System.out.println("服务器发来消息:"+ br.readLine() );
}
}
3.2 服务端
package TCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/**
* @Author: E.M.C.P
* @Description:
* @Date Created in 2020-08-16 14:25
* @Modifled By:
**/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
//使用count 计算连接上服务器的客户端数量
while(true){
new Thread(new Runnable() {
@Override
public void run() {
try {
Object o =new Object();
synchronized (o){
Socket socket = server.accept();
System.out.println("一台客户端连接上服务器");
//接收客户端发来的文件
InputStream gis = socket.getInputStream();
int len=0;
byte[] bytes = new byte[1024];
//判断文件夹是否存在,如果不存在,创建文件夹
File file = new File("D:\\load");
if( !file.exists() ){
file.mkdir();
}
String filename = System.currentTimeMillis()+new Random().nextInt(999999)+".png";
OutputStream os = new FileOutputStream(file+"\\"+filename);
while((len=gis.read(bytes)) != -1){
os.write(bytes);
}
socket.shutdownInput();
//向客户端发送消息,告知已经连上服务器。
OutputStream gos =socket.getOutputStream();
gos.write("上传成功".getBytes());
os.close();
gos.close();
gis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start()
}
}
}
3.3 实现结果图
服务器
客户端
最后附上一句鸡汤:
没有一蹴而就的辉煌,只有默不作声的努力。