socket可以使用tcp和udp通信,下面我简单介绍一下socket用于tcp通信。
服务器界面:
服务器代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace socket通信tcp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// 服务器端的Socket对象
Socket socketServer;
// 用于取消异步任务的令牌源
CancellationTokenSource cts;
// 连接的客户端Socket对象
Socket client;
private void button1_Click(object sender, EventArgs e)
{
// 创建一个基于IPv4、流模式(面向连接)和TCP协议的Socket
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 将IP地址解析为IPv4地址对象
IPAddress iPAddress = IPAddress.Parse("127.0.0.1");
// 创建一个IP端点,包含IP地址和端口号
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 8888);
// 将服务器端的Socket绑定到指定的IP端点
socketServer.Bind(iPEndPoint);
// 开始监听客户端连接请求,参数10表示最大挂起连接数
socketServer.Listen(10);
// 显示消息框提示连接成功
MessageBox.Show("连接成功");
// 在后台线程中执行监听方法
Task.Run(new Action(() =>
{
Listen(socketServer);
}));
}
private void Listen(object obj)
{
// 创建一个取消令牌源
cts = new CancellationTokenSource();
// 将传入的对象转换为Socket类型,代表服务器端的Socket
Socket server = obj as Socket;
// 接受客户端连接,返回客户端的Socket对象
client = server.Accept();
try
{
// 只要没有请求取消,就持续循环
while (!cts.IsCancellationRequested)
{
// 创建一个长度为1024的字节数组用于接收数据
byte[] buffer = new byte[1024];
// 接收客户端发送的数据,并返回接收到的字节数
int len = client.Receive(buffer);
// 如果接收到的字节数为0,表示客户端断开连接
if (len == 0)
{
return;
}
else
{
// 将接收到的字节数组转换为UTF-8编码的字符串
string str = Encoding.UTF8.GetString(buffer);
// 在UI线程上更新标签的文本内容
Invoke(new Action(() =>
{
label1.Text = str;
}));
}
}
}
catch (Exception ex)
{
// 捕获异常,但这里没有具体的异常处理逻辑
}
}
private void button2_Click(object sender, EventArgs e)
{
// 如果有连接的客户端
if (client!= null)
{
// 获取文本框中的字符串
string str = textBox1.Text;
// 将字符串转换为UTF-8编码的字节数组
byte[] buffer = Encoding.UTF8.GetBytes(str);
// 将字节数组发送给客户端
client.Send(buffer);
}
else
{
// 如果没有连接的客户端,显示消息框提示
MessageBox.Show("没有连接客户端");
}
}
private void button3_Click(object sender, EventArgs e)
{
// 创建一个新的Form2实例并显示
Form2 form = new Form2();
form.Show();
}
}
}
客户端界面:
客户端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace socket通信tcp
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
// 客户端的 Socket 对象
Socket client;
private void button1_Click(object sender, EventArgs e)
{
// 创建一个基于 IPv4、流模式(面向连接)和 TCP 协议的 Socket
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 将 IP 地址解析为 IPv4 地址对象
IPAddress iPAddress = IPAddress.Parse("127.0.0.1");
// 创建一个 IP 端点,包含 IP 地址和端口号
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 8888);
// 连接到服务器
client.Connect(iPEndPoint);
// 在后台线程中执行监听方法
Task.Run(Listen);
}
private void Listen()
{
try
{
// 持续循环接收服务器消息
while (true)
{
// 创建一个长度为 1024 的字节数组用于接收数据
byte[] buffer = new byte[1024];
// 接收服务器发送的数据,并返回接收到的字节数
int len = client.Receive(buffer);
// 将接收到的字节数组转换为 UTF-8 编码的字符串
string str = Encoding.UTF8.GetString(buffer, 0, len);
// 在 UI 线程上更新标签的文本内容
Invoke(new Action(() =>
{
label1.Text = str;
}));
}
}
catch (Exception ex)
{
// 捕获异常,但这里没有具体的异常处理逻辑
}
}
private void button2_Click(object sender, EventArgs e)
{
// 获取文本框中的字符串
string str = textBox1.Text;
// 将字符串转换为 UTF-8 编码的字节数组
byte[] buffer = Encoding.UTF8.GetBytes(str);
// 将字节数组发送给服务器
client.Send(buffer);
}
}
}