添加 CS3.1.cs
This commit is contained in:
parent
cf593e52ad
commit
5c72078ab5
251
CS3.1.cs
Normal file
251
CS3.1.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user