1.服务器与客户端是怎样交互的?
服务器程序通过监听端口,来接收客户程序的连接请求。
ServerSocket server = new ServerSocket(8000); //监听8000端口
ServerSocket的构造方法负责在操作系统中注册一个端口8000,并且将当前服务注册为服务器进程。接下来服务器调用accept()方法,监听着端口
Socket client = server.accept(); //等待客户端连接请求,并返回客户端的Socket
Socket类提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream和输出流OutputStream对象。只需要从输入流读取,就可以接受来自对方的数据;只需要向输出流中写数据,就能向对方发送数据。
2.构造Socket
//常用的构造方法
Socket(String host,int prot);
Socket(InetAddress address , int prot)
设定等待建立连接的超时时间
Socket socket = new Socket();
SocketAddress remoteAddr = new IntSocketAddress("localhost",8000); //服务器监听的端口8000
socket.connect(remoteAddr,60000); //等待建立连接超时时间1分钟
3.获取Socket信息:
getInetAddress(); //获得远程服务器的IP地址
getPort(); //获得远程服务器的端口
getLocalAddress(); //获得客户端IP
getLocalProt();
getInputStream(); //获得输入流
getOutputStream(); //获得输出流
4.关闭或者半关闭Socket
当客户与服务器的通信结束,应该及时关闭Socket,以释放Socket占用的资源。通常关闭这种资源类的东东,我们都会在finally里面关闭,防止出现异常,导致close()没有执行
Socket socket = null;
try{
socket = new Socket("127.0.0.1","8000");
//...要处理的操作...
}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;
Socket提供了shutdownInput()和shutdownOutput(),仅仅关闭输入流和输出流,但是Socket没有关闭。在程序最后还是要关闭Socket
5.设置Socket的选项
TCP_NODELAY:表示立即发送数据
SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址
SO_TIMEOUT:表示接受数据时的等待超时时间
SO_LINGER:表示当执行Socket的close()方法时,是否立即关闭底层的Socket
SO_SNFBUF:表示发送数据的缓冲的大小
SO_RCVBUF:表示接受数据的缓冲区的大小
SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭
OOBINLINE:表示是否支持发送一个字节的tcp紧急数据