最近在一個課程設計,聊天系統,裡面有個功能就是傳輸檔案,我開先用的是udp資料報傳輸檔案,但是發現當傳輸的檔案太大的時候丟包,所以後改用java的socket 的tcp串連傳輸檔案,在區域網路中傳輸檔案速度還是可以。
下面是部分代碼,可能無法單獨運行,因為裡面涉及到圖形介面,牽扯到其他的類,不過稍加改動就可以了,我把原始碼上傳到csdn上了,是:http://download.csdn.net/source/1957266,供大家下載學習使用,由於開發時間短,所以開發時用戶端和伺服器端共用了一些類,其實這應該分開的,呵呵!
本系統可以多用戶端和伺服器端進行通訊,傳輸檔案。介面不太好看,惡哈哈!
下面還是把傳輸檔案的主要兩個類的代碼貼出來。
接受類:<br />package org.loonsoft.server;</p><p>import java.io.DataInputStream;<br />import java.io.DataOutputStream;<br />import java.io.File;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.net.ServerSocket;<br />import java.net.Socket;<br />import java.util.concurrent.ExecutorService;<br />import java.util.concurrent.Executors;</p><p>import javax.swing.JDialog;<br />import javax.swing.JOptionPane;</p><p>import org.loonsoft.utils.FileProgressBar;<br />import org.loonsoft.utils.FrameUtils;<br />import org.loonsoft.utils.ParamaterUtils;<br />import org.loonsoft.utils.SaveFileDialog;</p><p>public class ReceiveFileService implements Runnable {</p><p>private ExecutorService exec = Executors.newCachedThreadPool();</p><p>private ServerSocket serverSocket = null;</p><p>private Socket socket = null;</p><p>private FrameUtils frame = null;</p><p>public ReceiveFileService(FrameUtils frame) {</p><p>this.frame = frame;</p><p>try {</p><p>serverSocket = new ServerSocket(ParamaterUtils.getFilePort());<br />// serverSocket = new ServerSocket(8881);</p><p>System.out.println("檔案監聽啟動.....");</p><p>} catch (IOException e) {</p><p>e.printStackTrace();</p><p>}<br />}</p><p>public void run() {</p><p>while (true) {</p><p>try {</p><p>socket = serverSocket.accept();</p><p>// System.out.println(socket.getPort());</p><p>exec.execute(new Handler(socket, frame).run());</p><p>// socket.close();<br />// serverSocket.close();</p><p>} catch (IOException e) {</p><p>e.printStackTrace();<br />}</p><p>}</p><p>}</p><p>// public static void main(String[] args) {<br />// new Thread(new ReceiveFileService()).start();<br />// }</p><p>}</p><p>class Handler {</p><p>private Socket socket = null;</p><p>private FrameUtils frame = null;</p><p>private FileProgressBar bar = null;</p><p>private final JDialog barDialog = new JDialog();</p><p>public Handler(Socket socket, FrameUtils frame) {</p><p>this.socket = socket;</p><p>this.frame = frame;</p><p>}</p><p>private DataInputStream getDataInputStream() throws IOException {</p><p>return new DataInputStream(socket.getInputStream());</p><p>}</p><p>private DataOutputStream getDataOutputStream() throws IOException {</p><p>return new DataOutputStream(socket.getOutputStream());</p><p>}</p><p>private String selectedPath() {</p><p>return new SaveFileDialog().getPath(frame);<br />}</p><p>private void runBar(int maxSize) {</p><p>bar = new FileProgressBar();</p><p>bar.setSize(maxSize);</p><p>barDialog.setLocation(150, 20);</p><p>barDialog.setTitle("檔案接收進度");</p><p>barDialog.setSize(250, 50);</p><p>barDialog.add(bar.getBar());</p><p>barDialog.setEnabled(false);</p><p>barDialog.setVisible(true);</p><p>new Thread(bar).start();</p><p>}</p><p>public Runnable run() {</p><p>return new Runnable() {</p><p>public void run() {</p><p>try {</p><p>DataInputStream in = getDataInputStream();</p><p>DataOutputStream os = getDataOutputStream();</p><p>byte[] data = new byte[1024];<br /> while(in.available()<=0) ;//同步</p><p>int len = in.read(data);</p><p>String[] str = new String(data, 0, len, "utf-8").split(";");</p><p>String path = selectedPath();</p><p>if (len != -1)<br />path += str[0];//str[0]是檔案名稱加類型</p><p>System.out.println(path);</p><p>os.write("start".getBytes());</p><p>os.flush();</p><p>File file = new File(path);</p><p>DataOutputStream out = new DataOutputStream(<br />new FileOutputStream(file));</p><p>System.out.println("開始接收.....");</p><p>int countSize = 0;</p><p>runBar(Integer.parseInt(str[1]));// 開機檔案接受進度條</p><p>while ((len = in.read(data)) != -1) {</p><p>out.write(data, 0, len);</p><p>countSize += len;</p><p>bar.setSendSize(countSize);</p><p>}</p><p>os.close();</p><p>out.flush();</p><p>out.close();</p><p>in.close();</p><p>barDialog.setVisible(false);</p><p>barDialog.dispose();// 關閉檔案進度顯示框</p><p>JOptionPane.showMessageDialog(frame, "檔案接受完成!");</p><p>} catch (IOException e) {</p><p>e.printStackTrace();</p><p>} finally {</p><p>try {<br />socket.close();<br />System.out.println("關閉....");<br />} catch (IOException e) {<br />e.printStackTrace();<br />}</p><p>}</p><p>}</p><p>};</p><p>}<br />}<br />發送類:<br />package org.loonsoft.client;</p><p>import java.io.DataInputStream;<br />import java.io.DataOutputStream;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.IOException;<br />import java.net.Socket;<br />import java.net.UnknownHostException;</p><p>import org.loonsoft.utils.ParamaterUtils;<br />import org.loonsoft.utils.SendFileProgressBar;</p><p>public class SendFileService implements Runnable {</p><p>private Socket socket = null;</p><p>private String path = null;</p><p>private SendFileProgressBar bar = null;</p><p>public SendFileService(SendFileProgressBar bar)<br />throws UnknownHostException, IOException {</p><p>this.bar = bar;</p><p>socket = new Socket(ParamaterUtils.getIp(), ParamaterUtils<br />.getFilePort());<br />// socket = new Socket("127.0.0.1", 8881);</p><p>}</p><p>private DataOutputStream getDataOutputStream() throws IOException {</p><p>return new DataOutputStream(socket.getOutputStream());</p><p>}</p><p>private DataInputStream getDataInputStream() throws IOException {</p><p>return new DataInputStream(socket.getInputStream());</p><p>}</p><p>private String getPath() {<br />return path;<br />}</p><p>public void setPath(String path) {<br />this.path = path;<br />}</p><p>public void run() {</p><p>try {</p><p>DataInputStream read = new DataInputStream(new FileInputStream(<br />new File(getPath())));</p><p>bar.setSize(read.available());// 設定檔案的總長度</p><p>System.out.println(read.available());</p><p>DataOutputStream os = getDataOutputStream();</p><p>DataInputStream in = getDataInputStream();</p><p>String fileName = path.substring(path.lastIndexOf("//") + 1);//獲得檔案名稱加類型</p><p>System.out.println(fileName);</p><p>os.write((fileName + ";" + read.available()).getBytes("utf-8"));//將檔案名稱和檔案大小傳給接收端</p><p>byte[] data = new byte[1024];</p><p>int len = in.read(data);</p><p>String start = new String(data, 0, len);</p><p>int sendCountLen = 0;</p><p>if (start.equals("start")) {</p><p>new Thread(bar).start();// 開機檔案進度條線程</p><p>while ((len = read.read(data)) != -1) {</p><p>os.write(data, 0, len);</p><p>sendCountLen += len;</p><p>bar.setSendSize(sendCountLen);</p><p>}</p><p>os.flush();</p><p>os.close();</p><p>read.close();</p><p>}</p><p>} catch (IOException e) {</p><p>e.printStackTrace();<br />} finally {</p><p>try {<br />socket.close();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}</p><p>}</p><p>}<br />}<br />