通常在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 { privateSocket socket =
null; PrintWriter socketWriter =null;
publicvoid
connect() throws
UnknownHostException, IOException { socket =new
Socket("192.168.1.104",8080);
} publicvoid
transferFile() throws
IOException { FileInputStream is =new
FileInputStream("D:\test.exe"); DataInputStream fiins =new
DataInputStream(newBufferedInputStream(is));
DataOutputStream fileous =new
DataOutputStream(socket .getOutputStream()); intn =
512, m; bytebuffer[] =
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 { privateServerSocket server =
null; privateSocket socket =
null; publicvoid
connect() throws
IOException{ server =new
ServerSocket(8080,5); socket = server.accept(); System.out.println(socket.getInetAddress()); } publicvoid
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); intn =
512,m; bytebuffer[] =
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(); }} |
580

被折叠的 条评论
为什么被折叠?



