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