(1)Server端
(2)Client端
import java.io.*;
import java.net.*;
/**
* 用一个您想让它侦听传入客户机连接的端口来实例化一个ServerSocket(如有问题则抛出 Exception)。
* 调用ServerSocket的accept()以在等待连接期间造成阻塞。
* 获取位于该底层Socket的流以进行读写操作。
* 按使事情简单化的原则包装流。
* 对Socket进行读写。
* 关闭打开的流(并请记住,永远不要在关闭Writer之前关闭Reader)。
* @author Administrator
*
*/
public class RemoteFileServer {
int listenPort;
public RemoteFileServer(int listenPort) {
this.listenPort=listenPort;
}
/**
* 创建一个 ServerSocket 并等待连接请求
*/
public void acceptConnections() {
try {
ServerSocket server = new ServerSocket(listenPort);
Socket incomingConnection = null;
while(true) {
//accept()方法将造成阻塞直到来了一个连接请求
//可以通过用毫秒数调用setSoTimeout()来为accept()调用设置超时,以避免实际长时间的等待。
//调用setSoTimeout()将使accept()经过指定占用时间后抛出IOException
//accept()返回一个新的Socket,这个Socket绑定到服务器上一个随机指定的端口
incomingConnection = server.accept();
//返回的Socket被传递给handleConnection()
handleConnection(incomingConnection);
}
}
catch(BindException e) {
System.out.println("Unable to bind to port "+listenPort);
}
catch(IOException e) {
System.out.println("Unable to instantiate a ServerSocket on port: "+listenPort);
}
}
/**
* 与客户机Socket交互以将客户机所请求的文件的内容发送到客户机
*/
public void handleConnection(Socket incomingConnection) {
try {
OutputStream outputToSocket = incomingConnection.getOutputStream();
InputStream inputFromSocket = incomingConnection.getInputStream();
//读socket,我们把服务器的文件路径写入了的
BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));
FileReader fileReader = new FileReader(new File(streamReader.readLine()));
BufferedReader bufferedFileReader = new BufferedReader(fileReader);
//写socket
PrintWriter streamWriter = new PrintWriter(outputToSocket);
String line = null;
while((line=bufferedFileReader.readLine())!=null){
streamWriter.println(line);
}
fileReader.close();
//如果您在关闭streamWriter之前关闭streamReader,
//则您可以往Socket写任何东西,但却没有任何数据能通过通道(通道被关闭了)
streamWriter.close();
streamReader.close();
}
catch(Exception e) {
System.out.println("Error handling a client: "+e);
e.printStackTrace();
}
}
public static void main(String args[]) {
RemoteFileServer server = new RemoteFileServer(1001);
server.acceptConnections();
}
}
(2)Client端
import java.io.*;
import java.net.*;
/**
* 用您想连接的机器的 IP 地址和端口实例化 Socket。
* 获取 Socket 上的流以进行读写。
* 把流包装进 BufferedReader/PrintWriter 的实例,如果这样做能使事情更简单的话。
* 对 Socket 进行读写。
* 关闭打开的流。
* @author Administrator
*/
public class RemoteFileClient {
protected BufferedReader socketReader;
protected PrintWriter socketWriter;
protected String hostIp;
protected int hostPort;
/**
* 构造方法
*/
public RemoteFileClient(String hostIp, int hostPort) {
this.hostIp = hostIp;
this.hostPort=hostPort;
}
/**
* 向服务器请求文件的内容,告诉服务器我们想要什么文件并在服务器传回其内容时接收该内容
*/
public String getFile(String fileNameToGet) {
StringBuffer fileLines = new StringBuffer();
try {
socketWriter.println(fileNameToGet);
socketWriter.flush();
String line = null;
while((line=socketReader.readLine())!=null)
fileLines.append(line+"\n");
}
catch(IOException e) {
System.out.println("Error reading from file: "+fileNameToGet);
}
return fileLines.toString();
}
/**
* 连接到远程服务器,创建我们的 Socket 并让我们访问该套接字的流
*/
public void setUpConnection() {
try {
Socket client = new Socket(hostIp,hostPort);
socketReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
socketWriter = new PrintWriter(client.getOutputStream());
}
catch(UnknownHostException e) {
System.out.println("Error1 setting up socket connection: unknown host at "+hostIp+":"+hostPort);
}
catch(IOException e) {
System.out.println("Error2 setting up socket connection: "+e);
}
}
/**
* 使用完毕连接后负责“清除”。
*/
public void tearDownConnection() {
try {
socketWriter.close();
socketReader.close();
}catch(IOException e) {
System.out.println("Error tearing down socket connection: "+e);
}
}
public static void main(String args[]) {
RemoteFileClient remoteFileClient = new RemoteFileClient("127.0.0.1",1001);
remoteFileClient.setUpConnection();
StringBuffer fileContents = new StringBuffer();
fileContents.append(remoteFileClient.getFile("D:/test.txt"));
//remoteFileClient.tearDownConnection();
System.out.println(fileContents);
}
}