总结.net同步异步SOCKET通讯和多线程技术(3)
演示:bbb=sock.Accept();
.......
.NetworkStream stre=new.NetworkStream(bbb);
Byte[] ccc=new Byte[512];
stre.Read(ccc,0,ccc.Length);
string readMessage=System.Text.Encoding.BigEndianUnicode.GetString(ccc);
线程
线程创建:System.Threading空间下的Thread类的构造方法:
原型:public Thread(ThreadStart start) ThreadStart类型值
Thread thread=new Thread(new ThreadStart(accp));
Private void accp(){}//使用线程操作
线程启动
Thread thread=new Thread(new ThreadStart(accp));
线程暂停与重新启动
启动线程使用Thread.Sleep是当前线程阻塞一段时间Thread.Sleep(Timeout.Infinite)是线程休眠,直到被调用Thread.Interrrupt的另一个线程中断或被Thread.Abort中止。
一个线程不能对另一个调用Sleep,可以使用Thread.Suspend来暂停线程,当线程对自身调用Thread.Suspend将阻塞,直到该线程被另一个线程继续,当一个线程对另一个调用,该调用就成为使另一个线程暂停的非阻塞调用。调用Thread.Resume使另一个线程跳出挂起状态并使该线程继续执行,而与调用Thread.Suspend的次数无关
线程休眠:Thread.Sleep(10000);
线程挂起:Thread thread=new Thread(new ThreadStart(accp));
Thread.start();
Thread.Suspend();
重新启动:Thread thread=new Thread(new ThreadStart(accp));
Thread.start();
Thread.Suspend();
Thread.Resume();
阻塞线程的方法:thread.Join使用一个线程等待另一个线程停止
Thread.Join
Public void Join();
Public void Join(int millisecondsTimeout);毫秒
Public bool Join(TimeSpan timeout);时间间隔类型值
实例:Thread thread=new Thread(new ThreadStart(accp));
Thread.start();
Thread.Join(10000);
线程销毁:
Thread.Abort,Thread.Interrupt
Abort方法引发ThreadAbortException,开始中止此线程的过程,是一个可以由应用程序代码捕获的特殊异常,ResetAbort可以取消Abort请求,可以组织ThreadAbortException终止此线程,线程不一定会立即终止,根本不终止。
对尚未启动的线程调用Abort,则当调用Start时该线程将终止。对已经挂起的线程调用Abort,则该线程将继续,然后终止。对阻塞或正在休眠的线程调用Abort,则该线程被中断,然后终止。
Thread类的Abort方法:
Public void Abort()
Public void Abort(object stateinfo);
演示:
Thread thread=new Thread(new ThreadStart(accp));
Thread.Start();
Thread.Abort();
Thread.Join(10000);
Socket编程原理:
Unix的i/o命令集,模式为开-读/写-关 open write/read close
用户进程进行i/o操作
用户进程调用打开命令,获取文件或设备的使用权,并返回描述文件或设备的整数,以描述用户打开的进程,该进程进行读写操作,传输数据,操作完成,进程关闭,通知os对哪个对象进行了使用。
Unix网络应用编程:BSD的套接字socket,unix的System V 的TLI。
套接字编程的基本概念:
网间进程通信:源于单机系统,每个进程在自己的地址范围内进行运行,保证互相不干扰且协调工作。操作系统为进程之间的通信提供设施:
Unix BSD 管道pipe,命名管道named pipe软中断信号signal
Unix System V 消息message 共享存储区 shared memory 信号量semaphore
以上仅限于本机进程之间通信。
端口:网络上可以被命名和寻址的通信端口,是操作系统可以分配的一种资源,网络通信的最终地址不是主机地址,是可以描述进程的摸中标识符。TCP/IP提出协议端口porotocol port端口,表示通信进程。
进程通过os调用绑定连接端口,而在传输层传输给该端口的数据传入进程中处理,同样在进程的数据需要传给传输层也是通过绑定端口实现。进程对端口的操作相当于对os中的i/o文件进行操作,每一个端口也对应着一个端口号,tcp/ip协议分为tcp和udp,虽然有相同port number的端口,但是互相也不冲突。 端口号的分配有全局分配,本地分配(动态分配),当进程需要访问传输层,os分配给进程一个端口号。全局分配,就是os固定分配的端口,标准的服务器都有固定的全局公认的端口号提供给服务。小于256的可以作为保留端口。
地址:网络通信中的两台机器,可以不再同一个网络,可能间隔(网关,网桥,路由器等),所以可以分为三层寻址
机器在不同的网络则有该网络的特定id
同一个网络中的机器应该有唯一的机器id
一台机器内的进程应该有自己的唯一id
通常主机地址=网络ID+主机ID tcp/ip中使用16位端口号来表示进程。
网络字节顺序,高价先存,tcp和udp都使用16或32整数位的高价存储,在协议的头文件中。
半相关:在网络中一个进程为协议+本地地址+端口号=三元组,也叫半相关,表示半部分。
全相关:两台机器之间通信需要使用相同协议
协议+本地地址+本地端口号+远程地址+远程端口号 五元组 全相关。
顺序:两个连续的报文在网络中可能不会通过相同的路径到达,所以接收的顺序会和发送的顺序不一致。顺序是接收顺序与发送顺序一致。Tcp/ip提供该功能。
差错控制:检查数据差错:检查和CheckSum机制 检查连接差错:双方确认应答机制。
流控制:双方传输数据过程中,保证数据传输速率的机制,保证数据不丢失。
字节流:把传输中的报文当作一个字节序列,不提供任何数据边界。
全双工/半双工:两个方向发送或一个方向发送
缓存/带外数据:字节流服务中,没有报文边界,可以同一时刻读取任意长度的数据。为保证传输正确或流协议控制,需要使用缓存,交互型的应用程序禁用缓存。
数据传送中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息(unix系统的中断键delete,Control-c)、终端流控制符Control-s、Control-q)为带外数据。