通常在java Socket编程中,通常会遇到文件传输的情况。文件传输有两种方式字节流和字符流,那么哪些文件用字符流哪些文件用字节流呢?一般的文本文件用字符流,在用字符流的过程中注意在发送方和接收方统一文件的编码;其他类型文件一般采用字节流,可防止文件在传输过程中发生变化。
有时候我们会发现文件经过传输之后发生变化(例如图片损坏,应用程序无法运行等)。查看文件属性,发现文件大小没有变化,但是采用MD5文件校验时发现传输前后md5发生了变化,这通常就是由于采用不正确的传输流造成的。
下面的例子以字节流为例,展示了java Socket文件传输。
//客户端
import
java.io.BufferedInputStream;
import
java.io.DataInputStream;
import
java.io.DataOutputStream;
import
java.io.FileInputStream;
import
java.io.IOException;
import
java.io.PrintWriter;
import
java.net.Socket;
import
java.net.UnknownHostException;
public
class
Client {
private
Socket socket =
null
;
PrintWriter socketWriter =
null
;
public
void
connect()
throws
UnknownHostException, IOException {
socket =
new
Socket(
"192.168.1.104"
,
8080
);
}
public
void
transferFile()
throws
IOException {
FileInputStream is =
new
FileInputStream(
"D:\test.exe"
);
DataInputStream fiins =
new
DataInputStream(
new
BufferedInputStream(is));
DataOutputStream fileous =
new
DataOutputStream(socket
.getOutputStream());
int
n =
512
, m;
byte
buffer[] =
new
byte
[n];
while
((m = fiins.read(buffer,
0
, n)) != -
1
&& m >
0
) {
fileous.write(buffer,
0
, m); //这里要注意 读取多少字节 写入多少字节
fileous.flush();
}
fileous.flush();
fileous.close();
fiins.close();
socket.getOutputStream().close();
socketWriter.close();
}
}
//服务器端代码
import
java.io.DataInputStream;
import
java.io.DataOutputStream;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server {
private
ServerSocket server =
null
;
private
Socket socket =
null
;
public
void
connect()
throws
IOException{
server =
new
ServerSocket(
8080
,
5
);
socket = server.accept();
System.out.println(socket.getInetAddress());
}
public
void
getFile()
throws
IOException{
InputStream in = socket.getInputStream();
File file =
new
File(
"E:\\text.exe"
);
DataInputStream fileStream =
new
DataInputStream(in);
FileOutputStream os =
new
FileOutputStream(file);
DataOutputStream out =
new
DataOutputStream(os);
int
n =
512
,m;
byte
buffer[] =
new
byte
[n];
while
(((m=fileStream.read(buffer,
0
, n))!=-
1
) && (m>
0
)){
out.write(buffer,
0
,m);
}
out.close();
in.close();
os.close();
System.out.println(
"ok"
);
socket.close();
server.close();
}
}
|