在不知道流的长度下,怎样判断从java socket读取字节中读取的字节流结束

Socket原理与编程基础_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Socket原理与编程基础
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
你可能喜欢4981人阅读
java知识点(7)
Java当中的Socket类,其实是使用TCP协议进行传输的.TCP是可靠的一种传输协议.&
如果想用TCP协议,并且,服务端和客户端,在没有信息进行传输的时候,也不断开连接,一般情况下,客户端会在Socket超时之前,想服务端发送一个用于维持连接的信息包,来维持连接.但是TCP协议,并不是指长连接.我们每天上网浏览网页,其实,也是以TCP协议为基本的传输协议的.只是,这个是短连接的形式,每次浏览器向服务器提交一个请求,服务短应答请求,然后断开连接.&
在应用TCP协议,并且是长连接传输信息的情况下.通常会再封装一层协议的.但,观察版主的收发内容,并没有涉及这一层,所以,我这里并不知道是长连接.&
首先,我们要明确一点,发送方如果不将输出流进行关闭,接收方就会认为输入流没有结束,直到超时.&
其次,我们判断一个信息是否已经完全的读取完毕,除了使用输入流结束这种办法,还可以自行封装一层协议,用于信息的交互.&
当然,我们也可以采用Http那样的交互方式进行信息的传递,但是,它是短连接的.&
下面我来说一下,TCP长连接传输数据的一般做法.&
一般情况下,我们会在TCP的基础上再封装一层协议,用户长连接的传输.协议的信息包,也分包头和包体两个部分.&
包体,主要就是我们要传输的信息.(维持连接的信息包,包体可为空)&
包头,一般分为三个部分.第一部分是信息包的长度(长度一般是指整个信息包的长度);第二部分是包体信息的类型(在这里指出是否是维持连接包);第三部分是信息包的序列号,一般情况下,这个序列号要确保在传输过程中唯一标识该信息包.&
如果为了安全起见,还可以在包体后添加包尾,包尾数据用于对包体数据的验证)&
这样,通信双方就可以根据包长来判断一次接收的操作是否结束了.&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15924次
排名:千里之外
原创:13篇
(2)(1)(5)(4)(2)(4)下次自动登录
现在的位置:
& 综合 & 正文
socket原理
Socket支持下的网上点对点的通信服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能服务器端建立一个socket,设置好本机的ip和监听的端口与socket进行绑定,开始监听连接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端进行通信。客户端建立一个socket,设置好服务器端的IP和提供服务的端口,发出连接请求,接收到服务的确认后,尽力连接,开始与服务器进行通信。服务器端和客户端的连接及它们之间的数据传送均采用同步方式。
SocketSocket是tcp/ip网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个端点。在网络通信中需要两个主机或两个进程。通过网络传递数据,在网络对话的每一端需要一个socket。Tcp/IP传输层使用协议端口将数据传送给一个主机的特定应用程序,协议端口是一个应用程序的进程地址。传输层模块的网络软件模块要于另一个程序通信,它将使用协议端口,socket是运行在传输层的api,使用socket建立连接发送数据要指定一个端口给它。Socket:Stream Socket流套接字 Socket提供双向、有序、无重复的数据流服务,出溜大量的网络数据。Dgram socket数据包套接字 支持双向数据流,不保证传输的可靠性、有序、无重复。Row socket 原始套接字 访问底层协议建立socket 用C#命名空间:using System.Nusing System.Net.S构造新的socket对象:socket原型:Public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType)AddressFamily 用来指定socket解析地址的寻址方案。InterNetwork标示需要ip版本4的地址,InterNetworkV6需要ip版本6的地址SocketType参数指定socket类型Raw支持基础传输协议访问,Stream支持可靠,双向,基于连接的数据流。ProtocolType表示socket支持的网络协议
定义主机对象:IPEndPoint类:IPEndPoint构造方法 位置:System.Net原型:1) public IPEndPoint(IPAddress address,int port) 2)public IPEndPoint(long address,int port) 参数1整型int64如123456,参数2端口int32主机解析:利用DNS服务器解析主机,使用Dns.Resolve方法原型:public static IPHostEntry Resolve(string hostname) 参数:待解析的主机名称,返回IPHostEntry类值,IPHostEntry为Internet主机地址信息提供容器,该容器提供存有IP地址列表,主机名称等。Dns.GetHostByName获取本地主机名称原型:public static IPHostEntry GetHostByName(string hostname)GetHostByAddress原型:1)public static IPHostEntry GetHostByAddress(IPAddress address) 参数:IP地址 2)public static IPHostEntry GetHostByAddress(string address) IP地址格式化字符串
端口绑定和监听:同步套接字服务器主机的绑定和端口监听Socket类的Bind(绑定主机),Listen(监听端口),Accept(接收客户端的连接请求)Bind:原型:public void Bind(EndPoint LocalEP)参数为主机对象 IPEndPointListen:原型:public void Listen(int backlog) 参数整型数值,挂起队列最大值accept:原型:public socket accept() 返回为套接字对象演示程序: IPAddress myip=IPAddress.Parse(“127.0.0.1”);IPEndPoint myserver=new IPEndPoint(myip,2020);Socket sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);Sock.Bind(myserver);Sock.Listen(50);Socket bbb=sock.Accept();发送数据:方法1:socket类的send方法二:NetworkStream类Writesend原型:public int Send(byte[] buffer) 字节数组 public int Send(byte[],SocketFlags)原型2说明,SocketFlags成员列表:DontRoute(不使用路由表发送),MaxIOVectorLength(为发送和接收数据的wsabuf结构数量提供标准值)None 不对次调用使用标志) OutOfBand(消息的部分发送或接收)Partial(消息的部分发送或接收) Peek(查看传入的消息)原型三:public int Send(byte[],int,SocketFlags) 参数二要发送的字节数原型四:public int Send(byte[],int,int,SocketFlags) 参数二为Byte[]中开始发送的位置演示:Socket bbb=sock.Accept();Byte[] bytes=new Byte[64];string send="aaaaaaaaaaaa";bytes=System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());bbb.Send(bytes,bytes.length,0);//将byte数组全部发送NetWordStream类的Write方法发送数据原型:public override void write(byte[] buffer,int offset,int size) 字节数组,开始字节位置,总字节数
Socket bbb=sock.Accept();NetWorkStream stre=new NewWorkStream(bbb);Byte[] ccc=new Byte[512];string sendmessage="aaaaaaaaaaaaaa";ccc=System.Text.Encoding.BigEndianUnicode.GetBytes(sendmessage);stre.Write(ccc,0,ccc.length);接收数据:Socket类Receive或NetworkStream类ReadSocket类Receive方法原型:public int Receive(byte[] buffer) 2)public int Receive(byte[],SocketFlags)3)public int Receive(byte[],int,SocketFlags) 4)public int Receive(byte[],int,int,SocketFlags).....Socket bbb=sock.Accept();........Byte[] ccc=new Byte[512];bbb.Receive(ccc,ccc.Length,0);string rece=System.Text.Encoding.BigEndianUnicode.GetString(ccc);richTextBox1.AppendText(rece+"/r/n");
NetworkStream类的Read方法接收数据public override int Read(int byte[] buffer,int offset,int size)
演示: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.JoinPublic 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.InterruptAbort方法引发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软中断信号signalUnix 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)为带外数据。客户/服务器模式主动请求方式:1. 打开通信通道,通知本地主机,在某一个公认地址上接收客户请求2. 等待客户请求到达端口3. 接收到重复服务请求,处理请求发送应答信号。接收到并发服务请求。要激活一个新进程处理客户请求,unix系统fork、exec,新进程处理客户请求,不需要对其他请求作出应答,服务完成后,关闭此进程与客户的通信链路。终止4. 返回第二步,等待另一个客户请求。5. 关闭服务端客户方:1. 打开一通信通道,并连接到服务器所在主机的特定端口。2. 向服务器发送服务请求报文,等待并接收应答;继续提出请求…….3. 请求结束以后关闭通信通道并终止。:1. 客户与服务器进程的作用非对称,编码不同2. 服务进程先于客户请求而启动,系统运行,服务进程一致存在,直到正常退出或强迫退出套接字类型:TCP/IP的socketSock_stream可靠的面对连接数据传输,无差错、无重复发送,安照顺序发送接收,内设流量控制,避免数据流超限,数据为字节流,无长度限制,ftp流套接字。Sock_DGRAM 无连接的服务,数据包以独立包的形式发送,不提供无措保证,数据可能丢失重复,发送接收的顺序混乱,网络文件系统nfs使用数据报式套接字。Sock_Ram 接口允许较底层协议,IP,ICMP直接访问,检查新的协议实现或访问现有服务中配置的新设备。服务端:using System.Nusing System.Net.Susing System.Tusing System.TTS// 清理所有正在使用的资源。protected override void Dispose( bool disposing ){try   {    socket.Close();//释放资源    mythread.Abort ( ) ;//中止线程   }   catch{ } if( disposing ){if (components != null) {components.Dispose();}}base.Dispose( disposing );} public static IPAddress GetServerIP(){IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());return ieh.AddressList[0];}private void BeginListen(){IPAddress ServerIp=GetServerIP();IPEndPoint iep=new IPEndPoint(ServerIp,8000);socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);byte[] byteMessage=new byte[100]; this.label1.Text=iep.ToString();socket.Bind(iep); // dowhile(true){try{socket.Listen(5);Socket newSocket=socket.Accept();newSocket.Receive(byteMessage);string sTime = DateTime.Now.ToShortTimeString ( ) ;string msg=sTime+":"+"Message from:"; msg+=newSocket.RemoteEndPoint.ToString()+Encoding.Default.GetString(byteMessage);this.listBox1.Items.Add(msg);}catch(SocketException ex){this.label1.Text+=ex.ToString();}}// while(byteMessage!=null);}//开始监听private void button1_Click(object sender, System.EventArgs e){try{mythread = new Thread(new ThreadStart(BeginListen));mythread.Start();}catch(System.Exception er){MessageBox.Show(er.Message,"完成",MessageBoxButtons.OK,MessageBoxIcon.Stop);} }客户端:using System.Nusing System.Net.Susing System.Tprivate void button1_Click(object sender, System.EventArgs e){BeginSend(); }private void BeginSend(){ string ip=this.txtip.Tstring port=this.txtport.TIPAddress serverIp=IPAddress.Parse(ip); int serverPort=Convert.ToInt32(port);IPEndPoint iep=new IPEndPoint(serverIp,serverPort); byte[] byteM // do// {Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);socket.Connect(iep); byteMessage=Encoding.ASCII.GetBytes(textBox1.Text);socket.Send(byteMessage);socket.Shutdown(SocketShutdown.Both);socket.Close();// }// while(byteMessage!=null);}基于TCP协议的发送和接收端TCP协议的接收端using System.Net.S //使用到TcpListen类using System.T //使用到线程 using System.IO ; //使用到StreamReader类int port = 8000; //定义侦听端口号private Thread thThreadR //创建线程,用以侦听端口号,接收信息private TcpListener tlTcpL //侦听端口号private bool blistener = //设定标示位,判断侦听状态private NetworkStream nsS //创建接收的基本数据流 private StreamReader srRprivate System.Windows.Forms.StatusBar statusBar1;private System.Windows.Forms.Button button1;private System.Windows.Forms.ListBox listBox1; //从网络基础数据流中读取数据private TcpClient tcCprivate void Listen ( ) { try { tlTcpListen = new TcpListener ( port ) ; //以8000端口号来初始化TcpListener实例tlTcpListen.Start ( ) ; //开始监听statusBar1.Text = "正在监听..." ; tcClient = tlTcpListen.AcceptTcpClient ( ) ; //通过TCP连接请求nsStream = tcClient.GetStream ( ) ; //获取用以发送、接收数据的网络基础数据流srRead=new StreamReader(nsStream);//以得到的网络基础数据流来初始化StreamReader实例
statusBar1.Text = "已经连接!";
while( blistener ) //循环侦听{ string sMessage = srRead.ReadLine();//从网络基础数据流中读取一行数据 if ( sMessage == "STOP" ) //判断是否为断开TCP连接控制码{ tlTcpListen.Stop(); //关闭侦听nsStream.Close(); //释放资源srRead.Close(); statusBar1.Text = "连接已经关闭!" ; thThreadRead.Abort(); //中止线程 } string sTime = DateTime.Now.ToShortTimeString ( ) ; //获取接收数据时的时间listBox1.Items.Add ( sTime + " " + sMessage ) ; } } catch ( System.Security.SecurityException ) { MessageBox.Show ( "侦听失败!" , "错误" ) ; } }//开始监听private void button1_Click(object sender, System.EventArgs e){thThreadRead = new Thread ( new ThreadStart ( Listen ) );thThreadRead.Start();//启动线程 button1.Enabled= }// 清理所有正在使用的资源。protected override void Dispose( bool disposing ){try { tlTcpListen.Stop(); //关闭侦听 nsStream.Close();srRead.Close();//释放资源 thThreadRead.Abort();//中止线程 } catch{}if( disposing ){if (components != null) {components.Dispose();}}base.Dispose( disposing );}TCP协议的发送端using System.Net.S //使用到TcpListen类using System.T //使用到线程using System.IO; //使用到StreamWriter类using System.N //使用IPAddress类、IPHostEntry类等private StreamWriter swW //用以向网络基础数据流传送数据 private NetworkStream nsS //创建发送数据的网络基础数据流 private TcpClient tcpCprivate System.Windows.Forms.Button button1;private System.Windows.Forms.TextBox textBox1;private System.Windows.Forms.Button button2;private System.Windows.Forms.TextBox textBox2;private System.Windows.Forms.StatusBar statusBar1;private System.Windows.Forms.Label label1;private System.Windows.Forms.Label label2; //通过它实现向远程主机提出TCP连接申请 private bool tcpConnect = //定义标识符,用以表示TCP连接是否建立//连接 private void button1_Click(object sender, System.EventArgs e){IPAddress ipR try { ipRemote = IPAddress.Parse ( textBox1.Text ) ; } catch //判断给定的IP地址的合法性{ MessageBox.Show ( "输入的IP地址不合法!" , "错误提示!" ) ;
} IPHostEntry ipH try { ipHost = Dns.Resolve ( textBox1.Text ) ;  } catch //判断IP地址对应主机是否在线{
MessageBox.Show ("远程主机不在线!" , "错误提示!" ) ;
} string sHostName = ipHost.HostN try { TcpClient tcpClient = new TcpClient(sHostName,8000);//对远程主机的8000端口提出TCP连接申请nsStream = tcpClient.GetStream();//通过申请,并获取传送数据的网络基础数据流  swWriter = new StreamWriter(nsStream);//使用获取的网络基础数据流来初始化StreamWriter实例button1.Enabled = button2.Enabled = tcpConnect = statusBar1.Text = "已经连接!" ; } catch { MessageBox.Show ( "无法和远程主机8000端口建立连接!" , "错误提示!" ) ;
} }//发送private void button2_Click(object sender, System.EventArgs e){if (textBox2.Text !="") { swWriter.WriteLine(textBox2.Text);//刷新当前数据流中的数据swWriter.Flush(); } else {MessageBox.Show("发送信息不能为空!","错误提示!"); }}// 清理所有正在使用的资源。protected override void Dispose( bool disposing ){if ( tcpConnect ) { swWriter.WriteLine ( "STOP" ) ; //发送控制码  swWriter.Flush (); //刷新当前数据流中的数据  nsStream.Close (); //清除资源swWriter.Close (); } if( disposing ){if (components != null) {components.Dispose();}}base.Dispose( disposing );}异步套接字BeginAcceptPublic IAsyncResult BeginAccept{AsyncCallback callback,object state}AsyncCallback异步回调方法 object state自定义对象, 返回IasyncResultUsing SNamespace mySocket{Public class Stateobject{Public StateObject(){构造函数逻辑}}}à&Using SUsing System.NUsing System.Net.SUsing System.TUsing System.TNamespace mysocket{Public Class StateObject{Public Socket worksocket=Public const int buffersize=1024;Public byte[] buffer=new byte[buffersize]; Public StringBuilder sb=new StringBuilder();Public StateObject(){}}}实现主机绑定和端口监听:Private IPAddress myIP=IPAddress.Parse(“127.0.0.1”);Private IPEndPoint MySPrivate Socket mySPrivate Socket HPrivate Static ManualResetEvent myreset =new ManualResetEvent(false);Try{IPHostEntry myhost=new IPHostEntry();Myhost=dns.gethostbyName(“”);String IPString =myhost.Addresslist[0].tostring();Myip=IPAddress.Parse(IPString);}Catch{MessageBox.Show(“您输入的IP地址格式不正确,重新输入!”);}Try{MyServer=new IPEndPoint(myIP,Int32.Parse(“Port”));Mysocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,Protocol.Tcp);Mysocket.Bind(Myserver);Mysocket.Listen(50);Thread thread=new Thread(new ThreadStart(target));Thread.Start();}Catch(Exception ee){}线程targetPrivate void target(){While(true){myReset.Reset();mysocket.BeginAccept(new AsyncCallBack(AcceptCallback),mysocket);myReset.WaitOne();}}异步回调方法AcceptCallBackPrivate void AcceptCallback(IAsyncResault ar){myReset.Set();Socket Listener=(Socket)ar.AsyncSHandler=Listener.EndAccept(ar);StateObject state=new StateObject();State.workSocket=Try{Byte[] byteData=System.Text.Encoding.BigEndianUnicode.GetBytes(“通话!”+”/n/r”);Handler.BeginSend(byuteData,0,byteData.Length,0,new AsyncCallback(SendCallback),handler);}Catch(Exception ee){MessageBox.Show(ee.Message);}Thread thread=new Thread(new ThreadStart(begreceive));Thread.Start();}
多线程:每个窗体自己都在不同的线程上面运行,如果需要在窗体之间交互,需要在线程之间交互当线程sleep,系统就使之退出执行队列,当睡眠结束,系统产生时钟中断,使该线程回到执行队列中,回复线程的执行。如果父线程先于子线程结束,那么子线程在父线程结束的时候被迫结束,Thread.Join()是父线程等待子线程结束。Abort带来的是不可回复的终止线程起始线程为主线程,前台线程全部结束,则主线程可以终止,后台线程无条件终止。前台线程不妨碍程序终止,一旦进程的所有前台线程终止,则clr调用任意一个还存活的后台线程的abort来彻底终止进程。挂起,睡眠(阻塞,暂停)Thread.Suspend不会使线程立即停止执行,直到线程到达安全点的时候它才可以将该线程挂起,如果线程尚未运行或这已经停止,则不能被挂起,调用thread.resume使另一个线程跳出挂起状态,继续执行。一个线程不能对另一个线程调用sleep,但是可以suspend。Lock可以把一段代码定义为互斥段critical section 互斥段在一个时刻内只允许一个线程进入执行,其他线程必须等待多线程公用对象,不应该使用lock,monitor提供了线程共享资源的方案,monitor可以锁定一个对象,线程只有得到锁才可以对该对象进行操作一个进程开始至少有一个主线程。系统加载程序时创建主执行线程消息队列与线程相关一开始创建线程就产生消息队列了,一个线程可以创建多个窗体,而发给这些窗体的消息都同意发送到同一个消息队列中了,消息结构中有msg.hwnd指出该条消息与哪个窗体相关DispatchMessage()函数依照这个保证消息分派处理自动化而且不会出错。线程控制方法:Start线程开始运行Sleep 是线程暂停一段指定时间Suspend 线程在到达安全点后暂停Abort 线程到达安全点后停止Resume 重新启动挂起的线程Join 当前线程等待其他线程运行结束。如果使用超时值,且线程在分配的时间内结束,方法返回true安全点:代码中的某些位置,这些位置公共语言运行时可以安全的执行自动垃圾回收,即释放未使用的变量并回收内存,调用线程的abort和suspend方法时,公共语言运行时将分析代码并确定线程停止运行的适当位置。
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 socket字节流 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信