diff --git a/CS3.1.cs b/CS3.1.cs new file mode 100644 index 0000000..cbdd615 --- /dev/null +++ b/CS3.1.cs @@ -0,0 +1,251 @@ +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(); + } + } +} \ No newline at end of file