| |
| Java基于Socket实现文件传输示例 |
| |
发布者: 发布时间:2007-10-18 |
|
|
|
package sterning;
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); }
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(); } }
2.socket的Util辅助类
package sterning;
import java.net.*; import java.io.*;
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) {
} } }
3.客户端
package sterning;
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 = "Windwos";
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("连接服务器成功!" + " "); return true; } catch (Exception e) { System.out.print("连接服务器失败!" + " "); return false; }
}
private void sendMessage() { if (cs == null) return; try { cs.sendMessage(sendMessage); } catch (Exception e) { System.out.print("发送消息失败!" + " "); } }
private void getMessage() { if (cs == null) return; DataInputStream inputStream = null; try { inputStream = cs.getMessageStream(); } catch (Exception e) { System.out.print("接收消息缓存错误 "); 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 BufferedOutputStream(new FileOutputStream(savePath)))); len = inputStream.readLong();
System.out.println("文件的长度为:" + len + " "); System.out.println("开始接收文件!" + " ");
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) + "% "); fileOut.write(buf, 0, read); } System.out.println("接收完成,文件存为" + savePath + " ");
fileOut.close(); } catch (Exception e) { System.out.println("接收消息错误" + " "); return; } }
public static void main(String arg[]) { new ClientTest(); } }
这就实现了从服务器端向客户端发送文件的过程,当然,反过来,也一样.稍有不同.代码中对跨平台的细节没有实现,有时间或兴趣的朋友可以提供一下
|
| (转载文章请保留出处:北天JAVA技术网(www.java114.com)) |
| |
| 更多精彩文章: |
| JNDI定义Oracle数据源的方法 |
| JSP调用SQL server 2000存储过程 |
| jdk1.6环境变量设置。 |
| 面向Java开发人员db4o指南:数组和集合 |
| 在JSP环境中配置使用fckeditor详细讲解 |
| JAVA综合--如何掌握JDK1.5枚举类型 |
| |
| 最近评论: |
|
|
| 春暖花开 |
| wow power leveling2
wow power leveling gvf
wow power levelingfcvg
wow power leveling
wow power leveling
wow powerlevelingfcgv
wow powerlevelingwq4
wow powerleveling
wow powerleveling
wow powerleveling
world of warcraft power leveling
world of warcraft power leveling
world of warcraft power leveling
world of warcraft power levelingszr
world of warcraft power leveling
world of warcraft powerleveling
world of warcraft powerlevelinge5t
world of warcraft powerleveling
world of warcraft powerleveling
world of warcraft powerleveling
wow gold
wow gold
wow goldrfy5
wow gold
wow gold
world of warcraft goldre
world of warcraft goldgh
world of warcraft gold
world of warcraft goldfr
world of warcraft gold
AOC Power Levelinggvgv
AGE OF CONAN Power Levelingllwwbb928
l7l6q7df |
|
|
| 回复:Java基于Socket实现文件传输示例 |
| Nv3yXM qtdyjwnaucry, [url=http://tjhjcwtoxfvn.com/]tjhjcwtoxfvn[/url], [link=http://nxgefcmzleuh.com/]nxgefcmzleuh[/link], http://ddkyfsmumyyz.com/ |
|
|
| 鍥炲 |
|
|
|
| 那个雨天的想法! |
| wow gold,wow power leveling.wow power leveling,wow power leveling,
max(8242) |
|
|
| 如果真的有来生! |
| 四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游,
max(8736) |
|
|
| 如果真的有来生! |
| 四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游,
max(9924) |
|
|
| 轻轻走过你的窗前! |
| world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold, max(5344) |
|
|
| 轻轻走过你的窗前! |
| world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(8429) |
|
|
| 快乐情人节! |
| wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap.
max(8345) |
|
|
| 昨夜的狂想曲! |
| wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(5722) |
|
|
| |
| 免责声明:该文章由网友发表,如果对您造成侵权,请联系站长。 |
|