Android—Socket修炼

什么是Socket?

在这里插入图片描述

Socket通信模型

在这里插入图片描述
在这里插入图片描述
Socket服务端的编写:
服务端要做的事有这些:

Step 1:创建ServerSocket对象,绑定监听的端口
Step 2:调用accept()方法监听客户端的请求
Step 3:连接建立后,通过输入流读取客户端发送的请求信息
Step 4:通过输出流向客户端发送响应信息
Step 5:关闭相关资源
Socket客户端的编写:
客户端要做的事有这些

Step 1:创建Socket对象,指明需要链接的服务器的地址和端号
Step 2:链接建立后,通过输出流向服务器发送请求信息
Step 3:通过输出流获取服务器响应的信息
Step 4:关闭相关资源

客户端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 的数据包被破坏了。

原文:https://blog.csdn.net/mennoa/article/details/25506855

发布了33 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40442656/article/details/86557703