基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码
客戶端
import java.io.*; import java.net.Socket;/*** ### 作業3:* 完成文件上傳案例學習* - 案例需求* 客戶端:數據來自于本地文件,接收服務器反饋* 服務器:接收到的數據寫入本地文件,給出反饋* - 案例分析* - 創建客戶端對象,創建輸入流對象指向文件,每讀一次數據就給服務器輸出一次數據,輸出結束后使用shutdownOutput()方法告知服務端傳輸結束* - 創建服務器對象,創建輸出流對象指向文件,每接受一次數據就使用輸出流輸出到文件中,傳輸結束后。使用輸出流給客戶端反饋信息* - 客戶端接受服務端的回饋信息*/ public class TcpSocket {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1", 10086);BufferedInputStream buffInput = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\Demo小案例\\共享文件夾\\IEDA背景圖片\\img\\1.png"));BufferedOutputStream buffOut = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int length;while ((length = buffInput.read(bytes)) != -1) {buffOut.write(bytes, 0, length);buffOut.flush();}buffInput.close();socket.shutdownOutput();//讀取反饋BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();socket.close();} }服務端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
-
@author silence
while (true) {//獲得與客戶端的連接對象Socket accept = socket.accept();//將連接對象交給線程處理thread.submit(() -> {ioFile(accept);});}
*/
public class TcpServerSocket {
public static void main(String[] args) throws IOException {
//監聽端口
ServerSocket socket = new ServerSocket(10086);
//創建線程池
ThreadPoolExecutor thread = new ThreadPoolExecutor(
5,
10,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(5),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);}
/**
- @param accept 與客戶端的連接對象
*/
private static void success(Socket accept) {
//字符輸出
BufferedWriter writer = null;
try {
//通過于客戶端的連接,獲得網絡連接對象,獲得字節輸出流
OutputStream out = accept.getOutputStream();
//通過轉換流,轉換到字符輸出流
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(“服務器接收文件成功”);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
- 讀取客戶端的文件信息,寫到本地
- @param accept 與客戶端的連接對象
*/
private static void ioFile(Socket accept) {
//字節輸入流
BufferedInputStream input = null;
//字節輸出流
BufferedOutputStream out = null;
try {
//字節輸入流
input = new BufferedInputStream(accept.getInputStream());
//字節輸出流
out = new BufferedOutputStream(new FileOutputStream(“operate/src/operate424/operate/operate3/” + UUID.randomUUID() + “.png”));
//每次讀取的字節數組
byte[] bytes = new byte[1024];
//每次讀取的字節個數
int length;
while ((length = input.read(bytes)) != -1) {
out.write(bytes, 0, length);
}
System.out.println(“服務器成功接收到一個文件”);
//給客戶端寫成功信息
success(accept);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- @param accept 與客戶端的連接對象
總結
以上是生活随笔為你收集整理的基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡代还什么意思 看过你就知道了
- 下一篇: ashmaisv.exe进程安全不安全