编写C#聊天程序后台及前台,,包含发送文本消息、发送图片、发送小文件、抖动等功能;
时间: 2023-07-10 21:03:19 浏览: 154
以下是一个简单的C#聊天程序后台及前台代码示例,包含发送文本消息、发送图片、发送小文件、抖动等功能:
后台代码:
```csharp
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ChatServer
{
public class Server
{
private static readonly List<Client> clients = new List<Client>();
private static readonly TcpListener listener = new TcpListener(IPAddress.Any, 8888);
public static void Start()
{
listener.Start();
Console.WriteLine("Server started. Listening for connections...");
while (true)
{
TcpClient tcpClient = listener.AcceptTcpClient();
Client client = new Client(tcpClient);
clients.Add(client);
Console.WriteLine($"Client connected: {client.EndPoint}");
Thread thread = new Thread(() => HandleClient(client));
thread.Start();
}
}
private static void HandleClient(Client client)
{
NetworkStream stream = client.TcpClient.GetStream();
byte[] buffer = new byte[4096];
int bytesRead;
while (true)
{
try
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (message.StartsWith("/send "))
{
string[] parts = message.Substring(6).Split(new[] { "|||" }, StringSplitOptions.None);
string messageType = parts[0];
string messageContent = parts[1];
switch (messageType)
{
case "text":
Broadcast($"{client.UserName}: {messageContent}");
break;
case "image":
Broadcast($"{client.UserName} sent an image.");
break;
case "file":
Broadcast($"{client.UserName} sent a file.");
break;
}
}
else if (message.StartsWith("/shake"))
{
Shake(client);
}
else if (message.StartsWith("/quit"))
{
Console.WriteLine($"Client disconnected: {client.EndPoint}");
clients.Remove(client);
Broadcast($"{client.UserName} has left the chat.");
break;
}
else
{
Console.WriteLine($"Received message from {client.EndPoint}: {message}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
clients.Remove(client);
Broadcast($"{client.UserName} has left the chat.");
break;
}
}
}
private static void Broadcast(string message)
{
byte[] buffer = Encoding.UTF8.GetBytes(message);
foreach (Client client in clients)
{
client.TcpClient.GetStream().Write(buffer, 0, buffer.Length);
}
}
private static void Shake(Client client)
{
byte[] buffer = Encoding.UTF8.GetBytes("/shake");
client.TcpClient.GetStream().Write(buffer, 0, buffer.Length);
}
}
public class Client
{
public TcpClient TcpClient { get; }
public string EndPoint => TcpClient.Client.RemoteEndPoint.ToString();
public string UserName { get; set; }
public Client(TcpClient tcpClient)
{
TcpClient = tcpClient;
}
}
}
```
前台代码:
```csharp
using System;
using System.Drawing;
using System.IO;
using System.Net.Sockets;
using System.Windows.Forms;
namespace ChatClient
{
public partial class MainForm : Form
{
private readonly TcpClient client;
private readonly NetworkStream stream;
private readonly byte[] buffer = new byte[4096];
public MainForm()
{
InitializeComponent();
client = new TcpClient("localhost", 8888);
stream = client.GetStream();
SendUserName();
StartListening();
}
private void SendUserName()
{
string userName = Prompt.ShowDialog("Enter your name:", "Chat Room");
byte[] buffer = Encoding.UTF8.GetBytes(userName);
stream.Write(buffer, 0, buffer.Length);
}
private void StartListening()
{
stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, null);
}
private void ReadCallback(IAsyncResult ar)
{
int bytesRead = stream.EndRead(ar);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (message.StartsWith("/shake"))
{
Shake();
}
else
{
AppendMessage(message);
}
}
StartListening();
}
private void SendMessage(string messageType, string messageContent)
{
string message = $"/send {messageType}|||{messageContent}";
byte[] buffer = Encoding.UTF8.GetBytes(message);
stream.Write(buffer, 0, buffer.Length);
}
private void AppendMessage(string message)
{
if (InvokeRequired)
{
Invoke(new Action(() => AppendMessage(message)));
}
else
{
chatTextBox.AppendText(message + Environment.NewLine);
}
}
private void Shake()
{
if (InvokeRequired)
{
Invoke(new Action(() => Shake()));
}
else
{
Point originalLocation = Location;
Random random = new Random();
for (int i = 0; i < 10; i++)
{
int offsetX = random.Next(-5, 6);
int offsetY = random.Next(-5, 6);
Location = new Point(originalLocation.X + offsetX, originalLocation.Y + offsetY);
System.Threading.Thread.Sleep(50);
}
Location = originalLocation;
}
}
private void sendButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(messageTextBox.Text))
{
return;
}
if (imageRadioButton.Checked)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Image files (*.jpg, *.jpeg, *.png, *.gif) | *.jpg; *.jpeg; *.png; *.gif";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string fileName = Path.GetFileName(openFileDialog.FileName);
using (FileStream fileStream = new FileStream(openFileDialog.FileName, FileMode.Open))
{
using (BinaryReader binaryReader = new BinaryReader(fileStream))
{
byte[] fileData = binaryReader.ReadBytes((int)fileStream.Length);
SendMessage("image", $"{fileName}|||{Convert.ToBase64String(fileData)}");
}
}
}
}
else if (fileRadioButton.Checked)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string fileName = Path.GetFileName(openFileDialog.FileName);
using (FileStream fileStream = new FileStream(openFileDialog.FileName, FileMode.Open))
{
using (BinaryReader binaryReader = new BinaryReader(fileStream))
{
byte[] fileData = binaryReader.ReadBytes((int)fileStream.Length);
SendMessage("file", $"{fileName}|||{Convert.ToBase64String(fileData)}");
}
}
}
}
else
{
SendMessage("text", messageTextBox.Text);
}
messageTextBox.Clear();
messageTextBox.Focus();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes("/quit");
stream.Write(buffer, 0, buffer.Length);
}
}
public static class Prompt
{
public static string ShowDialog(string text, string caption)
{
Form prompt = new Form();
prompt.StartPosition = FormStartPosition.CenterScreen;
prompt.Size = new Size(300, 150);
prompt.Text = caption;
Label textLabel = new Label() { Left = 20, Top = 20, Text = text };
TextBox textBox = new TextBox() { Left = 20, Top = 50, Width = 250 };
Button okButton = new Button() { Text = "OK", Left = 150, Top = 80, Width = 75, DialogResult = DialogResult.OK };
okButton.Click += (sender, e) => prompt.Close();
prompt.Controls.Add(textLabel);
prompt.Controls.Add(textBox);
prompt.Controls.Add(okButton);
prompt.AcceptButton = okButton;
return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : "";
}
}
}
```
使用方法:
1. 运行ChatServer.exe启动服务器;
2. 运行ChatClient.exe启动客户端;
3. 在客户端输入用户名并按下Enter键;
4. 在客户端输入消息并按下Send按钮,或选择发送图片或小文件;
5. 如果想抖动窗口,可以在客户端按下Shake按钮。
注意:该代码示例为演示用途,没有进行安全性和健壮性方面的优化,仅适用于学习和测试。在实际应用中,需要进行更多的检查和处理,以确保程序的安全和稳定。
阅读全文