利用Socket类和ServerSocket类编写一个C/S程序,实现C/S通信。
- 要求:客户端向服务器发送请求给服务器,形式如“From 学号 姓名:what time is it ”;服务器接受到该字符串后将服务器当前时间返回给客户端,形式如“To 姓名:当前时间”;客户端向服务器发送“From 学号 姓名:Exit”命令,服务器向客户端返回“To 姓名:Bye”后退出。
- 代码:
服务器
//Server.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Server {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(1234); //与端口号为1234的客户端建立连接
System.out.println("Server Connecting...");
Socket socket = server.accept(); //等待客户端启动
System.out.println("Connected");
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); //打开输入流
PrintWriter os = new PrintWriter(socket.getOutputStream()); //打开输出流
String name = is.readLine(); //从客户端读取一行信息(客户端第一行信息为名字)
while (true) {
String str = is.readLine();
System.out.println(str);
if (str.contains("Exit")) { //如果接收到命令中含有Exit则结束通信过程
String answer = "Bye";
os.println("To "+name+": "+answer); //向客户端发送回复信息
os.flush();
break;
}
else if (str.contains("what time is it")) {
LocalTime time = LocalTime.now(); //获取当前时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); //按格式输出当前时间
os.println("To "+name+": "+time.format(formatter));
os.flush();
}
else {
String answer = "Enter 'Exit' to exit or 'what time is it' to get current time";
os.println("To "+name+": "+answer);
os.flush();
}
}
//关闭资源,先开后关
os.close();
is.close();
socket.close();
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端
//Client.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
private int id;
private String name;
public Client(int id, String name) {
this.id = id;
this.name = name;
}
public void start() {
try {
Socket socket = new Socket(InetAddress.getLocalHost(),1234); //创建连接本机1234端口的Socket对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); //打开输入流,用于接收服务器信息
PrintWriter os = new PrintWriter(socket.getOutputStream()); //打开输出流,用于给服务器发送信息
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client...");
os.println(name); //向服务器发送名字信息
while (true) {
String str = in.readLine(); //从键盘读取输入信息
os.println("From "+id+" "+name+": "+str); //给服务器发送信息
os.flush();
System.out.println(is.readLine()); //接收服务器信息
if (str.contains("Exit")) { //若指令中含有Exit则结束通信过程
break;
}
}
//关闭资源,先开后关
os.close();
is.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
启动客户端
//Client_Start.java
public class Client_Start {
public static void main(String[] args) {
Client c = new Client(2901,"Li Hua"); //创建Client对象,参数为学号和姓名
c.start(); //启动客户端
}
}
- 运行结果:
服务器:
客户端: