我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#之Socket(套接字)通信

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#之Socket(套接字)通信

一、socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

二、套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

三、服务端

private void btnListen_Click(object sender, EventArgs e)
{
    IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网卡IP。本机端口查看netstat -an
    //服务端Socket定义
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Bind(point); //绑定IP
    socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个客户端,排队
    ShowMsg("服务器开始监听");

    Thread thread = new Thread(AcceptInfo);
    thread.Start(socket);

}

//记录通信用的Socket
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();

// private Socket client;
void AcceptInfo(object o)
{
    Socket socket = o as Socket;
    while (true)
    {
        //通信用socket
        try
        {
            Socket clientSocket = socket.Accept();//如果客户端有请求,生成一个新的Socket
            string point = clientSocket.RemoteEndPoint.ToString();
            ShowMsg(point + "连接客户端成功!");
            dic.Add(point, clientSocket);
            //接收消息
            Thread th = new Thread(ReceiveMsg);
            th.Start(clientSocket);
        }
        catch (Exception ex)
        {
            break;
        }
    }
    socket.Close();
}
//接收消息
void ReceiveMsg(object socket)
{
    Socket clientSocket = socket as Socket;
    while (true)
    {
        //接收客户端发送过来的数据
        try
        {
            //定义byte数组存放从客户端接收过来的数据
            byte[] buffer = new byte[1024 * 1024];
            
           int n = clientSocket.Receive(buffer);//将接收过来的数据放到buffer中,并返回实际接受数据的长度

            //将字节转换成字符串
            string words = Encoding.Unicode.GetString(buffer, 0, n);
            Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words);
            byte[] msg = Encoding.Unicode.GetBytes(words);
            clientSocket.Send(msg);//发送数据,字节数组
        }
        catch (Exception ex)
        {
            break;
        }
    }
    clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据
    clientSocket.Close();//关闭socket,释放资源
}

四、客户端

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连接到的服务端IP
clientSocket.Connect(point);//连接到服务器
ShowMsg("连接成功");
ShowMsg("服务器" + client.RemoteEndPoint.ToString());
ShowMsg("客户端:" + client.LocalEndPoint.ToString());
Thread th = new Thread(ReceiveMsg);//连接成功后,就可以接收服务器发送的信息了
th.IsBackground = true;
th.Start();

clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据
clientSocket.Close();//关闭socket,释放资源

五、Socket对象的成员

1、属性

名称说明
AddressFamily获取 Socket 的地址族。
Available获取已经从网络接收且可供读取的数据量。
Blocking获取或设置一个值,该值指示 Socket 是否处于阻止模式。
Connected获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。
Handle获取 Socket 的操作系统句柄。
LocalEndPoint获取本地终结点。
RemoteEndPoint获取远程终结点。
ProtocolType获取 Socket 的协议类型。
SocketType获取 Socket 的类型。
ReceiveBufferSize获取或设置一个值,它指定 Socket 接收缓冲区的大小。
ReceiveTimeout获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。
SendBufferSize获取或设置一个值,该值指定 Socket 发送缓冲区的大小。
SendTimeout获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。

2、方法

Accept

名称说明
Accept()为新建连接创建新的 Socket。
BeginAccept(AsyncCallback, Object)  开始一个异步操作来接受一个传入的连接尝试。
EndAccept(Byte[], IAsyncResult)异步接受传入的连接尝试,并创建新的 Socket 对象来处理远程主机通信。 此方法返回包含所传输的初始数据的缓冲区。
AcceptAsync(SocketAsyncEventArgs) 开始一个异步操作来接受一个传入的连接尝试。

Connect

名称说明
Connect(EndPoint)与远程主机建立连接。
BeginConnect(EndPoint, AsyncCallback, Object)开始一个对远程主机连接的异步请求。
EndConnect(IAsyncResult)结束挂起的异步连接请求。
ConnectAsync(SocketAsyncEventArgs)开始一个对远程主机连接的异步请求。

Disconnect

名称说明
Disconnect(Boolean)关闭套接字连接并允许重用套接字。
BeginDisconnect(Boolean, AsyncCallback, Object)开始异步请求从远程终结点断开连接。
EndDisconnect(IAsyncResult)结束挂起的异步断开连接请求。
DisconnectAsync(SocketAsyncEventArgs)关闭套接字连接并允许重用套接字。

Receive

名称说明
Receive(Byte[])从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。
BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)开始从连接的 Socket 中异步接收数据。
EndReceive(IAsyncResult)结束挂起的异步读取。
ReceiveAsync(SocketAsyncEventArgs)开始一个异步请求以便从连接的 Socket 对象中接收数据。

ReceiveFrom

名称说明
ReceiveFrom(Byte[], EndPoint)将数据报接收到数据缓冲区并存储终结点。
BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始从指定网络设备中异步接收数据。
EndReceiveFrom(IAsyncResult, EndPoint)结束挂起的、从特定终结点进行异步读取。
ReceiveFromAsync(SocketAsyncEventArgs)开始从指定网络设备中异步接收数据。

ReceiveMessageFrom

名称说明
ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation)使用指定的 SocketFlags 将指定字节数的数据接收到指定的数据缓冲区位置,并存储终结点和数据包信息。
BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,然后存储终结点和数据包信息。
EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation)结束挂起的、从特定终结点进行异步读取。 此方法还显示有关数据包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多信息。
ReceiveMessageFromAsync(SocketAsyncEventArgs)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,并存储终结点和数据包信息。

Send

名称说明
Send(Byte[])将数据发送到连接的 Socket。
BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)将数据异步发送到连接的 Socket。
EndSend(IAsyncResult)结束挂起的异步发送。
SendAsync(SocketAsyncEventArgs)将数据异步发送到连接的 Socket 对象。

SendFile

名称说明
SendFile(String)使用 Socket 传输标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。
BeginSendFile(String, AsyncCallback, Object)使用 Socket 标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。
EndSendFile(IAsyncResult)结束文件的挂起异步发送。

SendTo

名称说明
SendTo(Byte[], EndPoint)将数据发送到指定的终结点。
BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)以异步方式将数据发送到特定远程主机。
EndSendTo(IAsyncResult)结束挂起的、向指定位置进行的异步发送。
SendToAsync(SocketAsyncEventArgs)以异步方式将数据发送到特定远程主机。

其它

名称说明
Select(IList, IList, IList, Int32)确定一个或多个套接字的状态。
SendPacketsAsync(SocketAsyncEventArgs)将文件集合或者内存中的数据缓冲区以异步方法发送给连接的 Socket 对象。
Bind(EndPoint)使 Socket 与一个本地终结点相关联。
Listen(Int32)将 Socket 置于侦听状态。
CancelConnectAsync(SocketAsyncEventArgs)取消一个对远程主机连接的异步请求。
GetSocketOption(SocketOptionLevel, SocketOptionName)返回指定的 Socket 选项的值,表示为一个对象。
SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean)将指定的 Socket 选项设置为指定的 Boolean 值。
SetIPProtectionLevel(IPProtectionLevel)设置套接字的 IP 保护级别。
Shutdown(SocketShutdown)禁用某 Socket 上的发送和接收。
Close()关闭 Socket 连接并释放所有关联的资源。
Dispose()释放 Socket 类的当前实例所使用的所有资源。

到此这篇关于C#之Socket(套接字)通信的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#之Socket(套接字)通信

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python套接字socket通信在实现

本文小编为大家详细介绍“python套接字socket通信在实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“python套接字socket通信在实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、初步认识s
2023-06-29

Python实现socket库网络通信套接字

目录Socket网络通信套接字什么是套接字?地址簇套接字类型套接字的简单应用gethostbyname_ex()与gethostbyname()getservbyname()与getservbyport()getprotobyname()g
2022-06-02

C#如何实现基于Socket套接字的网络通信封装

小编给大家分享一下C#如何实现基于Socket套接字的网络通信封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!摘要之所以要进行Socket套接字通信库封装,主要
2023-06-21

python UDP套接字通信

UDPserver.py 1 import socket 2 #导入套接字模块 3 4 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 5 # - socket.AF_INET:IP
2023-01-30

C#之Socket通信怎么实现

这篇文章主要介绍“C#之Socket通信怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#之Socket通信怎么实现”文章能帮助大家解决问题。一、socket是什么Socket是应用层与TC
2023-06-30

Python3 网络套接字(socket

本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/72553736 以下代码以Python3.6.1为例 Less is more!socket
2023-01-31

面向对象之套接字(socket)和黏包

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端  基于UDP协议的socket  server端:import socketudp_sk = socket.socket(type=socket.SOCK_DGRAM)
2023-01-30

python基础之Socket套接字的示例分析

这篇文章给大家分享的是有关python基础之Socket套接字的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不
2023-06-14

Linux进程间通信——使用流套接字

前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程。通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socke
2022-06-04

C#怎么实现Socket通信

这篇文章给大家分享的是有关C#怎么实现Socket通信的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下: //创建socket对象 //第一个参数:设置网络寻址的协议、第二参数设置数据
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录