C# 用Socket写一个点对点通信,要求客户端既是服务端又是服务端,界面上有连接按钮,断开按钮,发送按钮,两个RichTextBox控件,

时间: 2023-06-14 17:08:06 浏览: 61
以下是基于C#的Socket编写点对点通信的代码,客户端既是服务端又是服务端,具有连接、断开、发送等功能,界面上有连接按钮、断开按钮、发送按钮和两个RichTextBox控件: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace P2PCommunicate { public partial class Form1 : Form { private Socket _serverSocket; // 服务端Socket private Socket _clientSocket; // 客户端Socket private Thread _serverThread; // 服务端线程 private Thread _clientThread; // 客户端线程 private bool _isServerStarted; // 服务端是否已启动 private bool _isClientStarted; // 客户端是否已启动 private string _serverIp = "127.0.0.1"; // 服务端IP地址 private int _serverPort = 8888; // 服务端端口号 private string _clientIp = "127.0.0.1"; // 客户端IP地址 private int _clientPort = 8889; // 客户端端口号 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { UpdateUI(true); } private void btnConnect_Click(object sender, EventArgs e) { if (!_isClientStarted) { _clientThread = new Thread(ClientThreadFunc); _clientThread.Start(); } else { MessageBox.Show("客户端已经连接!", "提示"); } } private void btnDisconnect_Click(object sender, EventArgs e) { if (_isClientStarted) { _clientSocket.Close(); _clientThread.Abort(); _isClientStarted = false; UpdateUI(false); } else { MessageBox.Show("客户端未连接!", "提示"); } } private void btnSend_Click(object sender, EventArgs e) { if (_isClientStarted) { SendMessage(txtSend.Text); txtSend.Clear(); } else { MessageBox.Show("客户端未连接!", "提示"); } } private void ServerThreadFunc() { try { _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _serverSocket.Bind(new IPEndPoint(IPAddress.Parse(_serverIp), _serverPort)); _serverSocket.Listen(10); while (true) { Socket client = _serverSocket.Accept(); Thread receiveThread = new Thread(ReceiveThreadFunc); receiveThread.Start(client); } } catch (Exception ex) { MessageBox.Show("服务端异常:" + ex.Message, "错误"); } } private void ClientThreadFunc() { try { _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _clientSocket.Connect(new IPEndPoint(IPAddress.Parse(_clientIp), _clientPort)); Thread receiveThread = new Thread(ReceiveThreadFunc); receiveThread.Start(_clientSocket); _isClientStarted = true; UpdateUI(true); } catch (Exception ex) { MessageBox.Show("客户端异常:" + ex.Message, "错误"); } } private void ReceiveThreadFunc(object obj) { Socket socket = obj as Socket; byte[] buffer = new byte[1024]; while (true) { int length = socket.Receive(buffer); string message = Encoding.UTF8.GetString(buffer, 0, length); AppendText(txtReceive, string.Format("[{0:HH:mm:ss}] {1}", DateTime.Now, message)); } } private void SendMessage(string message) { byte[] buffer = Encoding.UTF8.GetBytes(message); _clientSocket.Send(buffer); AppendText(txtReceive, string.Format("[{0:HH:mm:ss}] {1}", DateTime.Now, message)); } private void AppendText(RichTextBox box, string text) { if (box.InvokeRequired) { box.Invoke(new Action<RichTextBox, string>(AppendText), box, text); } else { box.AppendText(text + Environment.NewLine); } } private void UpdateUI(bool isConnected) { btnConnect.Enabled = !isConnected; btnDisconnect.Enabled = isConnected; btnSend.Enabled = isConnected; txtSend.Enabled = isConnected; txtReceive.Enabled = isConnected; } } } ``` 在窗体设计中,需要添加一个连接按钮(btnConnect)、一个断开按钮(btnDisconnect)、一个发送按钮(btnSend)、一个发送文本框(txtSend)、一个接收文本框(txtReceive)和两个标签(lblServer、lblClient)。 注意:该程序中客户端和服务端使用的是不同的端口号,可以根据实际需要进行修改。

相关推荐

最新推荐

recommend-type

详解C# Socket简单例子(服务器与客户端通信)

主要介绍了详解C# Socket简单例子(服务器与客户端通信) ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
recommend-type

c#使用Socket发送HTTP/HTTPS请求的实现代码

主要介绍了c#使用Socket发送HTTP/HTTPS请求的实现代码,需要的朋友可以参考下
recommend-type

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

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

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

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

C#实现判断一个时间点是否位于给定时间区间的方法

主要介绍了C#实现判断一个时间点是否位于给定时间区间的方法,涉及C#针对时间的转换与判定相关技巧,需要的朋友可以参考下
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

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

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