java Socket用法詳解 Socket的構(gòu)造方法有以下幾種重載形式
在客戶/服務(wù)器通信模式中, 客戶端需要主動(dòng)創(chuàng)建與服務(wù)器連接的 Socket(套接字), 服務(wù)器端收到了客戶端的連接請(qǐng)求, 也會(huì)創(chuàng)建與客戶連接的 Socket. Socket可看做是通信連接兩端的收發(fā)器, 服務(wù)器與客戶端都通過 Socket 來收發(fā)數(shù)據(jù).
這篇文章首先介紹Socket類的各個(gè)構(gòu)造方法, 以及成員方法的用法, 接著介紹 Socket的一些選項(xiàng)的作用, 這些選項(xiàng)可控制客戶建立與服務(wù)器的連接, 以及接收和發(fā)送數(shù)據(jù)的行為.
一. 構(gòu)造Socket
(資料圖片僅供參考)
Socket的構(gòu)造方法有以下幾種重載形式:
Socket() Socket(InetAddress address, int port) throws UnknowHostException, IOException Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Socket(String host, int port) throws UnknowHostException, IOException Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException 除了第一個(gè)不帶參數(shù)的構(gòu)造方法以外, 其他構(gòu)造方法都會(huì)試圖建立與服務(wù)器的連接, 如果連接成功, 就返回 Socket對(duì)象; 如果因?yàn)槟承┰蜻B接失敗, 就會(huì)拋出IOException .
1.1 使用無(wú)參數(shù)構(gòu)造方法, 設(shè)定等待建立連接的超時(shí)時(shí)間
Socket socket = new Socket(); SocketAddress remoteAddr = new InetSocketAddress("localhost",8000); socket.connect(remoteAddr, 60000); //等待建立連接的超時(shí)時(shí)間為1分鐘
以上代碼用于連接到本地機(jī)器上的監(jiān)聽8000端口的服務(wù)器程序, 等待連接的最長(zhǎng)時(shí)間為1分鐘. 如果在1分鐘內(nèi)連接成功則connet()方法順利返回; 如果在1分鐘內(nèi)出現(xiàn)某種異常, 則拋出該異常; 如果超過1分鐘后, 即沒有連接成功, 也沒有出現(xiàn)其他異常, 那么會(huì)拋出 SocketTimeoutException. Socket 類的 connect(SocketAddress endpoint, int timeout) 方法負(fù)責(zé)連接服務(wù)器, 參數(shù)endpoint 指定服務(wù)器的地址, 參數(shù)timeout 設(shè)定超時(shí)數(shù)據(jù), 以毫秒為單位. 如果參數(shù)timeout 設(shè)為0, 表示永遠(yuǎn)不會(huì)超時(shí), 默認(rèn)是不會(huì)超時(shí)的.
1.2 設(shè)定服務(wù)器的地址
除了第一個(gè)不帶參數(shù)的構(gòu)造方法, 其他構(gòu)造方法都需要在參數(shù)中設(shè)定服務(wù)器的地址, 包括服務(wù)器的IP地址或主機(jī)名, 以及端口:
Socket(InetAddress address, int port) //第一個(gè)參數(shù)address 表示主機(jī)的IP地址 Socket(String host, int port) //第一個(gè)參數(shù)host 表示主機(jī)的名字
InetAddress 類表示服務(wù)器的IP地址, InetAddress 類提供了一系列靜態(tài)工廠方法, 用于構(gòu)造自身的實(shí)例, 例如:
//返回本地主機(jī)的IP地址 InetAddress addr1 = InetAddress.getLocalHost(); //返回代表 "222.34.5.7"的 IP地址 InetAddress addr2 = InetAddress.getByName("222.34.5.7"); //返回域名為"www.javathinker.org"的 IP地址 InetAddress addr3 = InetAddress.getByName("www.javathinker.org");
1.3 設(shè)定客戶端的地址
在一個(gè)Socket 對(duì)象中, 即包含遠(yuǎn)程服務(wù)器的IP 地址和端口信息, 也包含本地客戶端的IP 地址和端口信息. 默認(rèn)情況下, 客戶端的IP 地址來自于客戶程序所在的主機(jī), 客戶端的端口則由操作系統(tǒng)隨機(jī)分配. Socket類還有兩個(gè)構(gòu)造方法允許顯式地設(shè)置客戶端的IP 地址和端口:
//參數(shù)localAddr 和 localPort 用來設(shè)置客戶端的IP 地址和端口 Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
如果一個(gè)主機(jī)同時(shí)屬于兩個(gè)以上的網(wǎng)絡(luò), 它就可能擁有兩個(gè)以上的IP 地址. 例如, 一個(gè)主機(jī)在Internet 網(wǎng)絡(luò)中的IP 地址為 "222.67.1.34", 在一個(gè)局域網(wǎng)中的IP 地址為 "112.5.4.3". 假定這個(gè)主機(jī)上的客戶程序希望和同一個(gè)局域網(wǎng)的一個(gè)服務(wù)器程序(地址為:"112.5.4.45: 8000")通信, 客戶端可按照如下方式構(gòu)造Socket 對(duì)象:
InetAddress remoteAddr1 = InetAddress.getByName("112.5.4.45"); InetAddress localAddr1 = InetAddress.getByName("112.5.4.3"); Socket socket1 = new Socket(remoteAddr1, 8000, localAddr1, 2345); //客戶端使用端口2345
1.4 客戶連接服務(wù)器時(shí)可能拋出的異常
當(dāng)Socket 的構(gòu)造方法請(qǐng)求連接服務(wù)器時(shí), 可能會(huì)拋出下面的異常.
UnKnownHostException: 如果無(wú)法識(shí)別主機(jī)的名字或IP 地址, 就會(huì)拋出這種異常. ConnectException: 如果沒有服務(wù)器進(jìn)程監(jiān)聽指定的端口, 或者服務(wù)器進(jìn)程拒絕連接, 就會(huì)拋出這種異常. SocketTimeoutException: 如果等待連接超時(shí), 就會(huì)拋出這種異常. BindException: 如果無(wú)法把Socket 對(duì)象與指定的本地IP 地址或端口綁定, 就會(huì)拋出這種異常. 以上4中異常都是IOException的直接或間接子類. 如圖2-1所示.
IOException------- UnknownHostException
|---- InterruptedIOException ----------- SocketTimeoutException
|---- SocketException ----------- BindException
|---------- ConnectException
圖2-1 客戶端連接服務(wù)器時(shí)可能拋出的異常
二. 獲取Socket 的信息
在一個(gè)Socket 對(duì)象中同時(shí)包含了遠(yuǎn)程服務(wù)器的IP 地址和端口信息, 以及客戶本地的IP 地址和端口信息. 此外, 從Socket 對(duì)象中還可以獲得輸出流和輸入流, 分別用于向服務(wù)器發(fā)送數(shù)據(jù), 以及接收從服務(wù)器端發(fā)來的數(shù)據(jù). 以下方法用于獲取Socket的有關(guān)信息.
getInetAddress(): 獲得遠(yuǎn)程服務(wù)器的IP 地址. getPort(): 獲得遠(yuǎn)程服務(wù)器的端口. getLocalAddress(): 獲得客戶本地的IP 地址. getLocalPort(): 獲得客戶本地的端口. getInputStream(): 獲得輸入流. 如果Socket 還沒有連接, 或者已經(jīng)關(guān)閉, 或者已經(jīng)通過 shutdownInput() 方法關(guān)閉輸入流, 那么此方法會(huì)拋出IOException. getOutputStream(): 獲得輸出流, 如果Socket 還沒有連接, 或者已經(jīng)關(guān)閉, 或者已經(jīng)通過 shutdownOutput() 方法關(guān)閉輸出流, 那么此方法會(huì)拋出IOException. 這里有個(gè)HTTPClient 類的例子, 代碼我是寫好了, 也測(cè)試過了, 因?yàn)槠蚓筒毁N了. 這個(gè)HTTPClient 類用于訪問網(wǎng)頁(yè) www.javathinker.org/index.jsp. 該網(wǎng)頁(yè)位于一個(gè)主機(jī)名(也叫域名)為 www.javathinker.org 的遠(yuǎn)程HTTP服務(wù)器上, 它監(jiān)聽 80 端口. 在HTTPClient 類中, 先創(chuàng)建了一個(gè)連接到該HTTP服務(wù)器的Socket對(duì)象, 然后發(fā)送符合HTTP 協(xié)議的請(qǐng)求, 接著接收從HTTP 服務(wù)器上發(fā)回的響應(yīng)結(jié)果.
三. 關(guān)閉Socket
當(dāng)客戶與服務(wù)器的通信結(jié)束, 應(yīng)該及時(shí)關(guān)閉Socket , 以釋放Socket 占用的包括端口在內(nèi)的各種資源. Socket 的 close() 方法負(fù)責(zé)關(guān)閉Socket. 當(dāng)一個(gè)Socket對(duì)象被關(guān)閉, 就不能再通過它的輸入流和輸出流進(jìn)行I/O操作, 否則會(huì)導(dǎo)致IOException.
為了確保關(guān)閉Socket 的操作總是被執(zhí)行, 強(qiáng)烈建議把這個(gè)操作放在finally 代碼塊中:
Socket socket = null; try{socket = new Socket(www.javathinker.org,80); //執(zhí)行接收和發(fā)送數(shù)據(jù)的操作 .......... }catch(IOException e){e.printStackTrace(); }finally{try{if(socket != null) socket.close(); }catch(IOException e){e.printStackTrace();} }
Socket 類提供了3 個(gè)狀態(tài)測(cè)試方法.
isClosed(): 如果Socket已經(jīng)連接到遠(yuǎn)程主機(jī), 并且還沒有關(guān)閉, 則返回true , 否則返回false . isConnected(): 如果Socket曾經(jīng)連接到遠(yuǎn)程主機(jī), 則返回true , 否則返回false . isBound(): 如果Socket已經(jīng)與一個(gè)本地端口綁定, 則返回true , 否則返回false . 如果要判斷一個(gè)Socket 對(duì)象當(dāng)前是否處于連接狀態(tài), 可采用以下方式:
boolean isConnected = socket.isConnected() && !socket.isClosed();
四. 半關(guān)閉Socket
進(jìn)程A 與進(jìn)程B 通過Socket 通信, 假定進(jìn)程A 輸出數(shù)據(jù), 進(jìn)程B 讀入數(shù)據(jù). 進(jìn)程A 如何告訴進(jìn)程B 所有數(shù)據(jù)已經(jīng)輸出完畢? 下文略......
五. 設(shè)置Socket 的選項(xiàng)
Socket 有以下幾個(gè)選項(xiàng).
TCP_NODELAY: 表示立即發(fā)送數(shù)據(jù). SO_RESUSEADDR: 表示是否允許重用Socket 所綁定的本地地址. SO_TIMEOUT: 表示接收數(shù)據(jù)時(shí)的等待超時(shí)數(shù)據(jù). SO_LINGER: 表示當(dāng)執(zhí)行Socket 的 close()方法時(shí), 是否立即關(guān)閉底層的Socket. SO_SNFBUF: 表示發(fā)送數(shù)據(jù)的緩沖區(qū)的大小. SO_RCVBUF: 表示接收數(shù)據(jù)的緩沖區(qū)的大小. SO_KEEPALIVE: 表示對(duì)于長(zhǎng)時(shí)間處于空閑狀態(tài)的Socket , 是否要自動(dòng)把它關(guān)閉. OOBINLINE: 表示是否支持發(fā)送一個(gè)字節(jié)的TCP 緊急數(shù)據(jù). 5.1 TCP_NODELAY 選項(xiàng)
設(shè)置該選項(xiàng): public void setTcpNoDelay(boolean on) throws SocketException 讀取該選項(xiàng): public boolean getTcpNoDelay() throws SocketException 默認(rèn)情況下, 發(fā)送數(shù)據(jù)采用Negale 算法. Negale 算法是指發(fā)送方發(fā)送的數(shù)據(jù)不會(huì)立即發(fā)出, 而是先放在緩沖區(qū), 等緩存區(qū)滿了再發(fā)出. 發(fā)送完一批數(shù)據(jù)后, 會(huì)等待接收方對(duì)這批數(shù)據(jù)的回應(yīng), 然后再發(fā)送下一批數(shù)據(jù). Negale 算法適用于發(fā)送方需要發(fā)送大批量數(shù)據(jù), 并且接收方會(huì)及時(shí)作出回應(yīng)的場(chǎng)合, 這種算法通過減少傳輸數(shù)據(jù)的次數(shù)來提高通信效率.
如果發(fā)送方持續(xù)地發(fā)送小批量的數(shù)據(jù), 并且接收方不一定會(huì)立即發(fā)送響應(yīng)數(shù)據(jù), 那么Negale 算法會(huì)使發(fā)送方運(yùn)行很慢. 對(duì)于GUI 程序, 如網(wǎng)絡(luò)游戲程序(服務(wù)器需要實(shí)時(shí)跟蹤客戶端鼠標(biāo)的移動(dòng)), 這個(gè)問題尤其突出. 客戶端鼠標(biāo)位置改動(dòng)的信息需要實(shí)時(shí)發(fā)送到服務(wù)器上, 由于Negale 算法采用緩沖, 大大減低了實(shí)時(shí)響應(yīng)速度, 導(dǎo)致客戶程序運(yùn)行很慢.
TCP_NODELAY 的默認(rèn)值為 false, 表示采用 Negale 算法. 如果調(diào)用setTcpNoDelay(true)方法, 就會(huì)關(guān)閉 Socket的緩沖, 確保數(shù)據(jù)及時(shí)發(fā)送:
if(!socket.getTcpNoDelay()) socket.setTcpNoDelay(true);
如果Socket 的底層實(shí)現(xiàn)不支持TCP_NODELAY 選項(xiàng), 那么getTcpNoDelay() 和 setTcpNoDelay 方法會(huì)拋出 SocketException.
5.2 SO_RESUSEADDR 選項(xiàng)
設(shè)置該選項(xiàng): public void setResuseAddress(boolean on) throws SocketException 讀取該選項(xiàng): public boolean getResuseAddress() throws SocketException 當(dāng)接收方通過Socket 的close() 方法關(guān)閉Socket 時(shí), 如果網(wǎng)絡(luò)上還有發(fā)送到這個(gè)Socket 的數(shù)據(jù), 那么底層的Socket 不會(huì)立即釋放本地端口, 而是會(huì)等待一段時(shí)間, 確保接收到了網(wǎng)絡(luò)上發(fā)送過來的延遲數(shù)據(jù), 然后再釋放端口. Socket接收到延遲數(shù)據(jù)后, 不會(huì)對(duì)這些數(shù)據(jù)作任何處理. Socket 接收延遲數(shù)據(jù)的目的是, 確保這些數(shù)據(jù)不會(huì)被其他碰巧綁定到同樣端口的新進(jìn)程接收到.
客戶程序一般采用隨機(jī)端口, 因此出現(xiàn)兩個(gè)客戶程序綁定到同樣端口的可能性不大. 許多服務(wù)器程序都使用固定的端口. 當(dāng)服務(wù)器程序關(guān)閉后, 有可能它的端口還會(huì)被占用一段時(shí)間, 如果此時(shí)立刻在同一個(gè)主機(jī)上重啟服務(wù)器程序, 由于端口已經(jīng)被占用, 使得服務(wù)器程序無(wú)法綁定到該端口, 啟動(dòng)失敗. (第三篇文章會(huì)對(duì)此作出介紹).
為了確保一個(gè)進(jìn)程關(guān)閉Socket 后, 即使它還沒釋放端口, 同一個(gè)主機(jī)上的其他進(jìn)程還可以立即重用該端口, 可以調(diào)用Socket 的setResuseAddress(true) 方法:
if(!socket.getResuseAddress()) socket.setResuseAddress(true);
值得注意的是 socket.setResuseAddress(true) 方法必須在 Socket 還沒有綁定到一個(gè)本地端口之前調(diào)用, 否則執(zhí)行 socket.setResuseAddress(true) 方法無(wú)效. 因此必須按照以下方式創(chuàng)建Socket 對(duì)象, 然后再連接遠(yuǎn)程服務(wù)器:
Socket socket = new Socket(); //此時(shí)Socket對(duì)象未綁定本地端口,并且未連接遠(yuǎn)程服務(wù)器 socket.setReuseAddress(true); SocketAddress remoteAddr = new InetSocketAddress("localhost",8000); socket.connect(remoteAddr); //連接遠(yuǎn)程服務(wù)器, 并且綁定匿名的本地端口
或者:
Socket socket = new Socket(); //此時(shí)Socke 對(duì)象為綁定本地端口, 并且未連接遠(yuǎn)程服務(wù)器 socket.setReuseAddress(true); SocketAddress localAddr = new InetSocketAddress("localhost",9000); SocketAddress remoteAddr = new InetSocketAddress("localhost",8000); socket.bind(localAddr); //與本地端口綁定 socket.connect(remoteAddr); //連接遠(yuǎn)程服務(wù)器
此外, 兩個(gè)共用同一個(gè)端口的進(jìn)程必須都調(diào)用 socket.setResuseAddress(true) 方法, 才能使得一個(gè)進(jìn)程關(guān)閉 Socket后, 另一個(gè)進(jìn)程的 Socket 能夠立即重用相同端口.
5.3 SO_TIMEOUT 選項(xiàng)
設(shè)置該選項(xiàng): public void setSoTimeout(int milliseconds) throws SocketException 讀取該選項(xiàng): public int getSoTimeout() throws SocketException 當(dāng)通過Socket 的輸入流讀數(shù)據(jù)時(shí), 如果還沒有數(shù)據(jù), 就會(huì)等待. 例如, 在以下代碼中, in.read(buff) 方法從輸入流中讀入 1024個(gè)字節(jié):
byte[] buff = new byte[1024]; InputStream in = socket.getInputStream(); in.read(buff);
如果輸入流中沒有數(shù)據(jù), in.read(buff) 就會(huì)等待發(fā)送方發(fā)送數(shù)據(jù), 直到滿足以下情況才結(jié)束等待:
略...............
Socket 類的 SO_TIMEOUT 選項(xiàng)用于設(shè)定接收數(shù)據(jù)的等待超時(shí)時(shí)間, 單位為毫秒, 它的默認(rèn)值為 0, 表示會(huì)無(wú)限等待, 永遠(yuǎn)不會(huì)超時(shí). 以下代碼把接收數(shù)據(jù)的等待超時(shí)時(shí)間設(shè)為 3 分鐘:
if(socket.getSoTimeout() == 0) socket.setSoTimeout(60000 * 3); //注意, 原書中這里的代碼錯(cuò)誤, 里面的方法名字都少了"So"
Socket 的 setSoTimeout() 方法必須在接收數(shù)據(jù)之前執(zhí)行才有效. 此外, 當(dāng)輸入流的 read()方法拋出 SocketTimeoutException 后, Socket 仍然是連接的, 可以嘗試再次讀數(shù)據(jù):
socket.setSoTimeout(180000); byte[] buff = new byte[1024]; InputStream in = socket.getInputStream(); int len = -1; do{try{len = in.read(buff); //處理讀到的數(shù)據(jù) //......... }catch(SocketTimeoutException e){//e.printStackTrace(); System.out.println("等待讀超時(shí)!"); len = 0; } }while(len != -1);
例子ReceiveServer.java 和 SendClient.java 是一對(duì)簡(jiǎn)單的服務(wù)器/客戶程序. sendClient 發(fā)送字符串 "hello everyone" ,接著睡眠 1 分鐘, 然后關(guān)閉 Socket. ReceiveServer 讀取 SendClient 發(fā)送來的數(shù)據(jù), 直到抵達(dá)輸入流的末尾, 最后打印 SendClient 發(fā)送來的數(shù)據(jù).
ReceiveServer.java 略....... , SendClient.java 略..........
在 SendClient 發(fā)送字符串 "hello everyone" 后, 睡眠 1 分鐘. 當(dāng) SendClient 在睡眠時(shí), ReceiveServer 在執(zhí)行 in.read(buff) 方法, 不能讀到足夠的數(shù)據(jù)填滿 buff 緩沖區(qū), 因此會(huì)一直等待 SendClient 發(fā)送數(shù)據(jù). 如果在 ReceiveServer 類中 socket.setSoTimeout(20000) , 從而把等待接收數(shù)據(jù)的超時(shí)時(shí)間設(shè)為 20 秒, 那么 ReceiveServer 在等待數(shù)據(jù)時(shí), 每當(dāng)超過 20 秒, 就會(huì)拋出SocketTimeoutException . 等到 SendClient 睡眠 1 分鐘后, SendClient 調(diào)用 Socket 的 close() 方法關(guān)閉 Socket, 這意味著 ReceiveServer 讀到了輸入流的末尾, ReceiveServer 立即結(jié)束讀等待, read() 方法返回 -1 . ReceiveServer最后打印接收到的字符串 "hello everyone", 結(jié)果如下:
等待讀超時(shí)! 等待讀超時(shí)! hello everyone
5.4 SO_LINGER 選項(xiàng)
設(shè)置該選項(xiàng): public void setSoLinger(boolean on, int seconds) throws SocketException 讀取該選項(xiàng): public int getSoLinger() throws SocketException SO_LINGER 選項(xiàng)用來控制 Socket 關(guān)閉時(shí)的行為. 默認(rèn)情況下, 執(zhí)行 Socket 的 close() 方法, 該方法會(huì)立即返回, 但底層的 Socket 實(shí)際上并不立即關(guān)閉, 它會(huì)延遲一段時(shí)間, 直到發(fā)送完所有剩余的數(shù)據(jù), 才會(huì)真正關(guān)閉 Socket, 斷開連接.
如果執(zhí)行以下方法:
socket.setSoLinger(true, 0);
那么執(zhí)行Socket 的close() 方法, 該方法也會(huì)立即返回, 并且底層的 Socket 也會(huì)立即關(guān)閉, 所有未發(fā)送完的剩余數(shù)據(jù)被丟棄.
如果執(zhí)行以下方法:
socket.setSoLinger(true, 3600);
那么執(zhí)行Socket 的 close() 方法, 該方法不會(huì)立即返回, 而是進(jìn)入阻塞狀態(tài). 同時(shí), 底層的 Socket 會(huì)嘗試發(fā)送剩余的數(shù)據(jù). 只有滿足以下兩個(gè)條件之一, close() 方法才返回:
⑴ 底層的 Socket 已經(jīng)發(fā)送完所有的剩余數(shù)據(jù);
⑵ 盡管底層的 Socket 還沒有發(fā)送完所有的剩余數(shù)據(jù), 但已經(jīng)阻塞了 3600 秒(注意這里是秒, 而非毫秒), close() 方法的阻塞時(shí)間超過 3600 秒, 也會(huì)返回, 剩余未發(fā)送的數(shù)據(jù)被丟棄.
值得注意的是, 在以上兩種情況內(nèi), 當(dāng)close() 方法返回后, 底層的 Socket 會(huì)被關(guān)閉, 斷開連接. 此外, setSoLinger(boolean on, int seconds) 方法中的 seconds 參數(shù)以秒為單位, 而不是以毫秒為單位.
如果未設(shè)置 SO_LINGER 選項(xiàng), getSoLinger() 返回的結(jié)果是 -1, 如果設(shè)置了 socket.setSoLinger(true, 80) , getSoLinger() 返回的結(jié)果是 80.
Tips: 當(dāng)程序通過輸出流寫數(shù)據(jù)時(shí), 僅僅表示程序向網(wǎng)絡(luò)提交了一批數(shù)據(jù), 由網(wǎng)絡(luò)負(fù)責(zé)輸送到接收方. 當(dāng)程序關(guān)閉 Socket, 有可能這批數(shù)據(jù)還在網(wǎng)絡(luò)上傳輸, 還未到達(dá)接收方. 這里所說的 "未發(fā)送完的數(shù)據(jù)" 就是指這種還在網(wǎng)絡(luò)上傳輸, 未被接收方接收的數(shù)據(jù).
例子 SimpleClient.java 與 SimpleServer.java 所示是一對(duì)簡(jiǎn)單的客戶/服務(wù)器程序. SimpleClient 類發(fā)送一萬(wàn)個(gè)字符給 SimpleServer, 然后調(diào)用Socket 的 close() 方法關(guān)閉 Socket.
SimpleServer 通過 ServerSocket 的 accept() 方法接受了 SimpleClient 的連接請(qǐng)求后, 并不立即接收客戶發(fā)送的數(shù)據(jù), 而是睡眠 5 秒鐘后再接收數(shù)據(jù). 等到 SimpleServer 開始接收數(shù)據(jù)時(shí), SimpleClient 有可能已經(jīng)執(zhí)行了 Socket 的close() 方法, 那么 SimpleServer 還能接收到 SimpleClient 發(fā)送的數(shù)據(jù)嗎?
SimpleClient.java 略..., SimpleServer.java 略......
SimpleClient.java中
System.out.println("開始關(guān)閉 Socket"); long begin = System.currentTimeMillis(); socket.close(); long end = System.currentTimeMillis(); System.out.println("關(guān)閉Socket 所用的時(shí)間為:" + (end - begin) + "ms");
下面分 3 種情況演示 SimpleClient 關(guān)閉 Socket 的行為.
⑴ 未設(shè)置 SO_LINGER 選項(xiàng), 當(dāng) SimpleClient 執(zhí)行 Socket 的close() 方法時(shí), 立即返回, SimpleClient 的打印結(jié)果如下:
開始關(guān)閉 Socket 關(guān)閉Socket 所用的時(shí)間為:0ms
等到 SimpleClient 結(jié)束運(yùn)行, SimpleServer 可能才剛剛結(jié)束睡眠, 開始接收 SimpleClient 發(fā)送的數(shù)據(jù). 此時(shí)盡管 SimpleClient 已經(jīng)執(zhí)行了 Socket 的 close() 方法, 并且 SimpleClient 程序本身也運(yùn)行結(jié)束了, 但從 SimpleServer 的打印結(jié)果可以看出, SimpleServer 仍然接收到了所有的數(shù)據(jù). 之所以出現(xiàn)這種情況, 是因?yàn)楫?dāng) SimpleClient 執(zhí)行了 Socket 的 close() 方法后, 底層的 Socket 實(shí)際上并沒有真正關(guān)閉, 與 SimpleServer 的連接依然存在. 底層的 Socket 會(huì)存在一段時(shí)間, 直到發(fā)送完所有的數(shù)據(jù).
⑵ 設(shè)置SO_LINGER 選項(xiàng), socket.setSoLinger(true, 0). 這次當(dāng) SimpleClient 執(zhí)行 Socket 的 close() 方法時(shí), 會(huì)強(qiáng)行關(guān)閉底層的 Socket, 所有未發(fā)送完的數(shù)據(jù)丟失. SimpleClient 的打印結(jié)果如下:
開始關(guān)閉 Socket 關(guān)閉Socket 所用的時(shí)間為:0ms
從打印結(jié)果看出, SimpleClient 執(zhí)行 Socket 的 close() 方法時(shí), 也立即返回. 當(dāng) SimpleServer 結(jié)束睡眠, 開始接收 SimpleClient 發(fā)送的數(shù)據(jù)時(shí), 由于 SimpleClient 已經(jīng)關(guān)閉底層 Socket, 斷開連接, 因此 SimpleServer 在讀數(shù)據(jù)時(shí)會(huì)拋出 SocketException:
java.net.SocketException: Connection reset
⑶ 設(shè)置SO_LINGER 選項(xiàng), socket.setSoLinger(true, 3600). 這次當(dāng) SimpleClient 執(zhí)行 Socket 的close() 方法時(shí), 會(huì)進(jìn)入阻塞狀態(tài), 知道等待了 3600 秒, 或者底層 Socket 已經(jīng)把所有未發(fā)送的剩余數(shù)據(jù)發(fā)送完畢, 才會(huì)從 close() 方法返回. SimpleClient 的打印結(jié)果如下:
開始關(guān)閉 Socket 關(guān)閉Socket 所用的時(shí)間為:5648ms
當(dāng) SimpleServer 結(jié)束了 5 秒鐘的睡眠, 開始接收 SimpleClient 發(fā)送的數(shù)據(jù)時(shí), SimpleClient 還在這些 Socket 的close() 方法, 并且處于阻塞狀態(tài). SimpleClient 與 SimpleServer 之間的連接依然存在, 因此 SimpleServer 能夠接收到 SimpleClient 發(fā)送的所有數(shù)據(jù).
5.5 SO_RCVBUF 選項(xiàng)
設(shè)置該選項(xiàng): public void setReceiveBufferSize(int size) throws SocketException 讀取該選項(xiàng): public int getReceiveBufferSize() throws SocketException SO_RCVBUF 表示 Socket 的用于輸入數(shù)據(jù)的緩沖區(qū)的大小. 一般說來, 傳輸大的連續(xù)的數(shù)據(jù)塊(基于HTTP 或 FTP 協(xié)議的通信) 可以使用較大的緩沖區(qū), 這可以減少傳輸數(shù)據(jù)的次數(shù), 提高傳輸數(shù)據(jù)的效率. 而對(duì)于交互頻繁且單次傳送數(shù)據(jù)量比較小的通信方式(Telnet 和 網(wǎng)絡(luò)游戲), 則應(yīng)該采用小的緩沖區(qū), 確保小批量的數(shù)據(jù)能及時(shí)發(fā)送給對(duì)方. 這種設(shè)定緩沖區(qū)大小的原則也同樣適用于 Socket 的 SO_SNDBUF 選項(xiàng).
如果底層 Socket 不支持 SO_RCVBUF 選項(xiàng), 那么 setReceiveBufferSize() 方法會(huì)拋出 SocketException.
5.6 SO_SNDBUF 選項(xiàng)
設(shè)置該選項(xiàng): public void setSendBufferSize(int size) throws SocketException 讀取該選項(xiàng): public int getSendBufferSize() throws SocketException SO_SNDBUF 表示 Socket 的用于輸出數(shù)據(jù)的緩沖區(qū)的大小. 如果底層 Socket 不支持 SO_SNDBUF 選項(xiàng), setSendBufferSize() 方法會(huì)拋出 SocketException.
5.7 SO_KEEPALIVE 選項(xiàng)
設(shè)置該選項(xiàng): public void setKeepAlive(boolean on) throws SocketException 讀取該選項(xiàng): public boolean getKeepAlive() throws SocketException //原書中這個(gè)方法返回的類型是int 當(dāng) SO_KEEPALIVE 選項(xiàng)為 true 時(shí), 表示底層的TCP 實(shí)現(xiàn)會(huì)監(jiān)視該連接是否有效. 當(dāng)連接處于空閑狀態(tài)(連接的兩端沒有互相傳送數(shù)據(jù)) 超過了 2 小時(shí)時(shí), 本地的TCP 實(shí)現(xiàn)會(huì)發(fā)送一個(gè)數(shù)據(jù)包給遠(yuǎn)程的 Socket. 如果遠(yuǎn)程Socket 沒有發(fā)回響應(yīng), TCP實(shí)現(xiàn)就會(huì)持續(xù)嘗試 11 分鐘, 直到接收到響應(yīng)為止. 如果在 12 分鐘內(nèi)未收到響應(yīng), TCP 實(shí)現(xiàn)就會(huì)自動(dòng)關(guān)閉本地Socket, 斷開連接. 在不同的網(wǎng)絡(luò)平臺(tái)上, TCP實(shí)現(xiàn)嘗試與遠(yuǎn)程Socket 對(duì)話的時(shí)限有所差別.
SO_KEEPALIVE 選項(xiàng)的默認(rèn)值為 false, 表示TCP 不會(huì)監(jiān)視連接是否有效, 不活動(dòng)的客戶端可能會(huì)永遠(yuǎn)存在下去, 而不會(huì)注意到服務(wù)器已經(jīng)崩潰.
以下代碼把 SO_KEEPALIVE 選項(xiàng)設(shè)為 true:
if(!socket.getKeepAlive()) socket.setKeepAlive(true);
5.8 OOBINLINE 選項(xiàng)
設(shè)置該選項(xiàng): public void setOOBInline(boolean on) throws SocketException 讀取該選項(xiàng): public boolean getOOBInline() throws SocketException //原書中這個(gè)方法返回的類型是int 當(dāng) OOBINLINE 為 true 時(shí), 表示支持發(fā)送一個(gè)字節(jié)的 TCP 緊急數(shù)據(jù). Socket 類的 sendUrgentData(int data) 方法用于發(fā)送一個(gè)字節(jié)的 TCP緊急數(shù)據(jù).
OOBINLINE 的默認(rèn)值為 false, 在這種情況下, 當(dāng)接收方收到緊急數(shù)據(jù)時(shí)不作任何處理, 直接將其丟棄. 如果用戶希望發(fā)送緊急數(shù)據(jù), 應(yīng)該把 OOBINLINE 設(shè)為 true:
socket.setOOBInline(true);
此時(shí)接收方會(huì)把接收到的緊急數(shù)據(jù)
標(biāo)簽:
相關(guān)推薦:
精彩放送:
- []最新消息:標(biāo)準(zhǔn)股份:截至2022年12月20日,公司股東人數(shù)約為2.79萬(wàn)戶
- []全球今頭條!總結(jié)與展望:2022年銷售、投資回到五年前
- []風(fēng)云榜·現(xiàn)場(chǎng)丨“不確定性”籠罩,企業(yè)創(chuàng)新真的能驅(qū)動(dòng)增長(zhǎng)嗎?
- []當(dāng)前關(guān)注:鴻榮源壹方商置首個(gè)外拓項(xiàng)目成都西環(huán)·壹方里將于12月24日開業(yè)
- []太極股份:公司控股股東為中電太極(集團(tuán))有限公司
- []世界最新:一文了解國(guó)家電網(wǎng)的儲(chǔ)能布局
- []大理忙退房,三亞卻火爆?中國(guó)人現(xiàn)在到底敢不敢旅游
- []環(huán)球視點(diǎn)!英能基鈉離子量產(chǎn)基地在蓉落地簽約
- []中鐵建掛牌蘇州京兆地產(chǎn)20%股權(quán)以底價(jià)2億元成交
- []微導(dǎo)納米:國(guó)內(nèi)少數(shù)以ALD技術(shù)為核心的薄膜沉積設(shè)備生產(chǎn)商正式登陸科創(chuàng)板
- []【世界時(shí)快訊】紅星美凱龍為25億公司債增加增信 票面利率6.88%
- []廣東肇慶端州179畝臨江商住地終止出讓 起始價(jià)8.65億元
- []環(huán)球微動(dòng)態(tài)丨粉筆擬全球發(fā)售2000萬(wàn)股 股份將于2023年1月9日上市
- []焦點(diǎn)報(bào)道:科學(xué)城(廣州)投資集團(tuán)擬發(fā)行不超30億元公司債
- []風(fēng)險(xiǎn)警示股超130只 ST公司歲末開啟保殼沖刺模式
- []世界實(shí)時(shí):外匯交易提醒:美國(guó)三季度GDP上修,美元獲逢低買盤支撐
- []快資訊:數(shù)智化浪潮后,酒店業(yè)到底需要什么樣的創(chuàng)新?
- []熱議:浙江湖州南潯區(qū)與吳興區(qū)各掛牌一宗宅地 總起始價(jià)6.8億元
- []環(huán)球最資訊丨寶業(yè)地產(chǎn)4.55億元摘得宜昌五一廣場(chǎng)兩宗城鎮(zhèn)住宅地
- []即時(shí)焦點(diǎn):公積金自助機(jī)年底實(shí)現(xiàn)全覆蓋
- []溫州瑞安一宗商住地重新掛牌 預(yù)計(jì)1月31日出讓
- []外地人購(gòu)房無(wú)需社保!賣房1年內(nèi)重購(gòu)房退個(gè)稅!又一省會(huì)城市放松限購(gòu)…
- []證監(jiān)會(huì)放行符合條件的房企“借殼”已上市房企 股權(quán)融資新政助力優(yōu)質(zhì)房企改善資產(chǎn)負(fù)債表
- []房企配股再度潮起 小額融資緩解近渴
- []南京政策再調(diào)整:外地人購(gòu)房無(wú)需社保
- []【全球聚看點(diǎn)】5天三起超50億元股權(quán)交易 年末又現(xiàn)房企資產(chǎn)“出售潮”?
- []當(dāng)前短訊!能建城發(fā):沖刺年終總目標(biāo)“保交付”督導(dǎo)組下沉一線促落實(shí)
- []世界新消息丨陜西水生態(tài)環(huán)境質(zhì)量持續(xù)向好
- []環(huán)球簡(jiǎn)訊:重磅!正泰擬出售8000MW戶用光伏電站
- []每日速看!人工智能將建筑物冷卻能源成本降一成
- []頭條:報(bào)告顯示APEC各經(jīng)濟(jì)體經(jīng)貿(mào)有序恢復(fù)、合作活躍
- []環(huán)球快資訊丨硅片暴跌20%、電池15%、組件10%
- []全球快看點(diǎn)丨12月23日財(cái)經(jīng)早餐:美元上漲,美國(guó)數(shù)據(jù)支撐美聯(lián)儲(chǔ)鷹派立場(chǎng)持續(xù)更久的預(yù)期
- []當(dāng)前速遞!盛洋投資透過美國(guó)房地產(chǎn)基金平臺(tái)出售一項(xiàng)物業(yè) 代價(jià)4150萬(wàn)美元
- []今日熱議:公積金還款第一個(gè)月須知 公積金還款第一個(gè)月必須知道的事
- []重點(diǎn)聚焦!司機(jī)乘客險(xiǎn)各一萬(wàn)夠嗎 司機(jī)乘客險(xiǎn)一萬(wàn)夠不夠
- []德國(guó)股市收低;截至收盤DAX 30下跌1.30%
- []世界今日?qǐng)?bào)丨地產(chǎn)龍頭發(fā)布定增預(yù)案,機(jī)構(gòu)扎堆關(guān)注,4只機(jī)構(gòu)評(píng)級(jí)股上漲潛力超30%
- []焦點(diǎn)關(guān)注:保險(xiǎn)買了三年了想退怎么辦 保險(xiǎn)買了三年想退保該怎么辦
- []環(huán)球視訊!公積金怎么算 公積金的計(jì)算公式是什么
- []【天天聚看點(diǎn)】大悅城地產(chǎn)9.1億元收購(gòu)西安一宗商住用地
- []焦點(diǎn)日?qǐng)?bào):叫停10多年后重啟!房地產(chǎn),大招還有嗎?
- []焦點(diǎn)快報(bào)!月供要降!多地存量住房公積金貸款利率元旦下調(diào),專家稱史上最低
- []全球信息:菏澤公積金貸款額度怎么算 菏澤公積金貸款額度如何計(jì)算
- []【環(huán)球播資訊】證監(jiān)會(huì)允許!房企“借殼”上市重啟
- []承興投資于12月08日-22日增持中國(guó)寶安約3223.46萬(wàn)股
- []當(dāng)前要聞:實(shí)體店客流下降,股價(jià)卻直沖云霄!徐家匯發(fā)布異動(dòng)公告,這些資金參與炒作……
- []全球熱文:建科院:截至2022年12月20日,公司股東戶數(shù)為 18,268戶(含信用賬戶)
- []當(dāng)前要聞:茂業(yè)國(guó)際與成都金牛訂立搬遷補(bǔ)償協(xié)議 預(yù)計(jì)將獲4.16億補(bǔ)償
- []最新快訊!寶明科技:12月21日公司高管李軍增持公司股份合計(jì)9.51萬(wàn)股
- []環(huán)球要聞:絲路視覺:12月21日公司高管李萌迪減持公司股份合計(jì)25.62萬(wàn)股
- []世界訊息:三羊馬:12月21日公司高管任敏、李剛?cè)珳p持公司股份合計(jì)7.91萬(wàn)股
- []環(huán)球熱頭條丨博匯股份:12月21日公司高管尤丹紅減持公司股份合計(jì)13.8萬(wàn)股
- []【熱聞】南都物業(yè)近12個(gè)月累計(jì)涉及訴訟、仲裁金額約1.26億元
- []精選!美的置業(yè)擬發(fā)行不超5億元公司債券,利率最高4.5%
- []國(guó)聯(lián)股份:12月21日公司高管劉俊宅、田濤增持公司股份合計(jì)200股
- []全球關(guān)注:成大生物:12月21日公司高管張庶民增持公司股份合計(jì)1.6萬(wàn)股
- []環(huán)球速讀:安井食品:12月22日公司高管劉鳴鳴、張清苗減持公司股份合計(jì)23.74萬(wàn)股
- []【全球熱聞】安徽省經(jīng)信廳護(hù)航防疫藥品生產(chǎn) 預(yù)計(jì)月底全省可調(diào)配布洛芬累計(jì)將達(dá)1億片
- []【全球新視野】子公司擬增資引進(jìn)華潤(rùn)系投資人 立方制藥籌劃置出醫(yī)藥商業(yè)批發(fā)配送資產(chǎn)
- []今日聚焦!行業(yè)透視 | 第三支箭春風(fēng)吹,定增潮涌現(xiàn)
- []當(dāng)前觀察:ST八菱:比亞迪目前不是公司客戶
- []建發(fā)物業(yè)子公司339.35萬(wàn)出售廈門兆慧25%股權(quán)
- []當(dāng)前熱議!銀座股份:控股股東魯商集團(tuán)增持計(jì)劃已完成 累計(jì)增持520萬(wàn)股
- []全球熱訊:上交所:深入推進(jìn)股票發(fā)行注冊(cè)制改革 加大機(jī)構(gòu)投資者培育力度
- []【播資訊】上交所:穩(wěn)妥有序化解債券違約等重點(diǎn)領(lǐng)域風(fēng)險(xiǎn)
- []環(huán)球熱門:華業(yè)香料:公司主要產(chǎn)品為內(nèi)酯系列合成香料,未生產(chǎn)消毒劑
- []全球焦點(diǎn)!華夏基金:華夏和達(dá)高科REIT上市定檔于12月27日
- []上交所:繼續(xù)優(yōu)化互聯(lián)互通機(jī)制安排 完善跨境投融資體系
- []天臣醫(yī)療:公司電動(dòng)吻合器已于2022年6月完成開發(fā)并取得NMPA產(chǎn)品注冊(cè)證
- []甜啦啦X口口椰,同行聯(lián)名決出新高度
- []最新:【互動(dòng)掘金】曠達(dá)科技:抗病毒面料已研發(fā)成功 針對(duì)甲流病毒H1N1抗病毒活性率達(dá)99.9%
- []今日快看!聚焦海外市場(chǎng)準(zhǔn)入 | 北德云課堂(二十二)意大利并網(wǎng)新標(biāo)準(zhǔn)及市場(chǎng)分析
- []釩鈦股份:人民幣貶值有利于我國(guó)出口業(yè)務(wù),公司也將借此契機(jī)積極提高出口業(yè)務(wù)量
- []前沿?zé)狳c(diǎn):馬士基智能、綠色綜合物流旗艦倉(cāng)落戶上海臨港 預(yù)計(jì)總投資超10億元
- []世界今熱點(diǎn):江蘇國(guó)泰:公司下屬子公司寧德華榮年產(chǎn)40萬(wàn)噸鋰離子電池電解液項(xiàng)目目前正在有序推進(jìn)中
- []環(huán)球最新:上交所:推動(dòng)房地產(chǎn)業(yè)向新發(fā)展模式平穩(wěn)過渡 助力數(shù)字經(jīng)濟(jì)和平臺(tái)企業(yè)發(fā)展
- []資訊推薦:路勁:就深圳鹽田區(qū)海濤花園城更項(xiàng)目成立合資企業(yè)有關(guān)的轉(zhuǎn)讓建議
- []今日視點(diǎn):石化油服:公司現(xiàn)有股東總數(shù)約為13萬(wàn)戶
- []世界快報(bào):大連時(shí)泰城發(fā)總價(jià)超24.93億元競(jìng)得金普新區(qū)34宗地 總面積約102.52萬(wàn)平
- []普洛斯日本風(fēng)險(xiǎn)投資基金一期“MVP I”首輪關(guān)賬130億日元
- []今日熱門!國(guó)際油價(jià)四連漲,來年有望升至100美元
- []即時(shí)焦點(diǎn):NYMEX原油上看79.26美元
- []榮耀加冕 大道可期 | WotoKOL臥兔榮獲星球獎(jiǎng)BrandStar Awards 2022服務(wù)創(chuàng)新獎(jiǎng)!
- []【天天速看料】北京擬面向民間資本推介重點(diǎn)領(lǐng)域項(xiàng)目101個(gè) 總投資2093億元
- []【焦點(diǎn)熱聞】新黃浦:擬向不超過35名特定投資者非公開發(fā)行股票 用于房地產(chǎn)項(xiàng)目
- []環(huán)球快資訊:甘源食品:截止12月20日,公司的股東總戶數(shù)為7532名
- []成都9.88億元成交彭州、大邑、高新三宗地 都江堰地塊流拍
- []環(huán)球焦點(diǎn)!煌上煌:截至2022年12月20日公司股東人數(shù)為53,916人
- []世界熱推薦:北辰實(shí)業(yè)13.39億元公司債擬付息 利率3.46%
- []棒杰股份:公司目前生產(chǎn)的內(nèi)衣內(nèi)褲等貼身服飾的功能性面料具有抗菌相關(guān)指標(biāo)要求
- []熱門看點(diǎn):天地在線:針對(duì)預(yù)制菜領(lǐng)域,公司2020年投資了“老飯骨”品牌公司夏熵烐,持有其9.892%的股權(quán)
- []天天訊息:海安開發(fā)區(qū)建投30億元私募債項(xiàng)目更新為“已反饋”
- []出游意愿不足成不爭(zhēng)事實(shí),旅游業(yè)何時(shí)迎春?
- []“新十條”為海南旅游吹響復(fù)蘇號(hào)角,海南機(jī)票預(yù)訂環(huán)比增長(zhǎng)68%
- []黃金、七大貨幣對(duì)的“多空底牌”一覽(2022/12/22周四)
- []美原油交易策略:庫(kù)存下降+假日需求高峰季來臨,多頭劍指80關(guān)口上方
- []當(dāng)前快報(bào):12月22日匯市觀潮:歐元、英鎊和日元技術(shù)分析
- []環(huán)球今熱點(diǎn):現(xiàn)貨黃金交易策略:初請(qǐng)數(shù)據(jù)來襲,美元走弱或助多頭“攻城拔寨”
- []全球看熱訊:黃金市場(chǎng)分析:下方繼續(xù)關(guān)注1810與1800美元支撐,上方關(guān)注1824美元阻力
- 每日簡(jiǎn)訊:鈉離子之光 開啟新能源時(shí)代萬(wàn)億賽道 英能基鈉離子量產(chǎn)基地在蓉落地簽約
- 天天簡(jiǎn)訊:削峰1元/度!浙江開啟第三方獨(dú)立主體電力輔助服務(wù)首次結(jié)算試運(yùn)行!
- 世界焦點(diǎn)!歐洲儲(chǔ)能協(xié)會(huì)(EASE)表示認(rèn)同歐盟電池和儲(chǔ)能政策
- 襄陽(yáng)生產(chǎn)線投產(chǎn)!刀片電池將成為比亞迪大舉進(jìn)軍儲(chǔ)能的新王牌!
- java Socket用法詳解 Socket的構(gòu)造方法有以下幾種重載形式
- 視焦點(diǎn)訊!吉祥航空:正在掉隊(duì)?
- 全球看點(diǎn):德固特:謝謝您的寶貴建議,如果公司有相關(guān)決定,將會(huì)根據(jù)要求及時(shí)披露
- 當(dāng)前熱議!地產(chǎn)“壓力山大”,多家房企出售旗下物業(yè)股權(quán)“救急”
- 焦點(diǎn)熱文:重慶將在12月底發(fā)放上億元消費(fèi)券 促進(jìn)文旅市場(chǎng)回暖
- 眾望布藝:該項(xiàng)目目前正處于前期籌備階段
- B站注冊(cè)資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨(dú)家財(cái)務(wù)顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年?duì)I收11.24億元 期內(nèi)研發(fā)費(fèi)用投入增長(zhǎng)19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場(chǎng)總庫(kù)存約30萬(wàn)噸
- 嘉銀金科發(fā)布2021年Q2財(cái)報(bào) 期內(nèi)凈利潤(rùn)達(dá)1.27億元同比增長(zhǎng)208%
- 成都銀行2021上半年凈利33.89億元 期內(nèi)實(shí)現(xiàn)營(yíng)收同比增長(zhǎng)17.27億元
- 汽車之家發(fā)布2021年第二季度業(yè)績(jī) 期內(nèi)新能源汽車品牌收入增長(zhǎng)238%
- 中信銀行上半年實(shí)現(xiàn)凈利潤(rùn)290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價(jià)格創(chuàng)新高 全天成交額達(dá)1.29億元
- 上半年生物藥大增45% 關(guān)鍵財(cái)務(wù)指標(biāo)好轉(zhuǎn)營(yíng)收賬款持續(xù)下降
- 元宇宙扣籃大賽|科技打破界與限
- 從數(shù)字化轉(zhuǎn)型到做原生數(shù)字化企業(yè),你的選擇對(duì)了么?
- 【世界獨(dú)家】第一波北京“陽(yáng)康”都去哪兒了?
- 12月22日水井坊漲停分析:白酒概念熱股
- 環(huán)球熱推薦:雪場(chǎng)等“春天”
- 成都入境隔離從 5+3 改為 2+3 ?
- 環(huán)球簡(jiǎn)訊:吳興交通旅游投資5.12億元競(jìng)得湖州吳興1宗商住用地
- 12月22日安奈兒漲停分析:抗菌面料,優(yōu)化生育(三孩),紡織服裝概念熱股
- 每日視點(diǎn)!加速新能源布局,臥龍電驅(qū)發(fā)揮產(chǎn)業(yè)協(xié)同進(jìn)軍儲(chǔ)能市場(chǎng)
- 廣州取消“二手房參考價(jià)”?住建局工作人員:目前未看到文件
- 簡(jiǎn)訊:湖州城投7.95億元競(jìng)得湖州吳興1宗商住用地
- 環(huán)球新消息丨央行:引導(dǎo)金融機(jī)構(gòu)支持房地產(chǎn)行業(yè)重組并購(gòu),推動(dòng)防范化解優(yōu)質(zhì)頭部房企風(fēng)險(xiǎn)
- 當(dāng)前信息:蘭石重裝:公司主要產(chǎn)品壓力容器、換熱器、廢熱鍋爐等廣泛應(yīng)用于節(jié)能供熱領(lǐng)域
- 世界熱議:吳興經(jīng)開建設(shè)3.16億元競(jìng)得湖州吳興區(qū)1宗商住用地
- 12月22日中農(nóng)聯(lián)合漲停分析:供銷社,大農(nóng)業(yè),蟲害防治概念熱股
- 12月22日沈陽(yáng)化工漲停分析:阿里巴巴概念股,振興東北,國(guó)企改革概念熱股
- 高質(zhì)量踐行ESG發(fā)展理念|晶科能源斬獲新浪財(cái)經(jīng)中國(guó)企業(yè)ESG“金責(zé)獎(jiǎng)”
- 晶科能源再登《哈佛商業(yè)評(píng)論》2022中國(guó)新增長(zhǎng)?ESG創(chuàng)新實(shí)踐榜
- 當(dāng)施工現(xiàn)場(chǎng)遇上高科技,這個(gè)工地“智商”有點(diǎn)高
- 運(yùn)動(dòng)耳機(jī)哪款值得買?追求佩戴體驗(yàn)首選韶音OpenRun Pro
- 茉莉礦機(jī)JASMINER的成功有跡可循
- 每日頭條!安徽省電力中長(zhǎng)期交易實(shí)施方案(2023年版)發(fā)布!
- 今年籌建超1000家,中國(guó)高端酒店提前“內(nèi)卷”進(jìn)入品質(zhì)時(shí)代
- 天天快資訊丨科士達(dá)簽2.1億美元訂單金額占去年?duì)I收超五成
- 踔厲風(fēng)發(fā) 歲末巨獻(xiàn)|2022貴陽(yáng)汽車文化節(jié)12月22-25日開幕!
- 焦點(diǎn)資訊:山東單體最大儲(chǔ)能項(xiàng)目并網(wǎng)!今年已簽約/立項(xiàng)超10GWh!中廣核2022年儲(chǔ)能布局一覽
- 熱消息:民航逼近2005年
- 環(huán)球短訊!這個(gè)直轄市出手!二套房公積金貸款首付降至四成!今年超70城"認(rèn)貸不認(rèn)房"
- 天天熱推薦:家居丨鳴志電器:新永恒持股比例減少至7.9%
- 天天新資訊:力爭(zhēng)到2025年 浙江杭州儲(chǔ)能產(chǎn)業(yè)規(guī)模達(dá)400億元
- 新媒股份:公司推出的手機(jī)端“喜粵TV”app主要用于強(qiáng)化廣東IPTV會(huì)員生態(tài)運(yùn)營(yíng)、推動(dòng)大小屏應(yīng)用聯(lián)結(jié)
- 每日時(shí)訊!家居丨正泰電器:擬吸收合并三家全資子公司
- 速讀:昇輝科技:公司正持續(xù)與產(chǎn)業(yè)鏈上下游對(duì)接資源,期待與業(yè)界優(yōu)秀的整車品牌廠商合作
- 財(cái)面兒丨旭輝控股集團(tuán)控股股東購(gòu)買公司100萬(wàn)股股份
- 深圳瑞捷:公司參與了如深圳市深圳市在建水務(wù)工程建設(shè)項(xiàng)目紅黑榜等在建水務(wù)工程施工安全質(zhì)量方面的相關(guān)業(yè)務(wù)
- 環(huán)球熱訊:家居丨正泰電器:擬吸收合并樂清祥如等三家全資子公司
- 自媒體軟文怎么寫? 軟文發(fā)布后如何擁有更好的效果?
- 全球快資訊丨三立期貨12月22日早間內(nèi)參——宏觀
- 消除緊固件故障,漢高樂泰螺紋鎖固膠保障生產(chǎn)安全無(wú)憂
- 當(dāng)前通訊!2022年英鎊表現(xiàn)不佳,大摩稱新的一年可能成為佼佼者!
- 世界快資訊:溫州“鎳王”子公司港股IPO,“青山系”浮出水面
- 爭(zhēng)奪“第一城”,蘇州瞄準(zhǔn)萬(wàn)億目標(biāo)
- 經(jīng)濟(jì)第一大省,開始逆向“搶人”了
- 5天誕生3起50億元+股權(quán)交易,年末房企股權(quán)出售潮來了?
- springboot&日志&aop管理日志 定時(shí)任務(wù)、異步調(diào)用、讀取配置文件
- 匯中股份:截至2022年12月20日,公司股東人數(shù)為7517
- 重磅!時(shí)隔12年,證監(jiān)會(huì)重啟房企借殼上市大門
- 環(huán)球觀察:耶魯大學(xué)耗時(shí)5年的研究成果 左腦與右腦的神奇功能研究
- 當(dāng)前關(guān)注:Windows下【AxureRP】原型設(shè)計(jì)工具破解碼與安裝包 安裝步驟
- 熱訊:讀書筆記-袁騰飛講高效學(xué)習(xí)法 高效能學(xué)生的七大法寶
- 快看:清華2019最新AI發(fā)展報(bào)告出爐:13大領(lǐng)域一文看懂
- 天天快看點(diǎn)丨華北制藥:公司下屬華諾公司有翁瀝通、燒傷噴霧劑、小兒化痰止咳顆粒等中藥產(chǎn)品,市場(chǎng)銷售占比較低
- 時(shí)訊:SimpleDateFormate解析字符串變成 Date 類型
- 世界今日訊!緩沖區(qū)問題 輸入緩沖區(qū)的管理方式
- 全球看點(diǎn):關(guān)于葛曉非的介紹 你知道多少?
- 環(huán)球視訊!曲靖二中校長(zhǎng)李舜榮:曲靖中統(tǒng)招生實(shí)際錄取最低分?jǐn)?shù)
- 新一輪房地產(chǎn)救市政策已全面進(jìn)入熱點(diǎn)城市
- 觀天下!針式打印機(jī)怎么調(diào)整打印范圍?針式打印機(jī)調(diào)整打印位置的方法
- 焦點(diǎn)速訊:汽車鑰匙丟了怎么辦配一把多少錢?汽車鑰匙丟了怎么補(bǔ)救?
- 潛行者是好人還是狼人?狼人殺潛行者角色什么功能?
- linux安裝jdk8怎么裝?手把手教你安裝單機(jī)版Hadoop3.2.1
- 當(dāng)前時(shí)訊:利用活躍變量分析來去掉vmp的大部分垃圾指令 活躍性計(jì)算的方法
- 【全球快播報(bào)】
百度云資源分享 百度云干貨資源 - 環(huán)球焦點(diǎn)!php運(yùn)算符= %3c%3c%3c PHP命令及代碼
- 亂碼問題怎么解決?Ubuntu9.04上看電影加載中文字幕亂碼問題
- 當(dāng)前速讀:嚇唬的意思是什么?嚇唬怎么造句?
王道大綱解析系列之計(jì)算機(jī)組成原理 - 稀奇古怪樂小米是什么?關(guān)于稀奇古怪樂小米的介紹
- FASTQ格式是什么?FASTQ格式詳情
- 環(huán)球觀天下!臺(tái)灣省停電后 竟要求程序員用紙筆手寫代碼
- 每日信息:ffmpeg源碼分析:結(jié)構(gòu)體成員管理系統(tǒng)-AVOption
- 北京民俗文化有哪些?關(guān)于北京民俗文化的介紹
- 天天報(bào)道:400-500分上的醫(yī)科大學(xué)名單黑龍江 2023年參考醫(yī)科大學(xué)錄取名單
- 娛樂爆料:王麗坤、李冰冰、周杰倫、劉昊然、朱一龍
- 木格措海拔有多高?關(guān)于木格措海拔的介紹
- 最新資訊:JavaEE---Servlet入門教程 JavaEE操作步驟
- 環(huán)球熱點(diǎn)!香茅是什么味道?香茅是什么植物?
- 焦點(diǎn)!版載千秋第3個(gè)隱藏任務(wù)怎么過?版載千秋答題器
- 全球速讀:嵩天老師的零基礎(chǔ)Python筆記 詳情介紹
- 世界時(shí)訊:蘋果手機(jī)越獄后怎樣恢復(fù)?蘋果手機(jī)恢復(fù)回越獄前的方法
- 環(huán)球觀焦點(diǎn):5個(gè)優(yōu)秀的國(guó)產(chǎn)開源低代碼開發(fā)平臺(tái)推薦 低代碼開發(fā)平臺(tái):J2Pa、cgBoot、華炎魔方
- 今日熱門!使命召喚10下載地址是什么?使命召喚11中文版下載迅雷
- 最新:TSLAM9是什么?中心差分卡爾曼濾波
- 人均gdp是什么意思?人均gdp的含義
- 今日聚焦!大連市房產(chǎn)局官網(wǎng)怎么查詢?大連市房產(chǎn)局官網(wǎng)
- 環(huán)球快看:搬磚是什么意思?dnf搬磚的含義
- 【環(huán)球速看料】ape音樂免費(fèi)下載 ape音樂怎么下載?
- 外匯交易提醒:日元在震蕩交投中回落,美元兌日元小幅反彈
- 當(dāng)前播報(bào):紋的組詞有哪些?紋的組詞有什么?
- 每日?qǐng)?bào)道:DTA決賽放送:Z世代、元宇宙……酒旅業(yè)創(chuàng)新趨勢(shì)都在這里 |
- 原油交易提醒:庫(kù)存大降助力油價(jià)飆升超3%,警惕地緣局勢(shì)不確定性風(fēng)險(xiǎn)上升
- 僑銀股份預(yù)中標(biāo)廣州荔灣和萊州兩個(gè)服務(wù)項(xiàng)目 總成交金額約1.79億
- 天天播報(bào):嘉興嘉善2宗涉宅地6.16億成交 三達(dá)房地產(chǎn)封頂價(jià)獲其一
- 湖州德清一宗商住地將于明年1月11日出讓 起始價(jià)3.48億元
- 每日?qǐng)?bào)道:2022年市場(chǎng)規(guī)模將超6000億元 我國(guó)智能家居產(chǎn)業(yè)發(fā)展打開新空間
- 12月22日重點(diǎn)數(shù)據(jù)和大事件前瞻
- 每日熱文:已有25家房企發(fā)布配股或定增 雅居樂第2次公告配售后股價(jià)跌超17%
- 湖南電力“滿格” 水利顯威
- 天天播報(bào):年產(chǎn)首次突破50萬(wàn)噸 我國(guó)海上稠油熱采實(shí)現(xiàn)“三級(jí)跳”
- 簡(jiǎn)訊:我國(guó)高端電力裝備研發(fā)獲重大成果