**************序列化和映射************
1.序列化只能保持一个对象
2.序列化可以保存任何类型的数据
2.程序集
dll //程序集的封装
exe // 应用程序的程序集
3.程序集是一个项目,
***************反射*******************
1.有了反射可以对每个类型了如指掌
2.反射相当于反编译(将打包的程序集拆开)
3.一个解决方案中的每个程序集(项目)的 Assembly .GetExecutingAssembly( ).Location 是不一样的
4.序列化中
a.A类中有B类成员,当A类序列化时,B类也要标注为可序列化
b.一个解决方案中,如果A项目要引用B项目的类,除了在A中添加B的引用之外,还要将B中的类设置为Public //因为默认类是internal 的,只能在项目的内部访问
5.序列化可视为一个临时的数据库
6.网络中只能传输二进制文件
7.反射的用途
a.在使用第三方插件时(第三方插件可以是C#以外的语言)可以使用反射
b.反射可以让C#使用其他语言的类库,Dll中各种成员
******************多线程**************
1.使用线程可以不用手动(自动)执行进程
2.任务管理器中的所有进程叫做应用程序域
3.窗体销毁的时候只有销毁窗体中的控件,而后台运行的多线程不会终止,要强行终止(关闭) ,否则程序的整个进程还在后台运行
4.委托就是函数指针
5.程序是由线程来运行的/或者手动运行的
6.thread. Join()禁用,但是不关闭线程
7.阻止是另一个线程去阻止当前线程,暂停是自身暂停
8.不允许线程在执行的时候调用修改窗体的控件
9.线程在与进行中必须抛出异常,无论是否有异常、
10. Load...方法是窗体的主线程
11.线程所执行的程序结束,则该线程也结束
12.Abort( )//线程结束后,该线程的生命期结束,不能使用start( )来重启
13.Thread.sleep( 100) //是将当前线程sleep,其实就是sleep当前线程执行的时间
14.
a.多线程只能控制窗体中已有的控件
b.单线程可以创建控件
c.time控件是单线程的,可以用来创建控件,但是只能开始和停止(而且一个窗体中最好只创建一个time控件)
d.thread是多线程(哪怕只是创建一个实例)-->可以暂停核开始,而且不能用于创建控件,且只能操作已有的控件
e.thread所调用的函数中可以关闭自己
f.单线程是前台界面,多线程是后台(调用的时候,断点只能调用当前的线程,其他线程任然在运行)
**********************网络编程**********************
1.
a.Tcp是点对点的协议(两台计算机之间)
b.UDP是广播形式的,只要在该网段的都可以接收到-->只负责发送
c.80---->是网页默认的端口
d. streamReader sr=new streamReader(stream,Encoding.default ) //可以再读取流的时,设置编码
a.以后再做具体应用的时候,端口设置为10000以上,防止冲突,一个软件一个端口
b.监听是针对本机的
3.方法参数的值总结:一般要么是枚举,结构,要么是要new一个类的实例
a. "." 是枚举/结构
b. new 类的实例
4.窗体自身有个线程,有的子对话款打开时,整个窗体线程会暂停,如果想绕过该过程继续执行窗体,可
以给该过程一个线程
Listen--->侦听器就是本机的数据接收端
TcpClient---->是发送端的数据包
6.多线程的好处:
如果 A--->B--->C
程序的流程被B中断,而且B是无限循环的,可以让B在一个thread中自主执行,这样B就可以运行,且A可
以继续向下运行到C
7.几乎所有的读写操作(无论个各种格式,网络传输)步骤:
a.根据Url 路径等创建stream
b.用stream来创建读写器
8.个种流两种老公格式
a.二进制(无所谓编码)
b.字节形式(utf8,AscII码)
9.创建listen时,可以直接写port号,也可以ip+port,但是ip一定是本机的hostIp
10 关闭线程,流--->要反顺序关闭
11.server和client 发和收的数据字节大小要一致
12. Netstream中要是发送的数据不是一次性发送或者接受完毕,而是分包进行的话,要while中循环接收/发送
13.一般不会直接用stream读写
a.文件的用单个字节+code方式来操作
b.文本以外的文件使用二进制读写(且读写的编码要一致)
14.Socket就是远端节点
14.Invoke可以用委托将控件加入指定窗体的线程中执行(包括创建和编辑)
15. utf8和gb28的编码不一样
16. 网络上只能传输一个字节为单位的数据(包括:二进制的字节,带code编码的流)
*********************三国杀项目总结*********************
1.一个Netstream可以被侦听端和接收端同时使用
2. Netstream 是分包发送和接收的,所以要在接收端用 Netstream.DataAvailable来判断是否还有数据
(且用while循环来接收被打成多个包的数据)
3.socket中包括发送和接收两个端口的信息
4.发送的信息过一段时间,如果无端口接收的话,就会丢失
5.在一个窗体的引发的多线程中,不能添加和创建(包括往该窗体添加和独立创建控件和窗体-->都不可
以),解决方法:
delegate void EventHandler( ) //
public void Thread( ) //引发的线程object[ ]
this.invoke( new EventHandler(work)) // 用委托实例化一个方法work,在work中对另一个线程中窗口进行编辑/创建
6.
a. Socket被创建后也是一个实例,socket可以被block和close(如果colse则所有相关的资源都将被释
放)
b. socket(包括本地local和远端Remote 信息)
c. 使用socket创建的流既可以用于写,也可以用于读(无论socket中是否含有监听端口),但是用相同的socket不要重复创建Networkstream-->就如两点间只能有一条直线一样
e. 要是Netstream的两个端口中的一个关闭,则该netstream也将关闭
f. 一个Netstream的两端
A------------B
A和B不能同时写数据,虽然这样的几率很小,最好如下所示进行操作
A------------B
B------------A //同时创建两条数据流,就不会冲突了
g. 但是不能再两个线程(进程中)使用相同的端口来进行监听,一个端口某一个时刻只能被一个线程用
来监听(作为listen端口)
h. 在侦听的线程循环方法中:
while( )
{
socket=listen.AcceptSocket( ) //只有在接收到连接申请的时候才会向下顺序执行,否则就一直阻塞在此---->直到有新的连接申请发生
}
i. Netstream ,Tcp方式的发包是有延时的,但是如果接收方在限定的时间内没有接收,则该包丢失