添加 CS3.1.cs

This commit is contained in:
dzy 2025-06-02 12:15:30 +08:00
parent cf593e52ad
commit 5c72078ab5

251
CS3.1.cs Normal file
View File

@ -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<JsonElement>(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<JsonElement>(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<JsonElement>(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();
}
}
}