之前的几个范例都是传送文字指令或信息给连线的另一端,适当的改写一下,就可以作文件传送,主要是使用PrintStream的write()方法,它负责将位元或int传送给连线的另一端。
程序分作两个,一个伺服端与一个客户端,伺服端会倾听连线,而客户端在连线传送一个文件之后就会结束程序,这是文件传送的一个简单例子,首先是伺服端程序:
package onlyfun.caterpillar;
import java.io.*; import java.net.*;
public class Server { public static void main(String[] args) { try { int port = Integer.parseInt(args[0]); System.out.println("简易文件接收..."); System.out.printf("将接收文件于连接埠: %d%n", port);
ServerSocket serverSkt = new ServerSocket(port); while(true) { System.out.println("倾听中...."); Socket clientSkt = serverSkt.accept(); System.out.printf("与 %s 建立连线%n", clientSkt.getInetAddress().toString()); // 取得文件名称 String fileName = new BufferedReader( new InputStreamReader( clientSkt.getInputStream())).readLine(); System.out.printf("接收文件 %s ...", fileName);
BufferedInputStream inputStream = new BufferedInputStream(clientSkt.getInputStream()); BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(fileName)); int readin; while((readin = inputStream.read()) != -1) { outputStream.write(readin); Thread.yield(); }
outputStream.flush(); outputStream.close(); inputStream.close(); clientSkt.close(); System.out.println("\n文件接收完毕!"); } } catch(Exception e) { e.printStackTrace(); } } }
再来是客户端程序:
package onlyfun.caterpillar;
import java.io.*; import java.net.*;
public class Client { public static void main(String[] args) { try { System.out.println("简易文件传送...");
String remoteHost = args[0]; int port = Integer.parseInt(args[1]); File file = new File(args[2]); System.out.printf("远端主机: %s%n", remoteHost); System.out.printf("远端主机连接埠: %d%n", port); System.out.printf("传送文件: %s%n", file.getName());
Socket skt = new Socket(remoteHost, port);
System.out.println("连线成功!尝试传送文件....");
PrintStream printStream = new PrintStream(skt.getOutputStream()); printStream.println(file.getName());
System.out.print("OK! 传送文件...."); BufferedInputStream inputStream = new BufferedInputStream( new FileInputStream(file));
int readin; while((readin = inputStream.read()) != -1) { printStream.write(readin); Thread.yield(); }
printStream.flush(); printStream.close(); inputStream.close(); skt.close(); System.out.println("\n文件传送完毕!"); } catch(Exception e) { e.printStackTrace(); } } }
为简化程序范例,程序是单一流程,不使用多线程,下面是伺服端的执行范例:
$ java onlyfun.caterpillar.Server 9393
简易文件接收...
将接收文件于连接埠: 9393
倾听中....
与 /127.0.0.1 建立连线
接收文件 caterpillar.jpg ...
文件接收完毕!
倾听中....
|
下面是对应的客户端执行范例:
$ java onlyfun.caterpillar.Client localhost 9393 e:\caterpillar.jpg
简易文件传送...
远端主机: localhost
远端主机连接埠: 9393
传送文件: caterpillar.jpg
连线成功!尝试传送文件....
OK! 传送文件....
文件传送完毕!
|
|