大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: 文件传送

之前的几个范例都是传送文字指令或信息给连线的另一端,适当的改写一下,就可以作文件传送,主要是使用PrintStream的write()方法,它负责将位元或int传送给连线的另一端。

程序分作两个,一个伺服端与一个客户端,伺服端会倾听连线,而客户端在连线传送一个文件之后就会结束程序,这是文件传送的一个简单例子,首先是伺服端程序:
  • Server.java
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();
}
}
}

再来是客户端程序:
  • Client.java
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! 传送文件....
文件传送完毕!