【java网络编程】用TCP socket实现多线程图片上传
生活随笔
收集整理的這篇文章主要介紹了
【java网络编程】用TCP socket实现多线程图片上传
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
- 單線程上傳
- 服務(wù)端:
- 客戶端:
- 多線程上傳
- 修改服務(wù)端:
- 修改客戶端
單線程上傳
服務(wù)端:
public static void main(String[] args) {try ( // 創(chuàng)建一個ServerSocket監(jiān)聽8080端口的客戶端請求ServerSocket server = new ServerSocket(8000); // 使用accept()阻塞當前線程,等待客戶端請求Socket socket = server.accept(); // 由Socket獲得輸入流,并創(chuàng)建緩沖輸入流BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); // 由文件輸出流創(chuàng)建緩沖輸出流FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\Pictures\\m66.png")) { // 準備一個緩沖區(qū)byte[] buffer = new byte[1024]; // 首次從Socket讀取數(shù)據(jù)int len = in.read(buffer);while (len != -1) { // 寫入數(shù)據(jù)到文件out.write(buffer, 0, len); // 再次從Socket讀取數(shù)據(jù)len = in.read(buffer);}System.out.println("接收完成!");} catch (IOException e) {e.printStackTrace();}}客戶端:
/*** @Author he* @Description 測試Socket上傳文件的客戶端* @Date 8.22**/ public class UdpClient {public static void main(String[] args) {try ( // 向本機的8080端口發(fā)出請求Socket socket = new Socket("127.0.0.1", 8000);// 由Socket獲得輸出流,并創(chuàng)建緩沖輸出流BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());// 創(chuàng)建文件輸入流FileInputStream fin = new FileInputStream("C:\\Users\\14172\\Pictures\\m11.png");// 由文件輸入流創(chuàng)建緩沖輸入流BufferedInputStream in = new BufferedInputStream(fin)) { // 準備一個緩沖區(qū)byte[] buffer = new byte[1024]; // 首次讀取文件int len = in.read(buffer);while (len != -1) { // 數(shù)據(jù)寫入Socketout.write(buffer, 0, len); // 再次讀取文件len = in.read(buffer);}System.out.println("上傳成功!");} catch (ConnectException e) {System.out.println("服務(wù)器未啟動!");} catch (IOException e) {e.printStackTrace();}}}查看文件:
可以看到自己的目錄下已經(jīng)出現(xiàn)了C:\Users\14172\Pictures\m66.png
多線程上傳
改成多線程的形式:
修改服務(wù)端:
public class isStream {public static void main(String[] args)throws Exception {ServerSocket server = new ServerSocket(8000);// 創(chuàng)建一個ServerSocket監(jiān)聽8080端口的客戶端請求 // 使用accept()阻塞當前線程,等待客戶端請求while (true) //(2)開始在這里暫停等待接收客戶端的連接,得到一個端到端的Socket管道{Socket socket = server.accept();new ServerReadThread(socket).start();}}class ServerReadThread extends Thread {static int number = 0;private Socket socket;public ServerReadThread(Socket socket) {this.socket = socket;} @Overridepublic void run(){ try( // 由Socket獲得輸入流,并創(chuàng)建緩沖輸入流BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); // 由文件輸出流創(chuàng)建緩沖輸出流FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\socket\\"+number+".png")) {number++; // 準備一個緩沖區(qū)byte[] buffer = new byte[1024]; // 首次從Socket讀取數(shù)據(jù)int len = in.read(buffer);while (len != -1) { // 寫入數(shù)據(jù)到文件out.write(buffer, 0, len); // 再次從Socket讀取數(shù)據(jù)len = in.read(buffer);System.out.println("接收完成!");}} catch (FileNotFoundException fileNotFoundException) {fileNotFoundException.printStackTrace(); } catch (IOException ioException) {ioException.printStackTrace(); }} }查看結(jié)果:
修改客戶端
修改為用戶輸入圖片路徑,進行多次上傳圖片:
public class UdpClient {public static void main(String[] args) throws IOException {int num = 0;Socket socket = new Socket("127.0.0.1", 8000);// 由Socket獲得輸出流,并創(chuàng)建緩沖輸出流BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());Scanner scanner = new Scanner(System.in);// 創(chuàng)建文件輸入流while (true) {num++;try ( // 向本機的8080端口發(fā)出請求//System.out.println("輸入文件路徑:");FileInputStream fin = new FileInputStream(scanner.nextLine());// 由文件輸入流創(chuàng)建緩沖輸入流BufferedInputStream in = new BufferedInputStream(fin)) { // 準備一個緩沖區(qū)byte[] buffer = new byte[1024]; // 首次讀取文件int len = in.read(buffer);while (len != -1) { // 數(shù)據(jù)寫入Socketout.write(buffer, 0, len); // 再次讀取文件len = in.read(buffer);}System.out.println("上傳成功!");} catch (ConnectException e) {System.out.println("服務(wù)器未啟動!");} catch (IOException e) {e.printStackTrace();} if(num == 5) break;}}}
查看目錄:
發(fā)現(xiàn)一個小問題:已經(jīng)存在的一樣的命名的圖片不會覆蓋
然后有的圖片傳過去之后格式會損壞,貌似是jpg轉(zhuǎn)為png命名的時候
總結(jié)
以上是生活随笔為你收集整理的【java网络编程】用TCP socket实现多线程图片上传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell的学习和命令使用入门
- 下一篇: modelMapper.map的一个使用