(1)Server端
- 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();
- }
- }
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);
- }
- }