当前位置:编程学习 > asp >>

C#.net同步异步SOCKET通讯和多线程总结

同步套接字通信

Socket支持下的网上点对点的通信

服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能

服务器端建立一个socket,设置好本机的ip和监听的端口与socket进行绑定,开始监听连接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端进行通信。

客户端建立一个socket,设置好服务器端的IP和提供服务的端口,发出连接请求,接收到服务的确认后,尽力连接,开始与服务器进行通信。

服务器端和客户端的连接及它们之间的数据传送均采用同步方式。

 

Socket

Socket是tcp/ip网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个端点。在网络通信中需要两个主机或两个进程。通过网络传递数据,程序在网络对话的每一端需要一个socket。

       Tcp/IP传输层使用协议端口将数据传送给一个主机的特定应用程序,协议端口是一个应用程序的进程地址。传输层模块的网络软件模块要于另一个程序通信,它将使用协议端口,socket是运行在传输层的api,使用socket建立连接发送数据要指定一个端口给它。

Socket:

Stream Socket流套接字 Socket提供双向、有序、无重复的数据流服务,出溜大量的网络数据。

Dgram socket数据包套接字 支持双向数据流,不保证传输的可靠性、有序、无重复。

Row socket 原始套接字 访问底层协议

建立socket 用C#

命名空间:using System.Net;using System.Net.Socket;

构造新的socket对象:socket原型:

Public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType)

AddressFamily 用来指定socket解析地址的寻址方案。Inte.Network标示需要ip版本4的地址,Inte.NetworkV6需要ip版本6的地址

SocketType参数指定socket类型Raw支持基础传输协议访问,Stream支持可靠,双向,基于连接的数据流。

ProtocolType表示socket支持的网络协议

 

定义主机对象:

IPEndPoint类:IPEndPoint构造方法  位置:System.Net

原型:1)   public IPEndPoint(IPAddress address,int port)     2)public IPEndPoint(long address,int port) 参数1整型int64如123456,参数2端口int32

主机解析:

利用DNS服务器解析主机,使用Dns.Resolve方法

原型:public static IPHostEntry Resolve(string hostname) 参数:待解析的主机名称,返回IPHostEntry类值,IPHostEntry为Inte.Net主机地址信息提供容器,该容器提供存有IP地址列表,主机名称等。

Dns.GetHostByName获取本地主机名称

原型:public static IPHostEntry GetHostByName(string hostname)

GetHostByAddress

原型:1)public static IPHostEntry GetHostByAddress(IPAddress address) 参数:IP地址 2)public static IPHostEntry GetHostByAddress(string address) IP地址格式化字符串

 

端口绑定和监听:

同步套接字服务器主机的绑定和端口监听

Socket类的Bind(绑定主机),Listen(监听端口),Accept(接收客户端的连接请求)

Bind:原型:public void Bind(EndPoint LocalEP)参数为主机对象 IPEndPoint

Listen:原型:public void Listen(int backlog) 参数整型数值,挂起队列最大值

accept:原型:public socket accept() 返回为套接字对象

演示程序:

IPAddress myip=IPAddress.Parse(“127.0.0.1”);

IPEndPoint myserver=new IPEndPoint(myip,2020);

Socket sock=new Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);

Sock.Bind(myserver);

Sock.Listen(50);

Socket bbb=sock.Accept();

发送数据:方法1:socket类的send方法二.NetworkStream类Write

send原型:public int Send(byte[] buffer) 字节数组 

public int Send(byte[],SocketFlags)原型2说明,SocketFlags成员列表:DontRoute(不使用路由表发送),MaxIOVectorLength(为发送和接收数据的wsabuf结构数量提供标准值)None 不对次调用使用标志) OutOfBand(消息的部分发送或接收)Partial(消息的部分发送或接收) Peek(查看传入的消息)

原型三:public int Send(byte[],int,SocketFlags) 参数二要发送的字节数

原型四:public int Send(byte[],int,int,SocketFlags) 参数二为Byte[]中开始发送的位置

演示:

Socket bbb=sock.Accept();

Byte[] bytes=new Byte[64];

string send="aaaaaaaaaaaa";

bytes=System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());

bbb.Send(bytes,bytes.length,0);//将byte数组全部发送

.NetWordStream类的Write方法发送数据

原型:public override void write(byte[] buffer,int offset,int size) 字节数组,开始字节位置,总字节数

 

Socket bbb=sock.Accept();

.NetWorkStream stre=new NewWorkStream(bbb);

Byte[] ccc=new Byte[512];

string sendmessage="aaaaaaaaaaaaaa";

ccc=System.Text.Encoding.BigEndianUnicode.GetBytes(sendmessage);

stre.Write(ccc,0,ccc.length);

接收数据:Socket类Receive.NetworkStream类Read

Socket类Receive方法

原型:public int Receive(byte[] buffer)   

2)public int Receive(byte[],SocketFlags)

3)public int Receive(byte[],int,SocketFlags)   

4)public int Receive(byte[],int,int,SocketFlags)

.....

Socket bbb=sock.Accept();

........

Byte[] ccc=new Byte[512];

bbb.Receive(ccc,ccc.Length,0);

string rece=System.Text.Encoding.BigEndianUnicode.GetString(ccc);

richTextBox1.AppendText(rece+"/r/n");

 

.NetworkStream类的Read方法接收数据

public override int Read(int byte[] buffer,int offset,int size)

 

演示:bbb=sock.Accept();

.......

.NetworkStream stre=new.NetworkStream(bbb);

Byte[] ccc=new Byte[512];

stre.Read(ccc,0,ccc.Length);

string readMessage=System.Text.Encoding.BigEndianUnicode.GetString(ccc);

线程

线程创建:System.Threading空间下的Thread类的构造方法:

原型:public Thread(ThreadStart start) ThreadStart类型值     

       Thread thread=new Thread(new ThreadStart(accp));

       Private void accp(){}//使用线程操作

线程启动

Thread thread=new Thread(new ThreadStart(accp));

线程暂停与重新启动

启动线程使用Thread.Sleep是当前线程阻塞一段时间Thread.Sleep(Timeout.Infinite)是线程休眠,直到被调用Thread.Interrrupt的另一个线程中断或被Thread.Abort中止。

一个线程不能对另一个调用Sleep,可以使用Thread.Suspend来暂停线程,当线程对自身调用Thread.Suspend将阻塞,直到该线程被另一个线程继续,当一个线程对另一个调用,该调用就成为使另一个线程暂停的非阻塞调用。调用Thread.Resume使另一个线程跳出挂起状态并使该线程继续执行,而与调用Thread.Suspend的次数无关

线程休眠:Thread.Sleep(10000);

线程挂起:Thread thread=new Thread(new ThreadStart(accp));

                Thread.start();

                Thread.Suspend();

重新启动:Thread thread=new Thread(new ThreadStart(accp));

               Thread.start();

               Thread.Suspend();

               Thread.Resume();

阻塞线程的方法:thread.Join使用一个线程等待另一个线程停止

Thread.Join

Public void Join();

Public void Join(int millisecondsTimeout);毫秒

Public bool Join(TimeSpan timeout);时间间隔类型值

实例:Thread thread=new Thread(new ThreadStart(accp));

              Thread.start();

              Thread.Join(10000);

线程销毁:

Thread.Abort,Thread.Interrupt

Abort方法引发ThreadAbortException,开始中止此线程的过程,是一个可以由应用程序代码捕获的特殊异常,ResetAbort可以取消Abort请求,可以组织ThreadAbortException终止此线程,线程不一定会立即终止,根本不终止。

对尚未启动的线程调用Abort,则当调用Start时该线程将终止。对已经挂起的线程调用Abort,则该线程将继续,然后终止。

补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,