菜鸟学习Socket章节一

 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通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求在程序员编程验证


001//服务端的代码
002 classProgram
003    {
004        privatestatic byte[] bytes =new byte[1024]; //声明一个字节数组这里我指定的大小为1024
005        privatestatic intport = 5000;  //自己设定一个端口号 1-65535 之间随意的数字(不要设一些我们经常使用的端口号比如说8080,800)
006        privatestatic stringipAddress = "127.0.0.1";//这里我绑定的IP地址就是我的本地的地址
007        privatestatic Socket _socket;
008        staticvoid Main(string[] args)
009        {
010            //服务器IP
011            IPAddress ip = IPAddress.Parse(ipAddress);//将我的ip地址转换为IPAddress实例
012            _socket =new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //实例换一个Socket
013  
014            _socket.Bind(newIPEndPoint(ip, port)); //绑定IP地址和端口号
015  
016            _socket.Listen(50); //设定最多50个排队连接请求  
017  
018            Thread serverThread =new Thread(ListenClientConnect);
019  
020            serverThread.Start();
021  
022            Console.ReadLine();
023        }
024  
025        /// <summary>
026        /// 监听客户端的连接
027        /// </summary>
028        privatestatic voidListenClientConnect()
029        {
030            while(true)
031            {
032                Socket _clientSocket = _socket.Accept();
033                _clientSocket.Send(Encoding.UTF8.GetBytes("Ni hao"));
034                Thread recevieThread =new Thread(ReceiveMessage);
035                recevieThread.Start(_clientSocket);
036            }
037        }
038  
039        //接收客户端发送的消息
040        privatestatic voidReceiveMessage(objectclientSocket)
041        {
042            Socket myClientSocket = (Socket)clientSocket;
043            while(true)
044            {
045                try
046                {
047                    //通过clientSocket接收数据
048                    intreceiveNo = myClientSocket.Receive(bytes);
049                    Console.WriteLine("接收客户端{0}\t消息{1}\t", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(bytes, 0, receiveNo));
050  
051                }
052                catch(Exception e)
053                {
054                    Console.WriteLine(e.Message);
055                    myClientSocket.Shutdown(SocketShutdown.Both);
056                    myClientSocket.Close();
057                    break;
058                }
059            }
060        }
061    }
062  
063  
064  
065  
066  
067//客户端的代码
068 classProgram
069    {
070        privatestatic stringip = "127.0.0.1";
071        privatestatic intport = 5000;
072        privatestatic byte[] bytes =new byte[1024];
073        privatestatic Socket _clientSocket;
074        staticvoid Main(string[] args)
075        {
076            try
077            {
078                IPAddress ipAdd = IPAddress.Parse(ip);
079                _clientSocket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
080                _clientSocket.Connect(newIPEndPoint(ipAdd,port));
081                Console.WriteLine("服务器连接成功!!!!!!");
082            }
083            catch(Exception e)
084            {
085                Console.WriteLine("服务器连接失败!!!!!");
086                Console.WriteLine("失败原因为"+e.ToString());
087            }
088  
089            intreceiveMessage = _clientSocket.Receive(bytes);
090            Console.WriteLine("接收到服务器的消息为{0}:",Encoding.UTF8.GetString(bytes,0,receiveMessage));
091  
092  
093            //通过客户端发送信息
094            for(int i = 0; i < 10; i++)
095            {
096                stringmsg = "123 我是木头人"+DateTime.Now;
097                _clientSocket.Send(Encoding.UTF8.GetBytes(msg));
098                Console.WriteLine("发送的消息为{0}",msg);
099            }
100  
101            Console.Read();
102        }
103  
104  
105         
106    }
107<BR>
今天就到这吧,改天我们在学习另外一种连接方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值