今天UDP编程,遇到了不少问题,第一次用UDP,收获挺大的。
今天犯了一个很傻的错误,就是在接收数据的时候,client.receive的时候,竟然忘了把client与端口绑定在一起,导致没有接收到数据……
还有就是接收到字节数组后,不能直接toString(),必须用Encording中的getString()方法,否则得到的字节数组会转换错误,发送的时候也要用Encording方法。
貌似ASCNII码不支持中文吧,用它来转换中文的话,会使richtextbox不能正确显示中文。我最后用的是unicode。
最后有个困扰我很久的问题就是,多线程编程中,如果调用其他线程中创建的控件,我找了很多方法,虽然网上有很多方法,也有很多代码,但是我看着这些代码,纠结着应该放到我程序的哪里,是放到主线程里,还是子线程里呢……相当纠结……我希望那些高手以后贴代码的时候麻烦告诉我们这些菜鸟应该把代码放到哪里,没办法,菜鸟一个,拿着东西都不知道怎么用……
这个问题,应该现在主线程中声明一个委托,public delegate void myDelegate(byte[] reveive);然后在子线程中的函数中,建立实例
myDelegate myEvent=new myDelegate(dispay);,dispay是关联的函数,这个函数直接放到主线程里面就行了,最后在子线程的程序中调用invoke方法,比如你要修改的是richtextbox控件,只需要执行richTextBox1.Invoke(myEvent, receive);至于receive嘛,dispay的参数而已啦………………在dispay中,就可以直接调用
richtextbox1.text=encording.unicode.getstring(receive);
这样就OK了。
对了,还有个问题,就是如何在主线程结束后子线程自动结束,需要加上这行代码:
thread.IsBackground = true;
暂时就这样吧,留作以后备查…………