当前位置: 代码网 > it编程>编程语言>C# > C#使用Socket实现通信的方法示例

C#使用Socket实现通信的方法示例

2024年07月03日 C# 我要评论
前言文章按照 socket 的 创建、连接、传输数据、释放资源的过程来写。给出方法、参数的详细信息。一、socket 对象无论是服务器还是客户端,都要创建一个 socket 对象,创建方法一致。以下是

前言

文章按照 socket 的 创建、连接、传输数据、释放资源的过程来写。给出方法、参数的详细信息。

一、socket 对象

无论是服务器还是客户端,都要创建一个 socket 对象,创建方法一致。

以下是常见的socket对象创建实例

socket s = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
//监控 ip4 地址,套接字类型为 tcp ,协议类型为 tcp

其有三个构造函数

public socket(socketinformation socketinformation);
public socket(sockettype sockettype, protocoltype protocoltype);
public socket(addressfamily addressfamily, sockettype sockettype, protocoltype protocoltype);

第一个构造函数,socketinformation 对象保存的是

socket(sockettype, protocoltype)

实质上跟第二个构造函数是一样的。就好像你可以直接把( 一个苹果 , 一个梨)直接放进篮子,也可以先给 水果包装好 再放进篮子里。

下面将解释所有参数的意义。

sockettype

指定 socket 类的实例表示的套接字类型。

tcp 用主机的ip地址加上主机上的端口号作为 tcp 连接的端点,这种端点就叫做套接字(socket)或插口。 套接字用(ip地址:端口号)表示。

sockettype 是enum 类型,其字段如下

在这里插入图片描述

protocoltype

表示协议类型,是一个enum 类型。

其所有字段如下

在这里插入图片描述

addressfamily

表示使用的网络寻址方案,是一个 enum 类型。

在这里插入图片描述

在这里插入图片描述

二、bind() 绑定与 connect() 连接

bind() 用于绑定ipendpoint 对象,在服务端使用。

connect() 在客户端使用,用于连接服务端。

创建 socket 对象后,接着绑定本地socket / 连接服务端。

bind()

public void bind (system.net.endpoint localep);

使用方法

    socket serversocket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
    ipaddress ip = ipaddress.parse("127.0.0.1");
 
    //上面不重要,看下面
//ipendpoint ipendpoint = new ipendpoint(ip, 2300);
//serversocket.bind(ipendpoint);
 
   serversocket.bind(new ipendpoint(ip, 2300))

你将在在本地创建ipendpoint 对象,拥有此 ip:post 的访问权限。目的是绑定本地机器的某个端口,所有经过此端口的数据就归你管了。

connect()

与远程主机建立连接。connect() 有四个重载方法,不必关注,只需知道,必需提供 ip 和 post 两个值。

使用方法

    ipaddress ip = ipaddress.parse("127.0.0.1");
    ipendpoint ipendpoint = new ipendpoint(ip, 2300);
    socket serversocket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
 
//创建与远程主机的连接
    serversocket.connect(ipendpoint);

三、listen() 监听请求连接 和 accept() 接收连接请求

listen()

监控所有发送到此主机的、特点端口的连接请求。服务端使用,客户端不需要。

public void listen (int backlog);

使用 bind() 后,使用 listen() 方法进行监控,backlog 参数指定可排队等待接受的传入连接的数量,即挂起的连接队列的最大长度。

示例

serversocket.listen(10); //开始监听

accept()

accept() 以同步方式监听套接字,在连接请求队列中提取第一个挂起的连接请求,然后创建并返回一个新的 socket 对象。

代码示例

//创建终结点(endpoint)
ipaddress ip = ipaddress.any;             
ipendpoint ipe = new ipendpoint(ip, 8000);
 
//创建 socket 并开始监听
socket serversocket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
serversocket.bind(ipe);
serversocket.listen(10);//开始监听
 
//接受到client连接,为此连接建立新的socket,并接受信息
socket temp = serversocket.accept();//为新建连接创建新的socket
//关闭连接
temp.close();

注意的是,每次建立连接是一个 accept() 对象,如果你要进行 服务器-客户端互相通讯,应使用同一个 accept() 对象。每个 accept 对象都是 从客户端请求建立开始的,期间只要使用同一个 accept 对象,都可以进行数据传输。

四、receive() 与 send()

receive() 接收信息

send() 发送信息

在服务端和客户端都使用这两个方法。

receive()

使用示例

string recvstr = "";
byte[] recvbytes = new byte[1024];
int bytes;
bytes = temp.receive(recvbytes, recvbytes.length, 0);//从客户端接受信息
recvstr += encoding.ascii.getstring(recvbytes, 0, bytes);

直接从微软那复制来的。

在这里插入图片描述

参数

byte[] buffer

byte类型的数组,它是存储接收到的数据的位置。

int32 offset

buffer参数中的位置,用于存储所接收的数据。

int32 size

要接收的字节数。

socketflags socketflags

socketflags值的按位组合。

socketerror errorcode

一个socketerror对象,它存储套接字错误。

socketflags 默认值为0 或 none ,笔者没有搞懂socketflags 的应用场景。

返回

返回已成功读取的字节数。

send()

send()跟receive()用法相似,

示例代码如下

string str = "hello";
byte[] a = encoding.utf8.getbytes(str);
send = socket.send(a, 0);

发送/接收 都是使用 byte[] 字节流,所以接收时要进行转换。

五、释放资源

有 accept 释放和 socket 的释放。

accept 是连接对象,一个 socket 可能有数十个 accept 连接。

使用 shutdown( ) 方法可以 禁止 asscpt 对象的操作(禁用某个 socket 对象 的发送和接收)。

public void shutdown (system.net.sockets.socketshutdown how);

socketshutdown 是一个 enum 类型。

实例

temp.shutdown(socketshutdown.receive);//禁止接收

在这里插入图片描述

close()

会直接释放资源,accept 和 socket 对象都可以使用。使用后对象将彻底释放。

六、ipaddress 和ipendpoint

//引入
using system.net;

ipaddress 用来处理ip地址、转换ip地址

ipaddress.parse() 方法可以把以小数点隔分的十进制 ip 表示转化成 ipaddress 类。

ipaddress ip = ipaddress.parse("127.0.0.1");//把ip地址字符串转换为ipaddress类型的实例

ipaddress提供4个只读字段

any 用于代表本地系统可用的任何ip地址

broadcase用于代表本地网络的ip广播地址

loopback用于代表系统的回送地址

none用于代表系统上没有网络接口

ipendpoint 表示ipaddress对象与端口的绑定

ipaddress ip = ipaddress.any;              //把ip地址字符串转换为ipaddress类型的实例
ipendpoint ipe = new ipendpoint(ip, 8000);//用指定的端口和ip初始化ipendpoint类的新实例

上面的代码,创建一个监控点,端口是 8000,对象是 本地所有ip。

另外,此类能够获取查看端口的值范围,除此外,此类没有太大意义。

以上就是c#使用socket实现通信的方法示例的详细内容,更多关于c# socket通信的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com