使用Java完成Socket文件传输
生活随笔
收集整理的這篇文章主要介紹了
使用Java完成Socket文件传输
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TCP協(xié)議的Socket文件傳輸
分別使用三個類(TCPFileUpload_Server服務(wù)器端、TCPFileUpload_Client客戶端、StreamUtils工具類)完成圖片的傳輸。
同樣先運行服務(wù)器端文件,再運行客戶端文件
import java.io.*; import java.net.ServerSocket; import java.net.Socket;/*** 服務(wù)器端*/ public class TCPFileUpload_Server {public static void main(String[] args) throws Exception {//思路//在本機 的8888端口監(jiān)聽, 等待連接ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服務(wù)器端,監(jiān)聽8888端口,等待連接");//當(dāng)沒有客戶端連接8888端口時,程序會 阻塞, 等待連接//如果有客戶端連接,則會返回Socket對象,程序繼續(xù)Socket socket = serverSocket.accept();//通過socket.getInputStream() 讀取客戶端寫入到數(shù)據(jù)通道的數(shù)據(jù), 并轉(zhuǎn)換成字節(jié)數(shù)組BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);//寫入指定路徑BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("src\\G.jpg"));bufferedOutputStream.write(bytes);//關(guān)閉IO流bufferedOutputStream.close();//向客戶端回復(fù)收到圖片BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("收到圖片!");bufferedWriter.flush();socket.shutdownOutput();//關(guān)閉所有流bufferedWriter.close();bufferedInputStream.close();socket.close();serverSocket.close();} } import java.io.*; import java.net.InetAddress; import java.net.Socket;/*** 客戶端*/ public class TCPFileUpload_Client {public static void main(String[] args) throws Exception {//連接服務(wù)端 (ip , 端口)//解讀:連接本機的 8888端口, 如果連接成功,返回Socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 8888);System.out.println("客戶端 連接端口:" + socket.getPort());//創(chuàng)建讀取磁盤文件IO流BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("src/P.jpg"));//獲取字節(jié)數(shù)組byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);//通過Socket獲取到輸出流,將bytes發(fā)送到服務(wù)端BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());bufferedOutputStream.write(bytes);//關(guān)閉流對象,socket,刷新,添加終止符bufferedInputStream.close();bufferedOutputStream.flush();socket.shutdownOutput();//接受回復(fù)消息//此處可調(diào)用Utils的方法 // String s = ""; // while ((s = bufferedReader.readLine()) != null) // System.out.println(s);System.out.println(StreamUtils.streamToString(socket.getInputStream()));//關(guān)閉所有流bufferedOutputStream.close(); //socket的包裝流不要過早關(guān)閉socket.close();}} import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader;/*** 此類用于演示關(guān)于流的讀寫方法*/ public class StreamUtils {/*** 功能:將輸入流轉(zhuǎn)換成byte[]** @param is 輸入流* @return byte數(shù)組* @throws Exception IO流異常*/public static byte[] streamToByteArray(InputStream is) throws Exception {ByteArrayOutputStream bos = new ByteArrayOutputStream();//創(chuàng)建輸出流對象byte[] b = new byte[1024];int len;while ((len = is.read(b)) != -1) {bos.write(b, 0, len);}byte[] array = bos.toByteArray();bos.close();return array;}/*** 功能:將InputStream轉(zhuǎn)換成String** @param is 輸入流* @return 字符串* @throws Exception IO流異常*/public static String streamToString(InputStream is) throws Exception {BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder builder = new StringBuilder();String line;while ((line = reader.readLine()) != null) { //當(dāng)讀取到 null時,就表示結(jié)束builder.append(line + "\r\n");}return builder.toString();}}總結(jié)
以上是生活随笔為你收集整理的使用Java完成Socket文件传输的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String tirm()方法去不掉的空
- 下一篇: 有哪些工具或者软件堪称神器?