实验目的:学会socket编程
要求:
1、实现语言不限(可以用C、Java、C#、Python等等,自由发挥)
2、实现两个程序:服务器端、客户端
2.1、服务器端程序,监听在8888端口,当客户端程序发出请求字符串:getdatetime时,返回当前服务器端机器的时间,格式为:yyyy-MM-dd HH:mm:ss
2.2、客户端程序,连接到服务器端程序,发出字符串:getdatetime,当接收到服务器端响应后,把返回的日期时间字符串显示在黑窗口中,退出
要实现一个简单的客户端-服务器端交互程序,使用Socket建立TCP连接,通过在服务器端监听8888端口,并接收客户端发来的请求字符串“getdatetime”来获取系统当前时间,并且返回给客户端,客户端程序连接到服务器端,发送完请求字符串后,接收来自服务器端返回的当前时间字符串并且在控制台打印出来。
服务器端
1、首先,我们先创建ServerSocket对象,并且指定服务器端口号为8888
ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8888); } catch (IOException e) { System.err.println("Could not listen on port: 8888."); System.exit(1); }
2、创建完Socket对象后,我们等待客户端连接。如果客户端连接成功,则创建输入输出流。
Socket clientSocket = null; PrintWriter out = null; BufferedReader in = null; try { clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } catch (IOException e) { System.err.println("Accept failed."); System.exit(1); }
3、读取客户端发来的请求字符串,如果请求字符串为‘getdatetime’,则获取当前时间并且通过输出流返回客户端
String inputLine; while ((inputLine = in.readLine()) != null) { if (inputLine.equals("getdatetime")) { out.println(java.time.LocalDateTime.now()); } }
4、最后要记得关闭输入输出流和Socket连接
out.close(); in.close(); clientSocket.close(); serverSocket.close();
客户端程序
1、创建Socket对象,指定服务器的IP地址和端口号
Socket clientSocket = null; try { clientSocket = new Socket("localhost", 8888); } catch (UnknownHostException e) { System.err.println("Don't know about host: localhost."); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: localhost."); System.exit(1); }
2、创建输入输出流
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
3、发送请求字符串到服务器端
out.println("getdatetime");
4、读取从服务器端返回的当前的时间字符串并且打印到控制台上
String userInput; while ((userInput = in.readLine()) != null) { System.out.println(userInput); break; }
5、关闭输入输出流和Socket连接
out.close(); in.close(); clientSocket.close();
注意:
在运行时需要先启动服务器端程序,然后再启动客户端程序。当服务器端程序结束时,这个时候打开客户端会出现Couldn't get I/O for the connection to: localhost.
因为在同一个电脑上运行,是典型的P-P。要在eclipse中同时运行两个程序。