JAVA套接字(Socket)四 简单例子
一个简单示例
1. 背景
我们将在本部分讨论的示例将阐明在 Java 代码中如何使用 Socket 和 ServerSocket。客户机用Socket 连接到服务器。服务器用 ServerSocket 在端口 3000 侦听。客户机请求服务器 C: 驱动器上的文件内容。
为清楚起见,我们把示例分解成客户机端和服务器端。最后我们将把它们组合起来以使您能看到整体模样。
我们在使用 JDK 1.2 的 IBM VisualAge for Java 3.5 上开发这些代码。要自己创建这个示例,您应有完好的 JDK 1.1.7 或更高版本。客户机和服务器将只在一台机器上运行,所以您不必担心是否有一个可用的网络。
2. 创建 RemoteFileClient 类
这里是 RemoteFileClient 类的结构:
import java.io.*;import java.net.*;public class RemoteFileClient { protected String hostIp; protected int hostPort; protected BufferedReader socketReader; protected PrintWriter socketWriter; public RemoteFileClient(String aHostIp, int aHostPort) { hostIp = aHostIp; hostPort = aHostPort; } public static void main(String[] args) { } public void setUpConnection() { } public String getFile(String fileNameToGet) { } public void tearDownConnection() { }}public static void main(String[] args) { RemoteFileClient remoteFileClient = new RemoteFileClient("127.0.0.1", 3000); remoteFileClient.setUpConnection(); String fileContents = remoteFileClient.getFile("C:\\WINNT\\Temp\\RemoteFile.txt"); remoteFileClient.tearDownConnection(); System.out.println(fileContents);}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("Error setting up socket connection: unknown host at " + hostIp + ":" + hostPort); } catch (IOException e) { System.out.println("Error setting up socket connection: " + e); }}Socket client = new Socket(hostIp, hostPort);
socketReader = new BufferedReader(new InputStreamReader(client.getInputStream()));socketWriter = new PrintWriter(client.getOutputStream());
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();}StringBuffer fileLines = new StringBuffer();
socketWriter.println(fileNameToGet);socketWriter.flush();
String line = null;while ((line = socketReader.readLine()) != null) fileLines.append(line + "\n");
public void tearDownConnection() { try { socketWriter.close(); socketReader.close(); } catch (IOException e) { System.out.println("Error tearing down socket connection: " + e); }}import java.io.*;import java.net.*;public class RemoteFileClient { protected BufferedReader socketReader; protected PrintWriter socketWriter; protected String hostIp; protected int hostPort; public RemoteFileClient(String aHostIp, int aHostPort) { hostIp = aHostIp; hostPort = aHostPort; } 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(); } public static void main(String[] args) { RemoteFileClient remoteFileClient = new RemoteFileClient("127.0.0.1", 3000); remoteFileClient.setUpConnection(); String fileContents = remoteFileClient.getFile("C:\\WINNT\\Temp\\RemoteFile.txt"); remoteFileClient.tearDownConnection(); System.out.println(fileContents); } 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("Error setting up socket connection: unknown host at " + hostIp + ":" + hostPort); } catch (IOException e) { System.out.println("Error 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); } }}import java.io.*;import java.net.*;public class RemoteFileServer { protected int listenPort = 3000; public static void main(String[] args) { } public void acceptConnections() { } public void handleConnection(Socket incomingConnection) { }}public static void main(String[] args) { RemoteFileServer server = new RemoteFileServer(); server.acceptConnections();}public void acceptConnections() { try { ServerSocket server = new ServerSocket(listenPort); Socket incomingConnection = null; while (true) { incomingConnection = server.accept(); 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); }}public void handleConnection(Socket incomingConnection) { try { OutputStream outputToSocket = incomingConnection.getOutputStream(); InputStream inputFromSocket = incomingConnection.getInputStream(); BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket)); FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); PrintWriter streamWriter = new PrintWriter(incomingConnection.getOutputStream()); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); } fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); }} FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); }FileReader fileReader = new FileReader(new File(streamReader.readLine()));
BufferedReader bufferedFileReader = new BufferedReader(fileReader);
import java.io.*;import java.net.*;public class RemoteFileServer { int listenPort; public RemoteFileServer(int aListenPort) { listenPort = aListenPort; } public void acceptConnections() { try { ServerSocket server = new ServerSocket(listenPort); Socket incomingConnection = null; while (true) { incomingConnection = server.accept(); 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); } } public void handleConnection(Socket incomingConnection) { try { OutputStream outputToSocket = incomingConnection.getOutputStream(); InputStream inputFromSocket = incomingConnection.getInputStream(); BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket)); FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); PrintWriter streamWriter = new PrintWriter(incomingConnection.getOutputStream()); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); } fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } } public static void main(String[] args) { RemoteFileServer server = new RemoteFileServer(3000); server.acceptConnections(); }}