客户端实现与服务器端的socket连接发送和接收相应的字符串。设计一个服务器端实现与客户端的socket连接发送和接收相应的字符串;实现连接和查询数据库的功能检索某用户名和密码是否为数据库中已经存储的值。维护一个小型数据库可以采用Mysql数据库仅包含两个字段:用户名密码;保存已经认证的用户名和密码值对。用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;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Server {
private static final int PORT = 12345; // 端口号
private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; // 数据库URL
private static final String DB_USER = "root"; // 数据库用户名
private static final String DB_PASSWORD = "root"; // 数据库密码
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept(); // 等待客户端连接
System.out.println("客户端已连接:" + socket.getInetAddress().getHostAddress());
new Thread(new ClientHandler(socket)).start(); // 创建一个新线程处理客户端请求
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 处理客户端请求的线程类
private static class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
String request = in.readLine(); // 读取客户端请求
String[] tokens = request.split(":"); // 请求格式为 "username:password"
String username = tokens[0];
String password = tokens[1];
if (authenticate(username, password)) { // 验证用户名和密码是否正确
out.println("认证成功!");
} else {
out.println("认证失败!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 验证用户名和密码是否正确
private boolean authenticate(String username, String password) {
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username=? AND password=?")) {
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
return rs.next(); // 如果查询结果非空,则认证成功
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
}
客户端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
private static final String SERVER_ADDRESS = "localhost"; // 服务器地址
private static final int SERVER_PORT = 12345; // 服务器端口号
public static void main(String[] args) {
try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
String username = "alice";
String password = "123456";
out.println(username + ":" + password); // 发送认证请求
String response = in.readLine(); // 读取服务器响应
System.out.println(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/cQ9n 著作权归作者所有。请勿转载和采集!