Android Socket编程要点简记

	                 //创建服务器连接
			Socket socket		=new Socket("192.168.1.1", 8080);
			//数据包装
			OutputStream os		=socket.getOutputStream();
			OutputStreamWriter osw=new OutputStreamWriter(os);
			BufferedWriter bw	=new BufferedWriter(osw);
			//写入数据
			bw.write("hello world!\r\n\r\n");
			//刷新发送
			bw.flush();
			
			//包装
			InputStream is			=socket.getInputStream();
			InputStreamReader isr	=new InputStreamReader(is);
			BufferedReader br		=new BufferedReader(isr);
			String str	="";
			//循环读取
			while ((str=br.readLine())!=null) {
				System.out.println(str);
			}
			//记得关流
			os.close();
			is.close();
			socket.close();
			/**
			 * 那些情况会关流
			 * 一般我们调用socket.close()就会关闭留,但还有其他情况也会关闭socket流
			 * 1.直接调用socket.close();
			 * 2.只要inputStream和OutputStream流有一个关闭了,则网络连接自动关闭如(inputStream.close();和outputStream.close(););
			 * 3.在程序退出时网络连接自动关闭
			 * 4.将socket置为null是,虚拟机就会回收这个对象,所以也会关闭连接。
			 * 5.在Socket被新的Socket对象覆盖也同4那样关闭连接
			 * 
			 * Socket.isClose()可以查看Socket是否已经关闭
			 * 
			 */
			
			//用Socket.connect方法连接服务器
			Socket socket2		=new Socket();
			socket2.connect(new InetSocketAddress("192.168.1.1", 8080));
			//设置连接超时
			socket2.connect(new InetSocketAddress("192.168.1.1", 8080),5000);
			
			/**
			 * 网络连接超时有两种,连接超时和读取超时
			 * 
			 * 1.只有通过 Socket.connect 方法才能指定连接超时的时间。
			 * 由于使用 connect 方法连接服务器必
			 * 须要指定IP 和端口,因此,无效的 IP 或端口将会抛出连接超时异常。 
			 * 2.在连接服务器成功后,Socket 所做的最重要的两件事就是“接收数据”和“发送数据”,而在
			 *	接收数据时可能因为网络延迟、网络阻塞等原因,客户端一直处于等待状态,当客户端等待一段时
			 *	间后,如果服务器还没有发送数据到客户端,那么客户端Socket 将会抛出一个超时异常。 
			 *	我们可以通过Socket.setSoTimeout方法来设置读取数据超时的时间。时间的单位是毫秒。这个
			 *	方法必须在读取数据之前调用才会生效。如果将超时时间设为0,则不使用超时时间。也就是说,
			 *	客户端什么时候和服务器断开,将完全取决于服务端程序的超时设置。如下面的代码将读取数据超
			 *	时时间设为5秒。
			 * Socket socket		=new Socket();
			 * socket.setSoTimeout(5000);
			 * socket.connect(...);
			 * socket.getInputStream().read();
			 * 要注意的是不要将设置连接超时和读取数据超时设置得太小,如果值太小,如100,可能会造
			 * 成服务器的数据还没来得及发过来,客户端就抛出超时异常的现象。
			 * 
			 * 
			 */
			
			//设置关闭延迟,有时候在需要关闭连接时还有数据要发就需要设置这个关闭延迟
			socket.setSoLinger(true, 30000);
			
			
			//Socket的可用选项
			//TcpNodelay发送不延迟,当数据包很小的时候会等待连接到大包上一起
			//发送出去,设置了这个就可以关闭这个功能,立刻发送出去不延迟
			socket.setTcpNoDelay(true);
			//so_reuseaddr设置这个可以使多个Socket对象绑在同一个端口上
			socket.setReuseAddress(true);
			//so_timeout读取数据延迟
			socket.setSoTimeout(5000);
			//so_sndbuf默认情况下发送缓冲大小为8KB,可以在这里改这个值
			socket.getSendBufferSize();
			socket.setSendBufferSize(10*1024);
			//so_rcvbuf接收缓冲大小,默认也为8KB
			socket.getReceiveBufferSize();
			socket.setReceiveBufferSize(10*1024);
			//so_keepalive 默认关闭,如果将这个 Socket 选项打开,客户端 Socket 每隔一段时间(大约两个小时)就会利用空闲的
			//连接向服务器发送一个数据包。这个数据包并没有其他的作用,只是为了检测一下服务器是否仍处
			//于活动状态。
			socket.setKeepAlive(true);
			//so_oobinline 如果这个 Socket 选项打开,可以通过 Socket 类的 sendUrgentData 方法向服务器发送一个单字
			//节的数据。这个单字节数据并不经过输出缓冲区,而是立即发出。


广告

      最近搞了个微信公众号,为各种程序员枯燥的写码生活添加一些生活调料,

      在等待编译的过程看一篇美丽的图文放松放松肌肉。希望各位看官赏脸关注一下

      公众号:马桶上的哲学

      读哲名理,提升逼格



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值