|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?
在客户端和服务真个数据交互完成后,一样平常必要封闭收集毗连。关于服务端来讲,必要封闭Socket和ServerSocket。
在封闭Socket后,客户端其实不会即刻感知自已的Socket已封闭,也就是说,在服务真个Socket封闭后,客户真个Socket的isClosed和isConnected办法仍旧会分离失掉false和true。但对已封闭的Socket的输出输入流举行操纵会抛出一个SocketException非常。
在封闭服务真个ServerSocket后,ServerSocket对象所绑定的端口被开释。这时候客户端将没法毗连服务端程序。上面的代码演示了在服务端封闭Socket后,客户端是所何反响的。
package server;
import java.net.*;
class Client
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 1234);
Thread.sleep(1000);
// socket.getOutputStream().write(1);
System.out.println("read() = " + socket.getInputStream().read());
System.out.println("isConnected() = " + socket.isConnected());
System.out.println("isClosed() = " + socket.isClosed());
}
}
public class CloseSocket
{
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket = new ServerSocket(1234);
while (true)
{
Socket socket = serverSocket.accept();
socket.close();
}
}
}
测试
实行上面的命令
java server.CloseSocket
java server.Client
运转了局
read() = -1
isConnected() = true
isClosed() = false
从下面的运转了局能够看出例程Client并未抛出SocketException非常。而在012行的read办法前往了-1。假如将socket.close往失落,客户真个read办法将处于堵塞形态。这是由于Java在发明没法从服务真个Socket失掉数据后,就经由过程read办法前往了-1。假如将011行的正文往失落,Client就会抛出一个SocketException非常。人人能够尝尝,并socket.close行改成serverSocket.close后,客户端就会抛出毗连非常:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
at chapter5.Client.main(CloseSocket.java:12)
显式地挪用close办法封闭ServerSocket并非必需的,在程序加入时将主动封闭ServerSocket。但经由过程close办法封闭ServerSocket,可使其他的ServerSocket对象绑定该端口。可使用ServerSocket类的isClosed和isBound办法判别ServerSocket是不是处于举动形态,以下面的代码所示:
ServerSocket serverSocket = new ServerSocket(1234);
if (serverSocket.isBound() == true && serverSocket.isClosed() == false)
System.out.println("serverSocket处于举动形态!");
else
System.out.println("serverSocket处于非举动形态!");
下面代码所示的“非举动形态”多是serverSocket对象已封闭,也多是serverSocket对象是利用ServerSocket类的默许机关办法创立的,并且未挪用bind办法绑定端口。在这里要注重的是isBound办法前往true其实不意味着serverSocket对象处于举动形态,挪用close办法其实不会将绑定形态置为false。这一点和Socket类的isConnected办法相似。
主要缺点就是:速度比较慢,没有C和C++快 |
|