array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 net进行Socket通信 - 爱码网

随着Web技术的发展,Socket通信逐渐被人们遗忘。然而最近Socket应用却又越来越多。尤其是中国移动,中国联通的短信网关就是基于Socket通迅,另外随着大家对MSNQQIM工具通迅协议的研究。协议内容也随处都可以找到。想要制作自己的MSNQQ客户端的用户也大有人在。但习惯了WEB开发和简单UI开发的程序员却在这些协议面前迷糊了。

.netSystem.Net.Sockets命名空间封装了大量Socket类。使用此命名空间可以通过简单的方法进行复杂的Sockets连接、通迅。下面我就一步步教大家建立一个基于System.Net.Sockets的通用类库,并基于此举几个例子说明如何使用这个类库。

 

1、  首先建立一个类库项目。项目命名为 SocketLibrary,并删除自动生成的Class1.cs

 

net进行Socket通信
2、 
SocketLibrary中添加类:SocketFactory.cs

3、  在默认解决方案中增加一个Windows项目SocketServerTest用于测试服务器端。

并添加对SocketLibrary的引用。将此项目设为启动项目

4、  SocketLibrary项目中新建类Connection。表示一个连接,增加两个属性NetWorkStreamConnectionName。分别表示一个连接的名字和它包含的NetWorkStream。源代码如下:

 

 1net进行Socket通信using System;
 3net进行Socket通信using System.Net;
 5net进行Socket通信using System.Net.Sockets;
 6net进行Socket通信
 7net进行Socket通信 
 8net进行Socket通信
 9net进行Socket通信namespace SocketLibrary
10net进行Socket通信
11

 

5、  新建一个继承自CollectionBase的类ConnectionCollection。用于保存Connection集合。

 

 

 

 1net进行Socket通信using System;
 2net进行Socket通信
 3net进行Socket通信 
 4net进行Socket通信
 5Server,用于侦听网络连接。

6、  

 1net进行Socket通信using System;
 2net进行Socket通信
 3net进行Socket通信using System.Net;
 4net进行Socket通信
 5net进行Socket通信using System.Net.Sockets;
 6net进行Socket通信
 7net进行Socket通信 
 8net进行Socket通信
 9net进行Socket通信namespace SocketLibrary
10net进行Socket通信
11SocketFactory中声明一个私有变量

7、  

System.Threading.Thread _serverListenThread;

8、  SocketFactory类中加入StartServer方法。当执行此方法时,初始化_ serverListenThread并在此线程中开始侦听网络连接

 

 

 

 1下面我们来测试此线程是否工作。

9、  

SocketServerTestForm1Form1_Load事件中加入如下代码。

 

 

 

1net进行Socket通信SocketLibrary.SocketFactory factory = new SocketLibrary.SocketFactory();
2net进行Socket通信
3net进行Socket通信factory.StartServer(1979);
4net进行Socket通信

运行程序,可以看出Form1显示出来了。但我们并没有看到监听启动。这是由于我们的监听是在另外一个线程里运行的。我们可以在Server类的Start()函数中加入断点

 

net进行Socket通信
再次执行程序。可以看到程序会运行到断点处。即开始监听网络连接了。

 

 

10、              下面我们另外启动一个VS.NET2003实例,建立一个项目SocketClientTest,并通过添加已存在的项目增加SocketLibrary,增加对此项目的引用。

 

net进行Socket通信 

11、              新建一个Client类。并写上以下源代码

 

 

 

 1net进行Socket通信using System;
 2net进行Socket通信
 3net进行Socket通信using System.Net;
 4net进行Socket通信
 5net进行Socket通信using System.Net.Sockets;
 6net进行Socket通信
 7net进行Socket通信 
 8net进行Socket通信
 9net进行Socket通信namespace SocketLibrary
10net进行Socket通信
11

SocketFactory中加入StartClient函数

 

 

 

1net进行Socket通信public Connection StartClient(IPAddress ip,int port)
2net进行Socket通信
3

 

SocketClientForm1Form1_Load中加入以下代码

 

net进行Socket通信
插入断点。开始调试执行。当执行取最后一句时。我们看到
_connection已经连接成功。

 

好了,现在我们的客户端已经连接上服务器,并可以发送消息了。但现在我们还没有如何发送消息的方法。我们在SocketFactory中增加一个发消息的静态方法。并且声明一个编码类型的静态变量

 

 

 

net进行Socket通信public static System.Text.Encoding DefaultEncoding = 
net进行Socket通信
net进行Socket通信System.Text.Encoding.GetEncoding(
"GB2312");
net进行Socket通信

现在我们可以用这个函数发消息给服务器端了。

 

net进行Socket通信
我们看到消息发送成功,但服务器端没有任何反应。这是因为我们还没有在服务器端侦听消息。在
Server类中增加如下代码

 

 

加入开始侦听网络流的线程

 

 

 

 

 

 1

再在SocketFactoryStartServer中加入以下代码,以开始侦听网络流。

 

net进行Socket通信
好。我们再启动
SocketServerTest。并运行SocketClientTest。现在在SocketServerTest的控制台可以看到如下输出:

 

net进行Socket通信 

也即服务器收到了客户端发来的Hello Server的消息。

这一章我们就到这里。下一章我们继续讲如何重构这一章的代码,并继续深入的讲如何定义协议以及如何使用这些协议收发消息。

 

posted on 2005-09-06 00:32 rainlake 阅读(1430) 评论(11)  编辑 收藏 收藏至365Key

 

评论

# re: 一步一步教你使用.net进行Socket通信 再接再厉!

2005-09-06 08:07 | ColdSummer

# re: 一步一步教你使用.net进行Socket通信

非常好!
2005-09-06 08:46 | 天生这样

# re: 一步一步教你使用.net进行Socket通信

好文章,谢谢!
2005-09-06 09:00 | NoMagic

# re: 一步一步教你使用.net进行Socket通信

不错
2005-09-06 09:17 | 铱星

# re: 一步一步教你使用.net进行Socket通信

public static Connection StartClient(IPAddress ipaddress,int port) {
32
33 TcpClient client = new TcpClient();
34
35 client.SendTimeout = CONNECTTIMEOUT;
36
37 client.ReceiveTimeout = CONNECTTIMEOUT;
38
39
40
41 client.Connect(ipaddress,port);
42
43 }
这个并没有返回 Connection 类型的引用
public Connection StartClient(IPAddress ip,int port)
2
3{
4
5 return Client.StartClient(ip,port);
6
7}
这个的调用要求有返回类型,是不是错了。
2005-09-06 09:20 | spnider

# re: 一步一步教你使用.net进行Socket通信

public static Connection StartClient(IPAddress ipaddress,int port) {
32
33 TcpClient client = new TcpClient();
34
35 client.SendTimeout = CONNECTTIMEOUT;
36
37 client.ReceiveTimeout = CONNECTTIMEOUT;
38
39
40
41 client.Connect(ipaddress,port);

Connection connection = new Connection(tcpClient.GetStream());

return connection;
42 加上这段代码就可以了
43 }
2005-09-06 09:30 | spnider

# re: 一步一步教你使用.net进行Socket通信

似乎并没有提到如何解决在实际应用中会遇到的问题。
http://jiezhi.cnblogs.com/archive/2005/08/15/215419.html

相关文章: