天天看点

C#.net同步异步SOCKET通信和多线程小结

 2009-三-26

同步套接字通讯

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版本四的地址,Inte.NetworkV六亟需ip版本六的地址

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

ProtocolType示意socket支持的网络协议

定义主机对象:

IPEndPoint种:IPEndPoint结构步骤 位置:System.Net

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

主机解析:

利用DNS服务器解析主机,应用Dns.Resolve步骤

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

Dns.GetHostByName获取当地主机姓名

原形:public static IPHostEntry GetHostByName(string hostname)

GetHostByAddress

原形:一)public static IPHostEntry GetHostByAddress(IPAddress address) 参数:IP地址 二)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();

发送数据:步骤一:socket种的send步骤2.NetworkStream种Write

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

public int Send(byte[],SocketFlags)原形二说明,SocketFlags成员列表:DontRoute(不施用路由表发送),MaxIOVectorLength(为发送和接收数据的wsabuf构造数量提供基准值)None 不对次调用应用标示) OutOfBand(讯息的一部分发送或接收)Partial(讯息的一部分发送或接收) Peek(查看传到的讯息)

原形3:public int Send(byte[],int,SocketFlags) 参数2要发送的字节数

原形4:public int Send(byte[],int,int,SocketFlags) 参数2为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,零);//将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,零,ccc.length);

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

Socket种Receive步骤

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

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

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

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

.....

Socket bbb=sock.Accept();

........

Byte[] ccc=new Byte[512];

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

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

richTextBox一.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,零,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使另一个线程跃出挂起状态并使该线程持续实施,

本文来源:

我的异常网

Dotnet Exception