Java Socket编程 文件传输(客户端从服务器下载一个文件)
生活随笔
收集整理的這篇文章主要介紹了
Java Socket编程 文件传输(客户端从服务器下载一个文件)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
服務器(Server)?
[java] view plaincopy?
package com.socket.sample;??
??
import java.io.BufferedInputStream;??
import java.io.DataInputStream;??
import java.io.DataOutputStream;??
import java.io.File;??
import java.io.FileInputStream;??
import java.net.ServerSocket;??
import java.net.Socket;??
??
public class ServerTest {??
??? int port = 8821;??
??
??? void start() {??
??????? Socket s = null;??
??????? try {??
??????????? ServerSocket ss = new ServerSocket(port);??
??????????? while (true) {??
??????????????? // 選擇進行傳輸的文件??
??????????????? String filePath = "D:\\lib.rar";??
??????????????? File fi = new File(filePath);??
??
??????????????? System.out.println("文件長度:" + (int) fi.length());??
??
??????????????? // public Socket accept() throws??
??????????????? // IOException偵聽并接受到此套接字的連接。此方法在進行連接之前一直阻塞。??
??
??????????????? s = ss.accept();??
??????????????? System.out.println("建立socket鏈接");??
??????????????? DataInputStream dis = new DataInputStream(??
??????????????????????? new BufferedInputStream(s.getInputStream()));??
??????????????? dis.readByte();??
??
??????????????? DataInputStream fis = new DataInputStream(??
??????????????????????? new BufferedInputStream(new FileInputStream(filePath)));??
??????????????? DataOutputStream ps = new DataOutputStream(s.getOutputStream());??
??????????????? // 將文件名及長度傳給客戶端。這里要真正適用所有平臺,例如中文名的處理,還需要加工,具體可以參見Think In Java??
??????????????? // 4th里有現成的代碼。??
??????????????? ps.writeUTF(fi.getName());??
??????????????? ps.flush();??
??????????????? ps.writeLong((long) fi.length());??
??????????????? ps.flush();??
??
??????????????? int bufferSize = 8192;??
??????????????? byte[] buf = new byte[bufferSize];??
??
??????????????? while (true) {??
??????????????????? int read = 0;??
??????????????????? if (fis != null) {??
??????????????????????? read = fis.read(buf);??
??????????????????????? // 從包含的輸入流中讀取一定數量的字節,并將它們存儲到緩沖區數組 b??
??????????????????????? // 中。以整數形式返回實際讀取的字節數。在輸入數據可用、檢測到文件末尾 (end of file)??
??????????????????????? // 或拋出異常之前,此方法將一直阻塞。??
??????????????????? }??
??
??????????????????? if (read == -1) {??
??????????????????????? break;??
??????????????????? }??
??????????????????? ps.write(buf, 0, read);??
??????????????? }??
??????????????? ps.flush();??
??????????????? // 注意關閉socket鏈接哦,不然客戶端會等待server的數據過來,??
??????????????? // 直到socket超時,導致數據不完整。??
??????????????? fis.close();??
??????????????? s.close();??
??????????????? System.out.println("文件傳輸完成");??
??????????? }??
??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????? }??
??? }??
??
??? public static void main(String arg[]) {??
??????? new ServerTest().start();??
??? }??
}??
客戶端工具(SocketTool)?
[java] view plaincopy?
package com.socket.sample;??
??
import java.io.BufferedInputStream;??
import java.io.DataInputStream;??
import java.io.DataOutputStream;??
import java.net.Socket;??
??
public class ClientSocket {??
??? private String ip;??
??
??? private int port;??
??
??? private Socket socket = null;??
??
??? DataOutputStream out = null;??
??
??? DataInputStream getMessageStream = null;??
??
??? public ClientSocket(String ip, int port) {??
??????? this.ip = ip;??
??????? this.port = port;??
??? }??
??
??? /** */??
??? /**?
???? * 創建socket連接?
???? *??
???? * @throws Exception?
???? *???????????? exception?
???? */??
??? public void CreateConnection() throws Exception {??
??????? try {??
??????????? socket = new Socket(ip, port);??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????????? if (socket != null)??
??????????????? socket.close();??
??????????? throw e;??
??????? } finally {??
??????? }??
??? }??
??
??? public void sendMessage(String sendMessage) throws Exception {??
??????? try {??
??????????? out = new DataOutputStream(socket.getOutputStream());??
??????????? if (sendMessage.equals("Windows")) {??
??????????????? out.writeByte(0x1);??
??????????????? out.flush();??
??????????????? return;??
??????????? }??
??????????? if (sendMessage.equals("Unix")) {??
??????????????? out.writeByte(0x2);??
??????????????? out.flush();??
??????????????? return;??
??????????? }??
??????????? if (sendMessage.equals("Linux")) {??
??????????????? out.writeByte(0x3);??
??????????????? out.flush();??
??????????? } else {??
??????????????? out.writeUTF(sendMessage);??
??????????????? out.flush();??
??????????? }??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????????? if (out != null)??
??????????????? out.close();??
??????????? throw e;??
??????? } finally {??
??????? }??
??? }??
??
??? public DataInputStream getMessageStream() throws Exception {??
??????? try {??
??????????? getMessageStream = new DataInputStream(new BufferedInputStream(??
??????????????????? socket.getInputStream()));??
??????????? return getMessageStream;??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????????? if (getMessageStream != null)??
??????????????? getMessageStream.close();??
??????????? throw e;??
??????? } finally {??
??????? }??
??? }??
??
??? public void shutDownConnection() {??
??????? try {??
??????????? if (out != null)??
??????????????? out.close();??
??????????? if (getMessageStream != null)??
??????????????? getMessageStream.close();??
??????????? if (socket != null)??
??????????????? socket.close();??
??????? } catch (Exception e) {??
??
??????? }??
??? }??
}??
客戶端(Client)?
[java] view plaincopy?
package com.socket.sample;??
??
import java.io.BufferedOutputStream;??
import java.io.DataInputStream;??
import java.io.DataOutputStream;??
import java.io.FileOutputStream;??
??
public class ClientTest {??
??? private ClientSocket cs = null;??
??
??? private String ip = "localhost";// 設置成服務器IP??
??
??? private int port = 8821;??
??
??? private String sendMessage = "Windows";??
??
??? public ClientTest() {??
??????? try {??
??????????? if (createConnection()) {??
??????????????? sendMessage();??
??????????????? getMessage();??
??????????? }??
??
??????? } catch (Exception ex) {??
??????????? ex.printStackTrace();??
??????? }??
??? }??
??
??? private boolean createConnection() {??
??????? cs = new ClientSocket(ip, port);??
??????? try {??
??????????? cs.CreateConnection();??
??????????? System.out.print("連接服務器成功!" + "\n");??
??????????? return true;??
??????? } catch (Exception e) {??
??????????? System.out.print("連接服務器失敗!" + "\n");??
??????????? return false;??
??????? }??
??
??? }??
??
??? private void sendMessage() {??
??????? if (cs == null)??
??????????? return;??
??????? try {??
??????????? cs.sendMessage(sendMessage);??
??????? } catch (Exception e) {??
??????????? System.out.print("發送消息失敗!" + "\n");??
??????? }??
??? }??
??
??? private void getMessage() {??
??????? if (cs == null)??
??????????? return;??
??????? DataInputStream inputStream = null;??
??????? try {??
??????????? inputStream = cs.getMessageStream();??
??????? } catch (Exception e) {??
??????????? System.out.print("接收消息緩存錯誤\n");??
??????????? return;??
??????? }??
??
??????? try {??
??????????? // 本地保存路徑,文件名會自動從服務器端繼承而來。??
??????????? String savePath = "E:\\";??
??????????? int bufferSize = 8192;??
??????????? byte[] buf = new byte[bufferSize];??
??????????? int passedlen = 0;??
??????????? long len = 0;??
??
??????????? savePath += inputStream.readUTF();??
??????????? DataOutputStream fileOut = new DataOutputStream(??
??????????????????? new BufferedOutputStream(new FileOutputStream(savePath)));??
??????????? len = inputStream.readLong();??
??
??????????? System.out.println("文件的長度為:" + len + "\n");??
??????????? System.out.println("開始接收文件!" + "\n");??
??
??????????? while (true) {??
??????????????? int read = 0;??
??????????????? if (inputStream != null) {??
??????????????????? read = inputStream.read(buf);??
??????????????? }??
??????????????? passedlen += read;??
??????????????? if (read == -1) {??
??????????????????? break;??
??????????????? }??
??????????????? // 下面進度條本為圖形界面的prograssBar做的,這里如果是打文件,可能會重復打印出一些相同的百分比??
??????????????? System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");??
??????????????? fileOut.write(buf, 0, read);??
??????????? }??
??????????? System.out.println("接收完成,文件存為" + savePath + "\n");??
??
??????????? fileOut.close();??
??????? } catch (Exception e) {??
??????????? System.out.println("接收消息錯誤" + "\n");??
??????????? return;??
??????? }??
??? }??
??
??? public static void main(String arg[]) {??
??????? new ClientTest().getMessage();??
??? }??
}??
測試是成功的,在DOS命令行下編譯~~~ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
[java] view plaincopy?
package com.socket.sample;??
??
import java.io.BufferedInputStream;??
import java.io.DataInputStream;??
import java.io.DataOutputStream;??
import java.io.File;??
import java.io.FileInputStream;??
import java.net.ServerSocket;??
import java.net.Socket;??
??
public class ServerTest {??
??? int port = 8821;??
??
??? void start() {??
??????? Socket s = null;??
??????? try {??
??????????? ServerSocket ss = new ServerSocket(port);??
??????????? while (true) {??
??????????????? // 選擇進行傳輸的文件??
??????????????? String filePath = "D:\\lib.rar";??
??????????????? File fi = new File(filePath);??
??
??????????????? System.out.println("文件長度:" + (int) fi.length());??
??
??????????????? // public Socket accept() throws??
??????????????? // IOException偵聽并接受到此套接字的連接。此方法在進行連接之前一直阻塞。??
??
??????????????? s = ss.accept();??
??????????????? System.out.println("建立socket鏈接");??
??????????????? DataInputStream dis = new DataInputStream(??
??????????????????????? new BufferedInputStream(s.getInputStream()));??
??????????????? dis.readByte();??
??
??????????????? DataInputStream fis = new DataInputStream(??
??????????????????????? new BufferedInputStream(new FileInputStream(filePath)));??
??????????????? DataOutputStream ps = new DataOutputStream(s.getOutputStream());??
??????????????? // 將文件名及長度傳給客戶端。這里要真正適用所有平臺,例如中文名的處理,還需要加工,具體可以參見Think In Java??
??????????????? // 4th里有現成的代碼。??
??????????????? ps.writeUTF(fi.getName());??
??????????????? ps.flush();??
??????????????? ps.writeLong((long) fi.length());??
??????????????? ps.flush();??
??
??????????????? int bufferSize = 8192;??
??????????????? byte[] buf = new byte[bufferSize];??
??
??????????????? while (true) {??
??????????????????? int read = 0;??
??????????????????? if (fis != null) {??
??????????????????????? read = fis.read(buf);??
??????????????????????? // 從包含的輸入流中讀取一定數量的字節,并將它們存儲到緩沖區數組 b??
??????????????????????? // 中。以整數形式返回實際讀取的字節數。在輸入數據可用、檢測到文件末尾 (end of file)??
??????????????????????? // 或拋出異常之前,此方法將一直阻塞。??
??????????????????? }??
??
??????????????????? if (read == -1) {??
??????????????????????? break;??
??????????????????? }??
??????????????????? ps.write(buf, 0, read);??
??????????????? }??
??????????????? ps.flush();??
??????????????? // 注意關閉socket鏈接哦,不然客戶端會等待server的數據過來,??
??????????????? // 直到socket超時,導致數據不完整。??
??????????????? fis.close();??
??????????????? s.close();??
??????????????? System.out.println("文件傳輸完成");??
??????????? }??
??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????? }??
??? }??
??
??? public static void main(String arg[]) {??
??????? new ServerTest().start();??
??? }??
}??
客戶端工具(SocketTool)?
[java] view plaincopy?
package com.socket.sample;??
??
import java.io.BufferedInputStream;??
import java.io.DataInputStream;??
import java.io.DataOutputStream;??
import java.net.Socket;??
??
public class ClientSocket {??
??? private String ip;??
??
??? private int port;??
??
??? private Socket socket = null;??
??
??? DataOutputStream out = null;??
??
??? DataInputStream getMessageStream = null;??
??
??? public ClientSocket(String ip, int port) {??
??????? this.ip = ip;??
??????? this.port = port;??
??? }??
??
??? /** */??
??? /**?
???? * 創建socket連接?
???? *??
???? * @throws Exception?
???? *???????????? exception?
???? */??
??? public void CreateConnection() throws Exception {??
??????? try {??
??????????? socket = new Socket(ip, port);??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????????? if (socket != null)??
??????????????? socket.close();??
??????????? throw e;??
??????? } finally {??
??????? }??
??? }??
??
??? public void sendMessage(String sendMessage) throws Exception {??
??????? try {??
??????????? out = new DataOutputStream(socket.getOutputStream());??
??????????? if (sendMessage.equals("Windows")) {??
??????????????? out.writeByte(0x1);??
??????????????? out.flush();??
??????????????? return;??
??????????? }??
??????????? if (sendMessage.equals("Unix")) {??
??????????????? out.writeByte(0x2);??
??????????????? out.flush();??
??????????????? return;??
??????????? }??
??????????? if (sendMessage.equals("Linux")) {??
??????????????? out.writeByte(0x3);??
??????????????? out.flush();??
??????????? } else {??
??????????????? out.writeUTF(sendMessage);??
??????????????? out.flush();??
??????????? }??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????????? if (out != null)??
??????????????? out.close();??
??????????? throw e;??
??????? } finally {??
??????? }??
??? }??
??
??? public DataInputStream getMessageStream() throws Exception {??
??????? try {??
??????????? getMessageStream = new DataInputStream(new BufferedInputStream(??
??????????????????? socket.getInputStream()));??
??????????? return getMessageStream;??
??????? } catch (Exception e) {??
??????????? e.printStackTrace();??
??????????? if (getMessageStream != null)??
??????????????? getMessageStream.close();??
??????????? throw e;??
??????? } finally {??
??????? }??
??? }??
??
??? public void shutDownConnection() {??
??????? try {??
??????????? if (out != null)??
??????????????? out.close();??
??????????? if (getMessageStream != null)??
??????????????? getMessageStream.close();??
??????????? if (socket != null)??
??????????????? socket.close();??
??????? } catch (Exception e) {??
??
??????? }??
??? }??
}??
客戶端(Client)?
[java] view plaincopy?
package com.socket.sample;??
??
import java.io.BufferedOutputStream;??
import java.io.DataInputStream;??
import java.io.DataOutputStream;??
import java.io.FileOutputStream;??
??
public class ClientTest {??
??? private ClientSocket cs = null;??
??
??? private String ip = "localhost";// 設置成服務器IP??
??
??? private int port = 8821;??
??
??? private String sendMessage = "Windows";??
??
??? public ClientTest() {??
??????? try {??
??????????? if (createConnection()) {??
??????????????? sendMessage();??
??????????????? getMessage();??
??????????? }??
??
??????? } catch (Exception ex) {??
??????????? ex.printStackTrace();??
??????? }??
??? }??
??
??? private boolean createConnection() {??
??????? cs = new ClientSocket(ip, port);??
??????? try {??
??????????? cs.CreateConnection();??
??????????? System.out.print("連接服務器成功!" + "\n");??
??????????? return true;??
??????? } catch (Exception e) {??
??????????? System.out.print("連接服務器失敗!" + "\n");??
??????????? return false;??
??????? }??
??
??? }??
??
??? private void sendMessage() {??
??????? if (cs == null)??
??????????? return;??
??????? try {??
??????????? cs.sendMessage(sendMessage);??
??????? } catch (Exception e) {??
??????????? System.out.print("發送消息失敗!" + "\n");??
??????? }??
??? }??
??
??? private void getMessage() {??
??????? if (cs == null)??
??????????? return;??
??????? DataInputStream inputStream = null;??
??????? try {??
??????????? inputStream = cs.getMessageStream();??
??????? } catch (Exception e) {??
??????????? System.out.print("接收消息緩存錯誤\n");??
??????????? return;??
??????? }??
??
??????? try {??
??????????? // 本地保存路徑,文件名會自動從服務器端繼承而來。??
??????????? String savePath = "E:\\";??
??????????? int bufferSize = 8192;??
??????????? byte[] buf = new byte[bufferSize];??
??????????? int passedlen = 0;??
??????????? long len = 0;??
??
??????????? savePath += inputStream.readUTF();??
??????????? DataOutputStream fileOut = new DataOutputStream(??
??????????????????? new BufferedOutputStream(new FileOutputStream(savePath)));??
??????????? len = inputStream.readLong();??
??
??????????? System.out.println("文件的長度為:" + len + "\n");??
??????????? System.out.println("開始接收文件!" + "\n");??
??
??????????? while (true) {??
??????????????? int read = 0;??
??????????????? if (inputStream != null) {??
??????????????????? read = inputStream.read(buf);??
??????????????? }??
??????????????? passedlen += read;??
??????????????? if (read == -1) {??
??????????????????? break;??
??????????????? }??
??????????????? // 下面進度條本為圖形界面的prograssBar做的,這里如果是打文件,可能會重復打印出一些相同的百分比??
??????????????? System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");??
??????????????? fileOut.write(buf, 0, read);??
??????????? }??
??????????? System.out.println("接收完成,文件存為" + savePath + "\n");??
??
??????????? fileOut.close();??
??????? } catch (Exception e) {??
??????????? System.out.println("接收消息錯誤" + "\n");??
??????????? return;??
??????? }??
??? }??
??
??? public static void main(String arg[]) {??
??????? new ClientTest().getMessage();??
??? }??
}??
測試是成功的,在DOS命令行下編譯~~~ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Java Socket编程 文件传输(客户端从服务器下载一个文件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下tomcat无法启动
- 下一篇: Registry key 'Softwa