A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾玉锋 高级黑马   /  2012-7-20 07:47  /  2078 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于网络编程中服务端与客服端通信的自我理解,求评鉴。

以下都是看过视频以后分析得出结论,不妥处请指正,谢谢!

网络通信其实可以看做是网络节点之间的通信,或者更直白的说是网卡之间的数据交互。

而网络节点(IpEndPoint 对象)是由Ip地址(IPAddress 对象)和端口(如:8080)组成。
网络节点之间的通信是通过通信工具(Socket 对象)和对方的网络节点信息来实现的(打电话需要手机和对方电话号码)。

服务器和客户端在我看来,最大的不同是:服务器是相对固定的(只有一个),而客户端可以有很多个,他们之间是一对多的关系。
所以,服务器需要绑定(Socket 对象.Bind())到一个固定的网络节点(不能随意更改),客户端则不需要。

虽然服务器与众多客户端通信,但是服务器为每一个与之通信的客户端分配一个固定的Socket并将之存储到一个容器里(如Dictory)以便通信识别,直到通信结束,Socket销毁。


通信过程:
一、服务器启动并监听客户端请求:
   //通过IP地址和端口创建网络节点对象
   IPAddress address=IPAddress.Parse(服务器Ip地址);
   IPEndPoint endpoint=new IPEndPoint(address,int.Parse(端口));
   //创建一个套接字(工具,固定代码)
   Socket socketWatch =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   //将套接字绑定到唯一的网络节点上
   socketWatch.Bind(endpoint);
   //设置监听队列长度
   socketWatch.Listen(10);

   //通过线程为每一个与之连接的客服端分配一个Socket对象:
   Thread threadWatch=new Thread(WatchConnecting);//创建负责监听的线程,并传入监听方法
   threadWatch.IsBackground=true;//设置为后台线程
   threadWatch.Start();//开启线程

   //创建监听方法

   void WatchConnecting()
   {
     while(true)
     {
       //开始监听,一旦监听到客户端的连接请求,就分配一个与之对应的通信套接字
       Socket sokConnection=socketWatch.Accept();
       MessageBox.showDialog("有新的客户端成功连接!");
     }

   }



二、客户端连接服务器
   //通过IP地址和端口创建要连接的服务器网络节点对象
   IPAddress address=IPAddress.Parse(服务器Ip地址);
   IPEndPoint endpoint=new IPEndPoint(address,int.Parse(端口));
   //创建一个套接字(工具,固定代码)
   Socket socketClient =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   //向服务器网络节点发送连接请求
   socketClient.Connect(endpoint);



三、服务器端向客户端发送消息,客户端接收消息
   
    1、//通过IP地址和端口创建网络节点对象
   IPAddress address=IPAddress.Parse(服务器Ip地址);
   IPEndPoint endpoint=new IPEndPoint(address,int.Parse(端口));
   //创建一个套接字(工具,固定代码)
   Socket socketWatch =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   //将套接字绑定到唯一的网络节点上
   socketWatch.Bind(endpoint);
   //设置监听队列长度
   socketWatch.Listen(10);
   //创建一个Dictory<string,Socket> 用来存储所有与服务器通信的套接字
   Dictory<string,Socket> dic=new Dictory<string,Socket>;
   //通过线程为每一个与之连接的客服端分配一个Socket对象:
   Thread threadWatch=new Thread(WatchConnecting);//创建负责监听的线程,并传入监听方法
   threadWatch.IsBackground=true;//设置为后台线程
   threadWatch.Start();//开启线程
   
   //获取与要发送信息的客户端套接字,并调用方法发送消息
     string strMsg="要发送的消息";
     byte[] arrMsg=System.Text.Encoding.UTF8.GetBytes(strMsg);
     dic[lbOnline.Text].Send(arrMsg);//从lbOnline控件中取得网络节点信息,并从套接字集合里获得客户端套接字
   //创建监听方法
   
   void WatchConnecting()
   {
     while(true)
     {
       //开始监听,一旦监听到客户端的连接请求,就分配一个与之对应的通信套接字
       Socket sokConnection=socketWatch.Accept();
       //将每一个通信套接字存入Dictory<string,Socket> dic
       dic.Add(sokConnection.RemoteEndPoint.ToString(),socketWatch);
       //将sokConnection的客户端网络节点保存到一个容器里面,假设有一个listBox lbOnline
       lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
       MessageBox.showDialog("有新的客户端成功连接!");
     }

   }


2、客户端接收消息
   //通过IP地址和端口创建要连接的服务器网络节点对象
   IPAddress address=IPAddress.Parse(服务器Ip地址);
   IPEndPoint endpoint=new IPEndPoint(address,int.Parse(端口));
   //创建一个套接字(工具,固定代码)
   Socket socketClient =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   //向服务器网络节点发送连接请求
   socketClient.Connect(endpoint);
   //创建线程 监听服务器端发来的消息
   Thread threadClient=new Thread(RecMsg);

   void RecMsg()
   {
     while(true)
     {
       //定义一个接收数据用的缓存区(2M字节数组)
       byte[] arrMsgRec=new byte[1024*1024*2];
       //将接收到的数据 存入arrMsgRec数组
       socketClient.Receive(arrMsgRec);
       //将接收到的数据转换为字符串,并显示出来
       string strMsgRec=System.Text.Encoding.UTF8.GetString(arrMsgRec);
       MessageBox.showDialog(strMsgRec);
     }
   }




以上只是部分功能,其他功能代码大同小异。当然,以上代码有很多重复的地方,只是为了
单独说明某一个功能模块的运行过程,并不能作为实际编程代码,有错误的地方请指正,谢谢!

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

4 个回复

倒序浏览
太有才了,值得学习ing!
回复 使用道具 举报
比较好的经验,仔细看一遍,受教了!
回复 使用道具 举报
{:soso_e179:}
回复 使用道具 举报
服务器在网络中的位置不是固定的,我们在写服务端的时候服务器IP应使用 IPAddress.Any (0.0.0.0),然后服务端的IP应该是可配置的(config文件或使用IO从文件读)

就好比sqlserver实例与SSMS
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马