using System; using System.Net.Sockets; using System.Text; using System.Text.Json; using System.Threading; using System.Windows.Forms; namespace ChatClient { public partial class MainForm : Form { private TcpClient _client; private NetworkStream _stream; private Thread _receiveThread; private bool _isConnected = false; private string _username = ""; public MainForm() { InitializeComponent(); SetConnectionState(false); } private void SetConnectionState(bool connected) { _isConnected = connected; btnConnect.Enabled = !connected; btnDisconnect.Enabled = connected; btnLogin.Enabled = connected; btnRegister.Enabled = connected; btnSend.Enabled = connected && _username != ""; } private void btnConnect_Click(object sender, EventArgs e) { try { _client = new TcpClient(); _client.Connect("localhost", 8888); _stream = _client.GetStream(); _isConnected = true; _receiveThread = new Thread(ReceiveMessages); _receiveThread.IsBackground = true; _receiveThread.Start(); SetConnectionState(true); AddMessage("系统", "已连接到服务器"); } catch (Exception ex) { MessageBox.Show($"连接失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnDisconnect_Click(object sender, EventArgs e) { Disconnect(); } private void Disconnect() { if (_isConnected) { try { _isConnected = false; _client?.Close(); _stream?.Close(); _receiveThread?.Join(1000); } catch { } SetConnectionState(false); _username = ""; AddMessage("系统", "已断开连接"); } } private void btnLogin_Click(object sender, EventArgs e) { if (!_isConnected) return; var username = txtUsername.Text.Trim(); var password = txtPassword.Text; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { MessageBox.Show("用户名和密码不能为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { var loginData = new { type = "login", username = username, password = password }; var json = JsonSerializer.Serialize(loginData); var buffer = Encoding.UTF8.GetBytes(json); _stream.Write(buffer, 0, buffer.Length); // 等待响应 var responseBuffer = new byte[1024]; var bytesRead = _stream.Read(responseBuffer, 0, responseBuffer.Length); var responseJson = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead); var response = JsonSerializer.Deserialize(responseJson); if (response.TryGetProperty("status", out var status) && status.GetString() == "success") { _username = username; SetConnectionState(true); AddMessage("系统", $"登录成功,欢迎 {username}"); } else { var message = response.TryGetProperty("message", out var msg) ? msg.GetString() : "登录失败"; MessageBox.Show(message, "登录失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { MessageBox.Show($"登录时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); Disconnect(); } } private void btnRegister_Click(object sender, EventArgs e) { if (!_isConnected) return; var username = txtUsername.Text.Trim(); var password = txtPassword.Text; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { MessageBox.Show("用户名和密码不能为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { var registerData = new { type = "register", username = username, password = password }; var json = JsonSerializer.Serialize(registerData); var buffer = Encoding.UTF8.GetBytes(json); _stream.Write(buffer, 0, buffer.Length); // 等待响应 var responseBuffer = new byte[1024]; var bytesRead = _stream.Read(responseBuffer, 0, responseBuffer.Length); var responseJson = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead); var response = JsonSerializer.Deserialize(responseJson); if (response.TryGetProperty("success", out var success) && success.GetBoolean()) { MessageBox.Show("账号注册成功,请登录", "注册成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { var message = response.TryGetProperty("message", out var msg) ? msg.GetString() : "注册失败"; MessageBox.Show(message, "注册失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { MessageBox.Show($"注册时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); Disconnect(); } } private void btnSend_Click(object sender, EventArgs e) { if (!_isConnected || string.IsNullOrEmpty(_username)) return; var message = txtMessage.Text.Trim(); if (string.IsNullOrEmpty(message)) return; try { var chatData = new { type = "chat", message = message }; var json = JsonSerializer.Serialize(chatData); var buffer = Encoding.UTF8.GetBytes(json); _stream.Write(buffer, 0, buffer.Length); AddMessage(_username, message); txtMessage.Clear(); } catch (Exception ex) { MessageBox.Show($"发送消息失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); Disconnect(); } } private void ReceiveMessages() { var buffer = new byte[1024]; try { while (_isConnected && _client.Connected) { var bytesRead = _stream.Read(buffer, 0, buffer.Length); if (bytesRead == 0) break; var messageJson = Encoding.UTF8.GetString(buffer, 0, bytesRead); var message = JsonSerializer.Deserialize(messageJson); if (message.TryGetProperty("type", out var type)) { var messageType = type.GetString(); if (messageType == "chat") { var user = message.GetProperty("user").GetString(); var msg = message.GetProperty("message").GetString(); this.Invoke((MethodInvoker)delegate { AddMessage(user, msg); }); } } } } catch { } this.Invoke((MethodInvoker)Disconnect); } private void AddMessage(string user, string message) { txtChat.AppendText($"{user}: {message}{Environment.NewLine}"); txtChat.ScrollToCaret(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { Disconnect(); } } }