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
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。