Java请使用Socket类、ServerSocket类等编写一个套接字程序。服务器端提供报时服务:当客户端发送出“几点了?”,服务器端向客户端返回“15:40”;若客户端发送“今天是几号?”,服务器端向客户端返回“5月22日”;若客户端发送“今天是星期几?”,服务器端向客户端返回“星期一”;客户端收到数据后将在命令行窗口中显示收到的时间信息;当客户端发送“再见”时,则服务器端结束对该客户端的服务;服务器端可以同时与多个客户端建立连接,并为它们提供报时服务。 提示:请采用恰当的流类型实现数据的收发;服务器端若同时服务多个客户端应采用多线程技术;结束对某个客户的服务可以通过关闭socket对象实现。 可先完成服务器端为单一客户端提供服务的代表编写,完成后再加入多线程以完善代码。
时间: 2023-09-22 13:05:41 浏览: 87
好的,这是一个简单的Java套接字程序,实现了服务器端提供报时服务和客户端的交互:
服务器端代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TimeServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("Server started.");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected.");
ClientHandler handler = new ClientHandler(clientSocket);
new Thread(handler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
private BufferedReader in;
private PrintWriter out;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
try {
this.in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
this.out = new PrintWriter(clientSocket.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String request, response;
while ((request = in.readLine()) != null) {
System.out.println("Client request: " + request);
if ("几点了?".equals(request)) {
response = getTime();
} else if ("今天是几号?".equals(request)) {
response = getDate();
} else if ("今天是星期几?".equals(request)) {
response = getWeekday();
} else if ("再见".equals(request)) {
break;
} else {
response = "Invalid request.";
}
out.println(response);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
System.out.println("Client disconnected.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
private String getTime() {
// 返回当前时间
return "15:40";
}
private String getDate() {
// 返回当前日期
return "5月22日";
}
private String getWeekday() {
// 返回当前星期几
return "星期一";
}
}
```
客户端代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class TimeClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8000);
System.out.println("Connected to server.");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("Input your request: ");
String request = scanner.nextLine();
out.println(request);
String response = in.readLine();
System.out.println("Server response: " + response);
if ("再见".equals(request)) {
break;
}
}
socket.close();
System.out.println("Disconnected from server.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这个程序可以同时服务多个客户端,每个客户端可以发送不同的请求,服务器会根据请求返回对应的响应。客户端收到响应后,会在命令行窗口中显示收到的时间信息。当客户端发送“再见”时,服务器端会结束对该客户端的服务。
客户端和服务器端的通信使用了BufferedReader和PrintWriter来实现数据的收发。服务器端采用了多线程技术,可以同时为多个客户端提供服务。
阅读全文