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万吨 我国海上稠油热采实现“三级跳”
- 简讯:我国高端电力装备研发获重大成果