1.最近项目中需要用到Socket连接,就顺便学习了一下,希望能帮助大家
关于Socket的概念和功能可能可以写很长一篇博文来介绍,这里大家把Socket理解Tcp/IP协议的抽象,并且能够实现Tcp/IP协议栈的工具就行,换句话说,我们可以利用Socket实现客户端和服务端双向通信,同样,对于Socket最关键的理解还没到位,很多新人或者不常用的朋友会问:Socket到底功能是什么?怎么工作的?
再次举个例子,女友打电话给我,我可以选择连接,或者拒绝,如果我接了她的电话,也就是说,我和她通过电话连接(Connect),那电话就是“Socket”,女友和我都可以是客户端或服务端,只要点对点就行,我们的声音通过电话传递,但是具体传输内容不归Socket管辖范围,Socket的直接任务可以归纳为以下几点:
1.创建客户端或服务端
2.服务端或客户端监听是否有服务端或客户端传来的连接信息(Listening)
3.创建点对点的连接(Connect)
4.发送accept 信息给对方,表示两者已经建立连接,并且可以互相传递信息了(Send)
5.具体发送什么信息内容不是Socket管辖的范围,但是必须是Socket进行发送的动作
6.同理可以通过Socket去接受对方发来的信息,并加以处理
2.Socket协议类型:
TCP:
1 TCP是面向连接的通信协议,通过三次握手建立连接
2 TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性
UDP:
1 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送
2 UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求在程序员编程验证
004 | private static byte [] bytes = new byte [1024]; |
005 | private static int port = 5000; |
006 | private static string ipAddress = "127.0.0.1" ; |
007 | private static Socket _socket; |
008 | static void Main( string [] args) |
011 | IPAddress ip = IPAddress.Parse(ipAddress); |
012 | _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
014 | _socket.Bind( new IPEndPoint(ip, port)); |
018 | Thread serverThread = new Thread(ListenClientConnect); |
020 | serverThread.Start(); |
028 | private static void ListenClientConnect() |
032 | Socket _clientSocket = _socket.Accept(); |
033 | _clientSocket.Send(Encoding.UTF8.GetBytes( "Ni hao" )); |
034 | Thread recevieThread = new Thread(ReceiveMessage); |
035 | recevieThread.Start(_clientSocket); |
040 | private static void ReceiveMessage( object clientSocket) |
042 | Socket myClientSocket = (Socket)clientSocket; |
048 | int receiveNo = myClientSocket.Receive(bytes); |
049 | Console.WriteLine( "接收客户端{0}\t消息{1}\t" , myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(bytes, 0, receiveNo)); |
054 | Console.WriteLine(e.Message); |
055 | myClientSocket.Shutdown(SocketShutdown.Both); |
056 | myClientSocket.Close(); |
070 | private static string ip = "127.0.0.1" ; |
071 | private static int port = 5000; |
072 | private static byte [] bytes = new byte [1024]; |
073 | private static Socket _clientSocket; |
074 | static void Main( string [] args) |
078 | IPAddress ipAdd = IPAddress.Parse(ip); |
079 | _clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); |
080 | _clientSocket.Connect( new IPEndPoint(ipAdd,port)); |
081 | Console.WriteLine( "服务器连接成功!!!!!!" ); |
085 | Console.WriteLine( "服务器连接失败!!!!!" ); |
086 | Console.WriteLine( "失败原因为" +e.ToString()); |
089 | int receiveMessage = _clientSocket.Receive(bytes); |
090 | Console.WriteLine( "接收到服务器的消息为{0}:" ,Encoding.UTF8.GetString(bytes,0,receiveMessage)); |
094 | for ( int i = 0; i < 10; i++) |
096 | string msg = "123 我是木头人" +DateTime.Now; |
097 | _clientSocket.Send(Encoding.UTF8.GetBytes(msg)); |
098 | Console.WriteLine( "发送的消息为{0}" ,msg); |
今天就到这吧,改天我们在学习另外一种连接方法