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 方法向服务器发送一个单字
//节的数据。这个单字节数据并不经过输出缓冲区,而是立即发出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值