专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-963-0016
微信咨询
|
联系我们
扫二维码关注公众号
网站首页
网站建设
短视频
网站推广
网站模板
客户案例
资讯动态
关于我们
网站首页
网站建设
短视频
网站推广
网站模板
客户案例
资讯动态
关于我们
位置:
网站建设
>
技术支持
> .NET平台下C#的Socket通信
.NET平台下C#的Socket通信
来源:网络整理 时间:2023/2/14 1:00:48 共
3696
浏览
一、什么是Socket?(what?)
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。
简单也可以理解客户端和服务端之间的通信。
二、socket连接原理?(how?)
服务器监听:服务器端socket并不定位具体的客户端socket,而是处于等待监听状态,实时监控网络状态。
客户端请求:客户端clientSocket发送连接请求,目标是服务器的serverSocket。为此,clientSocket必须知道serverSocket的地址和端口号,进行扫描发出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
异步通信,简单来说就是服务器端和客户端可以进行多次互发信息的通信而不用担心通道会关闭。
连接过程图示:
三、C#代码实现(很简单的demo,没有考虑其他可能出现的通信问题,比如连接超时等)
客户端代码:
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
private string getServerMessage(string customerId)
{
//设定服务器IP地址
var serverIP = "127.0.0.1";
var serverPort ="8888";
IPAddress ip = IPAddress.Parse(serverIP);
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//服务器连接成功
clientSocket.Connect(new IPEndPoint(ip, serverPort)); //配置服务器IP与端口
}
catch
{
return "连接服务器失败!";
}
var recStr = "";
try
{
//发送数据
var sendCustomerId = customerId;
byte[] sendBytes = Encoding.UTF8.GetBytes(sendCustomerId);
clientSocket.Send(sendBytes);
//接收数据, 注意编码格式
byte[] resBytes = new byte[1024];
int bytes = clientSocket.Receive(resBytes, resBytes.Length, 0);
recStr += Encoding.UTF8.GetString(resBytes, 0, bytes);
}
catch
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
recStr = "接收消息失败";
}
//返回数据
return recStr;
}
服务端代码:
class Program
{
private static byte[] result = new byte[1024];
private static int myProt = 8888; //端口
static Socket serverSocket;
static void Main(string[] args)
{
//服务器IP地址
IPAddress ip = IPAddress.Parse("127.0.0.1");
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, myProt));//绑定IP地址:端口
serverSocket.Listen(10); //设定最多10个排队连接请求
Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
//通过Clientsoket发送数据
Thread myThread = new Thread(ListenClientConnect);
myThread.Start();
Console.ReadLine();
}
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect()
{
while (true)
{
Socket clientSocket = serverSocket.Accept();
Thread receiveThread = new Thread(ReceiveMessage);
clientSocket.Send(Encoding.GetEncoding("GBK").GetBytes("00000124SX27|1529"));
receiveThread.Start(clientSocket);
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocket.Receive(result);
Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.GetEncoding("GBK").GetString(result, 0, receiveNumber));
Console.WriteLine("返回数据");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
}
}
}
四、遇到的问题
中文乱码::一般UTF-8,客户端和服务端的编码格式要一致,否则就会乱码
这样可以自定义编码格式:recStr += Encoding.GetEncoding("gbk").GetString(resBytes, 0, bytes);
参考链接:
https://baike.baidu.com/item/socket/281150?fr=aladdin
https://www.cnblogs.com/ysyn/p/3399351.html
版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
相关主题:
网页设计的好看作品图片
饮料网页设计免费版下载
福建企业培训网页设计公司
茶叶素材网页设计案例图
文体协会网页设计培训课程
安徽景区网页设计招聘网
视传网页设计手绘图片
英语电影网页设计案例模板
网页设计雪糕视频教程全集
科技网页插画设计公司招聘
·上一条:
windows下 安装RabbitMQ 及操作常用命令
|
·下一条:
使用nginx部署Vue项目,刷新出现404
同类资讯
windows下 安装RabbitMQ 及操作常用命令
窗体操作标记帮助程序
Blazor 的 NavLink 的 NavLinkMatch.Pref
@inject在 ASP.NET Core 中将依赖项注入到视图
c#Task.FromResult 的使用
c# 使用Enumerable.Range 打印数字0到9
使用Blazor构建web应用程序 .NET 6篇 上
使用Blazor构建web应用程序 .NET 6篇 中
依赖注入之Autofac使用总结
Asp.NetCore3.1开源项目升级为.Net6.0
小学1-6年级数学公式大全
《进击吧!Blazor!》系列入门教程 第一章 3.页面制作
《进击吧!Blazor!》系列入门教程 第一章 4.数据交互
《进击吧!Blazor!》系列入门教程 第一章 5.组件开发
《进击吧!Blazor!》系列入门教程 第一章 6.安全
《进击吧!Blazor!》系列入门教程 第一章 7.图表
Blazor ——在 MVC 项目中兼容 Blazor 开发的组件
ASP.NET Core Blazor 初探之 Blazor Serve
ASP.NET MVC3 Razor引擎中RenderBody,Rend
ASP.NET Core 中的环境标记帮助程序
资讯动态
公司新闻
互联网资讯
电商资讯
优化推广
技术支持
关于我们
公司简介
企业文化
服务项目
公司新闻
服务项目
网站建设
网站推广
品牌策划
移动应用
服务支持
在线咨询
服务流程
产品报价
售后服务
联系我们
代理加盟
付款方式
在线留言
联系方式
联系方式
电话:400-963-0016
邮箱:sales@itwy.com
QQ:250211130
微信:18520775521
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有
粤ICP备16019765号
广州京杭网络科技有限公司 版权所有
18520775521
QQ洽谈
sales@itwy.com