编写C#聊天程序后台及前台,,包含发送文本消息、发送图片、发送小文件、抖动等功能;

时间: 2023-07-10 12:03:19 浏览: 61
以下是一个简单的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按钮。 注意:该代码示例为演示用途,没有进行安全性和健壮性方面的优化,仅适用于学习和测试。在实际应用中,需要进行更多的检查和处理,以确保程序的安全和稳定。

相关推荐

最新推荐

recommend-type

微信小程序支付之c#后台实现方法

主要介绍了微信小程序支付之c#后台实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
recommend-type

C#使用Socket实现发送和接收图片的方法

主要介绍了C#使用Socket实现发送和接收图片的方法,涉及C#操作socket发送与接收文件的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

C#中在WebClient中使用post发送数据实现方法

主要介绍了C#中在WebClient中使用post发送数据实现方法,需要的朋友可以参考下
recommend-type

C#实现发送简单HTTP请求的方法

主要介绍了C#实现发送简单HTTP请求的方法,涉及C#操作http的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

C#使用Socket发送和接收TCP数据实例

主要介绍了C#使用Socket发送和接收TCP数据的实现方法,以实例的形式详细讲述了C#实现socket通信的完整实现过程,非常具有实用价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。