热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#网络编程(一.2、Socket)

参考链接:http:blog.csdn.netlyh916articledetails49760325;http:www.devsiki.com。S

参考链接:

http://blog.csdn.net/lyh916/article/details/49760325;http://www.devsiki.com/。

Socket

socket常用api:
1.public enum AddressFamily:指定 Socket 类的实例可以使用的寻址方案。常用的取值为InterNetwork,表示IP 版本 4 的地址。
2.public enum SocketType:指定 Socket 类的实例表示的套接字类型。常用的取值为Stream,表示支持可靠、双向、基于连接的字节流。
3.public enum ProtocolType:指定 Socket 类支持的协议。常用的取值为Tcp,表示传输控制协议。
4.public class IPEndPoint:将网络端点表示为 IP 地址和端口号。可以通过IPEndPoint(IPAddress, Int32)这个构造函数指定端点的IP地址和端口号
5.public delegate void AsyncCallback(IAsyncResult ar):引用在相应异步操作完成时调用的方法。其中参数是异步操作的结果。
6.Socket.Blocking:可以设置socket是否处于阻止模式,默认为阻止模式,即true。如果当前处于阻止模式,并且进行了一个并不立即完成的方法调用,则应用程序将阻止执行,直到请求的操作完成后才解除阻止。如果希望在请求的操作尚未完成的情况下也可以继续执行,请将Blocking 属性更改为 false。Blocking 属性对异步方法无效。如果当前正在异步发送和接收数据,并希望阻止执行,请使用 ManualResetEvent 类。

//
同步下的socket:http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html
服务器端:
1.创建套接字;
2.绑定套接字到一个IP地址和一个端口上(bind());
3.将套接字设置为监听模式等待连接请求(listen());
4.请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5.用返回的套接字和客户端进行通信(send()/receive());
6.返回,等待另一连接请求;
7.关闭套接字。


客户端:
1.创建套接字;
2.向服务器发出连接请求(connect());
3.和服务器端进行通信(send()/receive());
4.关闭套接字。


注意一下accept、send、receive和connect这几个方法(tcp是面向连接的,udp不是面向连接的):
1.accept:同步方式,在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。
2.send:同步方式,如果您使用的是面向连接的协议,则除非使用 Socket.SendTimeout 设置了超时值,否则,Send将一直处于阻止状态,直到发送完缓冲区中的所有字节。如果超过超时值,Send 调用将引发SocketException。在非阻止模式下,Send 可能会成功完成,即使它发送的字节数小于缓冲区中的字节数。应由您的应用程序负责跟踪已发送的字节数并重试操作,直到应用程序发送了缓冲区中的字节数为止。不能保证发送的数据会立即出现在网络上。为提高网络效率,基础系统可能会延迟传输,直到收集了足够多的传出数据后才开始发送。 Send 方法的成功完成意味着基础系统有空间来缓冲用于网络发送的数据。
3.receive:同步方式,如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发SocketException。如果当前使用的是面向连接的 Socket,那么 Receive 方法将会读取所有可用的数据,直到达到缓冲区的大小为止。
4.connect:同步方式,在阻止模式中,connect将一直处于阻止状态,直到建立了连接。

class Program { //TCPstatic void Main(string[] args) {// 1,创建socketSocket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//2,绑定ip跟端口号 192.168.0.112IPAddress ipaddress = new IPAddress(new byte[]{192,168,0,112});EndPoint point = new IPEndPoint(ipaddress,7788);//ipendpoint是对ip+端口做了一层封装的类tcpServer.Bind(point);//向操作系统申请一个可用的ip跟端口号 用来做通信//3,开始监听 (等待客户端连接)tcpServer.Listen(100);//参数是最大连接数Console.WriteLine("开始监听");Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码Console.WriteLine("一个客户端连接过来了");//使用返回的socket跟客户端做通信string message = "hello 欢迎你";byte[] data = Encoding.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组clientSocket.Send(data);Console.WriteLine("向客户端发送了一跳数据");byte[] data2 = new byte[1024];//创建一个字节数组用来当做容器,去承接客户端发送过来的数据int length = clientSocket.Receive(data2);string message2 = Encoding.UTF8.GetString(data2, 0, length);//把字节数据转化成 一个字符串Console.WriteLine("接收到了一个从客户端发送过来的消息:"+message2);Console.ReadKey();}}

class Program //UDP{private static Socket udpServer;static void Main(string[] args) {//1,创建socketudpServer = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//2,绑定ip跟端口号udpServer.Bind( new IPEndPoint( IPAddress.Parse("192.168.0.112"),7788 ) );//3,接收数据new Thread(ReceiveMessage){ IsBackground = true}.Start();//udpServer.Close();Console.ReadKey();}static void ReceiveMessage(){while (true){EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] data = new byte[1024];int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法会把数据的来源(ip:port)放到第二个参数上string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine("从ip:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port + "收到了数据:" + message);}}}

//


异步下的socket:http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html

1.在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器。相对地,在异步模式下,服务器可以使用BeginAccept方法和EndAccept方法来完成连接到客户端的任务,在客户端则通过BeginConnect方法和EndConnect方法来实现与服务器的连接。

2.因为采用异步的方式,所以没有必要再开启线程。





对应上面提到的四个同步方法,异步socket下有八个异步方法,以Begin和End开头(这里只列举两个,其余的是类似的):

1.public IAsyncResult BeginAccept(AsyncCallback callback,object state)     callback:回调方法   state:该请求的状态信息

至少必须通过 state 参数将实施侦听的 Socket 对象传递给 BeginAccept。如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。通过 state 参数将此类的一个实例传递给 BeginAccept 方法。

回调方法应调用 EndAccept 方法。应用程序调用 BeginAccept 时,系统会使用单独的线程执行指定的回调方法,并在 EndAccept 上一直处于阻止状态,直到检索到挂起的连接。EndAccept 将会返回新的 Socket 对象,供您用来向远程主机发送数据和从远程主机接收数据。





2.public Socket EndAccept(IAsyncResult asyncResult)

它必须接受从 BeginAccept 方法返回的 asyncResult 参数。在回调方法中,调用 asyncResult 参数的 AsyncState 方法可以获取尝试连接的 Socket。获取了 Socket 之后,可以调用 EndAccept 方法成功地完成连接尝试。

EndAccept 方法将一直阻止到在传入连接队列中有一个连接挂起为止。EndAccept 方法接受传入的连接并返回一个新的 Socket,后者可用于将数据发送到远程主机或从远程主机接收数据。


推荐阅读
author-avatar
ian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有