02_socket编程_Socket详解

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紧急数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值