最近项目需要,学习了UDP、TCP通讯,关于这部分的原理解释可以参考我之前的博客:TCP通信原理及封包问题(详细,案例解析)。深入了解之后发现其实UDP、TCP各自都存在缺陷。UDP是无连接的通信,不可靠会造成丢包问题,但是这个传输效率高,实时,如视频传输等;TCP面向连接通信,有校验确认,包的重组拆分等问题,会粘包。其原因和解决方法可以参考我的博客:TCP粘包问题分析和解决(全)。下面是关于UDP、TCP的例程,可以深层理解UDP、TCP通信。
目录列表:
1 C# Socket简单例子(服务器与客户端通信)
2 C#异步TCP Socket聊天室(1服务器,N客户端)
3 C# UDP网络聊天程序
4 C#多线程Lock锁定的使用例子(多线程线程同步)
5 C#一个简单的多线程例子
6 C#启动与停止进程
7 C# socket游戏编程(1服务器,多客户端)
1 C# Socket简单例子(服务器与客户端通信)
这个例子只是简单实现了如何使用 Socket类 实现面向连接的通信。
注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。在这个例子中,实际上还有很多问题没有解决,如消息边界问题、端口号是否被占用、消息命令的解析问题等。
编译成功后,先运行服务端(server),再运行客户端(client)即可达到通信效果。
效果如下图:
该程序已在局域网测试通过。(192.168.X.X)
源码下载地址:http://files.cnblogs.com/andrew-blog/SocketServerAndClient.rar
2 C#异步TCP Socket聊天室(1服务器,N客户端)
该例子是一个异步TCP Socket聊天室!
1个服务器
N个客户端
下载下来后,直接将本机的IP改为192.168.1.224即可直接运行程序,或者自行改下程序源码中指定的IP地址即可
结果图:
完整代码包下载地址(包含客户端和服务器):http://files.cnblogs.com/andrew-blog/AsyncTcp.rar
3 C# UDP 网络聊天程序
学习了UDP协议的使用以及TCP协议的对比,各有各的优势!
个人理解优势区别如下:
1:UDP协议称为不可靠的传输协议,因为在从发送方到接收方的传递过程中出现的数据丢失,协议本身并不能做出任何检测或者提示。
2:UDP速度比TCP快,因为UDP不需要先与对方建立连接,也不需要连接确认,因此速度要快的多。
理解下使用情景:
并不是说一个程序用UDP就用UDP 用TCP就用TCP。
例如QQ聊天,我们要开视频,语音,发送文件,文字。
1) 开视频、语音就可以用UDP协议,视频,在线电影这些就无所谓了,丢一点点也是看不出来的。
2) 文字也可以用UDP协议去做(所以我们总会遇到网络不好发送文字失败的情况,需要重新发送);
3) 发送文件用TCP,因为发送文件比较大的话中途数据丢失,造成文件的完整性,也会导致出问题。
--------------------------------------------------------------------------------------------
该程序测试了局域网,外网。
下面也说下连接局域网和外网的方式:
局域网:直接在软件上指向目标机的内网IP地址即可(如:192.168.1.223)
外网:指向目标机的外网IP地址,并且本机与目标机的路由器务必映射端口8889(可自行在源码里更改)
以下是截图与完整代码:
截图:
源码下载地址:http://files.cnblogs.com/andrew-blog/UdpChatExample.rar
4 C#多线程Lock锁定的使用例子(多线程线程同步)
这个例子是一个模拟多个人在多台提款机上同时提取一个账户的款的情况。
在存取的过程中 可能 A线程取了100而B线程那边还看见账户上没少掉那100快,所以导致数据不统一,赋值出现问题。
下面代码则可以测试出加上Lock锁定 与 不加的区别。
先上两个图。
第一个(加了Lock的程序):
加了的 数据每一条都是完整无错的,因为他们执行Lock包含的代码时,是一个线程一个线程的执行,而不是一拥而上 都在混乱的执行,那变量就会造成不稳定的情况。
下面是不加Lock的代码。
仔细看选中行 与 下一行的余额数目。
按理说下一行 余额应该是509的,可是 却条到了下下行。。10个线程都在取钱 对变量进行操作。。所以会出现这个问题。
这就是Lock的好处。
参考:http://www.wxzzz.com/?id=17
5 C#一个简单的多线程例子
实现功能主要是在一个窗体中利用2个线程来执行a与b字符的追加
一个是窗体代码 一个是class代码。
直接上代码了,先来窗体的吧。
例子下载地址:http://files.cnblogs.com/andrew-blog/ThreadExample.rar
参考:http://www.wxzzz.com/?id=16
6 C#启动与停止进程
也是书中《C#网络应用编程》的一章。方便日后翻用。
该例子为 notepad.exe(记事本)程序的启动与结束
截图:
参考:http://www.wxzzz.com/?id=15
7 C# socket游戏编程(1服务器,多客户端)
最近两天发的博文较少。。因为这个例子太长啦。
下面引用下书上的话,来引导这个例子:
游戏规则如下:
(1)玩家通过 internet和 坐在同一桌的另外一个玩家对弈,一个玩家选择黑方,另一个玩家选择白方。
(2)游戏开始后,计算机自动在15x15的棋盘方格内,以固定的时间间隔,不停的在未放置棋子的位置随机产生黑色棋子或白色棋子。
(3)玩家的目标是快速单击自动出现在棋盘上的自己所选颜色的棋子,让棋子从棋盘上小时,以避免自己的棋子出现在相邻的位置。
(4)每当棋子从棋盘上小时,具有相应颜色的玩家既得1分。注意,如果玩家单击了对方的棋子,则对方得1分。
(5)如果棋盘上出现两个或者两个以上相邻的同色棋子,游戏就结束了,改颜色对应的玩家就是失败者。
游戏功能要求如下:
(1)服务器可以同时服务多桌,每桌允许两个玩家通过internet对弈。
(2)允许玩家自由选择坐哪一桌的哪一方。如果两个玩家坐在同一桌,双方应都能看到对方的状态。两个玩家均单击‘开始’按钮后,游戏才开始。
(3)某桌游戏开始后,服务器以固定的时间间隔同时在15x15的棋盘方格内向该桌随机地发送黑白两种颜色的棋子的位置,客户端程序接收到服务器发送的棋子位置和颜色后,在15x15棋盘相应的位置显示棋子。
(4)玩家坐到游戏桌座位上后,不论游戏是否开始,该玩家都可以随时调整服务器发送棋子位置的时间间隔。
(5)游戏开始后,客户端程序响应鼠标单击,并根据游戏规则计算玩家的得分。
(6)如果两个相同颜色的棋子在水平方向或垂直方向是相邻的,那么就认为这两个棋子是相邻的,这里不考虑对角线相邻的情况。
(7)如果相同颜色的棋子出现在相邻的位置,本局游戏结束。
(8)同一桌的两个玩家可以聊天。
这个游戏虽然比较小,但却是“麻雀虽小,五脏俱全”。如果读者真正理解了编写的方法,就可以轻松编写其他各类基于TCP的应用程序。
------------------------------------------
程序(客户端和服务端)已经测试过了。并不是很完美,但是并不影响学习socket TCP编程。
图为两个客户端和一个服务端运行的状况。
完整代码下载:
http://files.cnblogs.com/andrew-blog/socketGame.rar
注:再次说下,关于代码的是否完美,这里不作讨论。仅用于学习socket编程
参考:http://www.wxzzz.com/?id=35
参考:
http://www.cnblogs.com/andrew-blog/archive/2011/12/02/CSharp_Socket.html
http://www.cnblogs.com/andrew-blog/archive/2011/12/03/2274971.html
http://www.cnblogs.com/andrew-blog/archive/2011/12/03/2274978.html
http://www.cnblogs.com/andrew-blog/archive/2011/12/03/CSharp_Socket_Game.html