前言
文章按照 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通信的资料请关注代码网其它相关文章!
发表评论