我经常编写一些网络程序,就从网络数据收发的角度去讲一些编程的技巧:
总体来讲,就是程序的怎样设计要比实际代码的编写重要的多。
大多数人可能都具备了一个项目中零碎的基础。例如:1)基本的控件使用;2)线程的创建于管理;3)socket网络编程;4)数据库的使用;5)和一大堆库函数的调用。但是怎样将这些技术组合起来去完成一个实际项目却感到无从下手。
从简单的单机编程到网络编程。个人的编程能力也逐渐提高。
首先,我们需要克服拿到项目,马上就在编译器中设计UI,然后加载一些事件函数。我觉得最重要的就是在大脑中构想出整个项目的格局。区分出各个功能模块,充分发挥各个模块的分工。这些可以借助一些例如微软的visio设计好。
有了大体的格局,下面得注意一些编程的规则。全局变量,常量的设计,作用域的大小。尤其是线程配合全局变量容不容易产生矛盾。
我在网络编程时经常就因为这些设计的问题,导致开启第一条线程正常,关闭后在开启第二次就出问题了。还有就是网络编程尤其要注意套接字阻塞问题。经常出现的问题就是TCP/UDP写入函数(accept和recv);因为调试到这里,该函数的线程往往是在休眠状态下的。这使其它线程在修改全局变量时,休眠线程不能响应。
例子一:
while(brun)
{
byte[] bytes = udpclient.Recvice(ref iep);
}
return 0;
经常用brun全局变量作为跳出循环的关键。但是在Recvice这个IO请求休眠时,通过改变brun时无法跳出循环结束线
程的。想马上结束线程就必须通过该线程的引用对象Thread类的abort()结束。
例子二:变量(对象)的作用域
if(a>b)
{
object c=b;
}
object x=c;
其实x=c时,c就已经不存在了。
例子三:句柄(在32位情况下就是一个编号,一个索引的值,在MFC中SOCKET也可以被int类型代替 )。银耳这些值可以进行传递。如函数传递,线程传递。但是这个索引的主体资源的释放要在创建该主体的位置进行。
例子四:将一个套接字可以在多个位子发送数据。但只能在一个位子接收数据。为防止数据混乱这就时一个方法吧。
其实有些技巧我就不一一例举,但总的来说。对于一个只要不是10个一类的函数就能解决的一个程序。花在规划上的时间就必须加大再加大。