C#之SocKet通信

socket代表了一种文件描述符,而这里这个描述符则是用于描述网络访问的。什么意思呢?就是程序员可以通过socket来发送和接收网络上的数据
你也可以理解成是一个API。有了它,你就不用直接去操作网卡,而是通过这个接口,这样就省了很多复杂的操作。

Socket?我们可以通过一个生活中的场景来理解: 

假如你要打电话给一个朋友,拿起电话先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。
等到你们的交流结束,挂断电话以结束此次交谈。
这里的电话就是一个Socket,你打电话相当于申请了一个Socket,告诉了Socket你要打给谁(对方的电话号码你事先知道)。
你和对方进行聊天通话,相当于在向Socket发送数据和从Socket接收数据。最后,通话结束后,一方挂掉电话则相当于关闭Socket,撤销连接。

在计算机网络的连接过程中,客户端Socket一般会记录服务器主机的IP地址、端口号,然后向服务器端进行连接并发送和接受数据。
服务器端开启一个监听的服务,则是相当于使用Socket指定监听的端口,然后等待客户端的连接,客户端连接后则产生一个会话。会话完成后,则关闭连接。

socket,用它来访问网络的基本条件:

a. 要确定本机的IP和端口,socket只有与某一IP和端口绑定,才能发挥强大的威力。
b. 得有协议吧(否则谁认得你这发送到网络的是什么呀)。想要复杂的,我们可以自己来定协议。但是这个就不在这篇里提了,我这里介绍两种大家最熟悉不过的协议:TCP & UDP。

步骤:
a. 建立一个套接字
b. 绑定本机的IP和端口
c. 如果是TCP,因为是面向连接的,所以要利用Listen(10)方法来监听网络上是否有人给自己发东西;
如果是UDP,因为是无连接的,所以来者不拒。
d. TCP情况下,如果监听到一个连接,就可以使用accept来接收这个连接,然后就可以利用Send/Receive来执行操作了
而UDP,则不需要accept, 直接使用SendTo/ReceiveFrom来执行操作。
e. 如果你不想继续发送和接收了,就不要浪费资源了。能close的就close吧

//Listen(10):同一时间最大链接数量
开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章
TCP控制传输数据,负责发现传输的问题,一旦有问题就发出信号,要求重新传输,
直到所有数据安全正确地传输到目的地,而IP是负责给因特网中的每一台电脑定义一个地址,以便传输。

 

 服务器端Code

//ip地址的配置
int
port = 6000; string host = "127.0.0.1"; IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port);
Socket sSocket
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sSocket.Bind(ipe); sSocket.Listen(0); Console.WriteLine("监听已经打开,请等待"); /* receive message */ Socket serverSocket = sSocket.Accept(); Console.WriteLine("连接已经建立"); string recStr = ""; byte[] recByte = new byte[4096]; int bytes = serverSocket.Receive(recByte, recByte.Length, 0); recStr += Encoding.ASCII.GetString(recByte, 0, bytes); /* send message */ Console.WriteLine("服务器端获得信息:{0}", recStr); string sendStr = "send to client :hello"; byte[] sendByte = Encoding.ASCII.GetBytes(sendStr); serverSocket.Send(sendByte, sendByte.Length, 0); serverSocket.Close(); sSocket.Close();
客户端
int port = 6000;
string host = "127.0.0.1"; /*服务器端ip地址 */
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(ipe);
/* send message */
string sendStr = "send to server : hello,ni hao";
byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
clientSocket.Send(sendBytes);
/* receive message */
string recStr = "";
byte[] recBytes = new byte[4096];
int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0);
recStr += Encoding.ASCII.GetString(recBytes, 0, bytes);
Console.WriteLine(recStr);
clientSocket.Close();

上述服务器端和客户端建立通信,在互相发送一次信息后通信便结束,而在大家进行的项目中,这样的通信肯定满足不了需求。 

出自:http://www.cnblogs.com/ysyn/p/3399351.html#3782819

posted @ 2017-09-25 14:43  ProZkb  阅读(418)  评论(0编辑  收藏  举报