251 lines
8.7 KiB
C#
251 lines
8.7 KiB
C#
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();
|
|
}
|
|
}
|
|
} |