Posted on 2009-09-10 20:34
love1563 阅读(1000)
评论(0) 编辑 收藏
/**
* 发送端
*/
class Client {
// 网上抄来的,将 int 转成字节
public static byte[] i2b(int i) {
return new byte[]{
(byte) ((i >> 24) & 0xFF),
(byte) ((i >> 16) & 0xFF),
(byte) ((i >> 8) & 0xFF),
(byte) (i & 0xFF)
};
}
/**
* 发送文件。文件大小不能大于 {@link Integer#MAX_VALUE}
*
* @param hostname 接收端主机名或 IP 地址
* @param port 接收端端口号
* @param filepath 文件路径
*
* @throws IOException 如果读取文件或发送失败
*/
public void sendFile(String hostname, int port, String filepath) throws IOException {
File file = new File(filepath);
FileInputStream is = new FileInputStream(filepath);
Socket socket = new Socket(hostname, port);
OutputStream os = socket.getOutputStream();
try {
int length = (int) file.length();
System.out.println("发送文件:" + file.getName() + ",长度:" + length);
// 发送文件名和文件内容
writeFileName(file, os);
writeFileContent(is, os, length);
} finally {
os.close();
is.close();
}
}
// 输出文件内容
private void writeFileContent(InputStream is, OutputStream os, int length) throws IOException {
// 输出文件长度
os.write(i2b(length));
// 输出文件内容
byte[] buffer = new byte[4096];
int size;
while ((size = is.read(buffer)) != -1) {
os.write(buffer, 0, size);
}
}
// 输出文件名
private void writeFileName(File file, OutputStream os) throws IOException {
byte[] fn_bytes = file.getName().getBytes();
os.write(i2b(fn_bytes.length)); // 输出文件名长度
os.write(fn_bytes); // 输出文件名
}
}
本文来自: IT知道网(http://www.itwis.com) 详细出处参考:http://www.itwis.com/html/java/j2se/20090304/3503_2.html