Android修炼之道—Socket

客户端Socket
1.创建Socket对象需要至少指定哪些信息?
IP(域名),端口号
Socket socket = new Socket("www.micsoft.com", 80);

2.Socket连接服务器(IP:192.168.17.100,端口号:8080)及与服务器交互的代码?
Socket socket = new Socket("192.168.17.100", 8080);
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("hello world\r\n");
bw.flush();

InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s = "";
while((s = br.readLine()) != null)
    Log.d("line",s);
os.close();
is.close();
socket.close();

3.关闭Socket的四中方法?
1.直接调用Socket.close;
2.只要InputStream 和 OutputStream 有一个关闭,则网络连接自动关闭;
3.在程序退出时网络连接自动关闭;
4.将Socket对象设为null或在Socket对象未被释放的情况下 被新的Socket对象覆盖后,由Dalivk虚拟机垃圾回收器
回收为Socket对象分配的内存空间时自动关闭网络连接;
最好使用第1,2种。

4.使用Socket.connect连接服务器?
Socket socket = new Socket();
socket.connect(new InetSocketAddress("192.168.17.100",8080),2000); //超时时间是2秒

5.客户端Socket超时的两种情况?
1.连接超时
    只有通过Socket.connect方法才能制定连接超时的时间。由于使用connect方法连接服务器必须要指定IP和端口,
因此,无效的IP或端口将会抛出连接超时异常。
2.读取数据超时
    Socket socket = new Socket();
    socket.setSoTimeout(5000);
    socket.connect(...);
    socket.getInputStream().read();
    通过setSoTimeout()来设置读取数据超时时间,这个方法必须在读取数据之前调用才会生效。

6.获取服务器的IP和域名?
socket.getInetAddress().getHostAddress();
socket.getInetAddress().getHostName();

7.调用Socket.close时会立即返回,所有未发送的数据将被丢弃。如何保证将所有数据都发送到服务端?
可以调用Socket.setSoLinger方法设置Socket关闭的延迟时间
socket.setSoLinger(true, 30);//socket.close延迟30秒关闭 So(Socket Option)

8.Socket的异常?

IOException 这个异常是所有在Socket类的方法中抛出的异常的父类,因此,在使用Socket类时只要捕捉这个异常就可以了。
SocketException 所有和网络有关的异常。
ConnectException 服务器忙而未响应或是服务器相应的监听端口未打开。
BindException 多个Socket或ServerSocket对象绑定在同一个端口,而且未打开SO_REUSEADDR选项。
NoRouteTOHostException 遇到防火墙或是路由无法找到主机。
UnknownHostException 域名不正确。
ProtocolException TCP/IP 的数据包被破坏了。
SocketTimeoutException 连接超时或读取数据超时。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值