Android的socket通信

什么是Socket?

  Socket,用于描述IP地址和端口,是一个通信链的句柄,在Internet上的主机一遍运行了多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应不同的服务。

构造Socket

  Socket的构造方法有以下几种重载形式:
这里写图片描述

各构造方法的用法如下:

  1. 设定等待建立连接的超时时间:

Socket socket=new Socket();

SocketAddress remoteAddr=new InetSocketAddress(“localhost”,8000);

//等待建立连接的超时时间为1分钟

socket.connect(remoteAddr, 60000);

  1. 设定服务器的地址:

Socket(InetAddress address, int port)

Socket(String host, int port)

InetAddress类表示IP地址,其用法如下:

//返回本地主机的IP地址

InetAddress addr1=InetAddress.getLocalHost();

//返回代表”222.34.5.7”的IP地址

InetAddress addr2=InetAddress.getByName(“222.34.5.7”);

//返回域名为”www.javathinker.org”的IP地址

InetAddress addr3=InetAddress.getByName(“www.javathinker.org”);

  1. 设定客户端的地址:

在一个Socket对象中,既包含远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自于客户程序所在的主机,客户端的端口则由操作系统随机分配。Socket类还有两个构造方法允许显式的设置客户端的IP地址和端口:

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)throws IOException

Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

  1. 客户连接服务器时可能抛出的异常:

当Socket的构造方法请求连接服务器时,可能会抛出以下异常:

l UnknownHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。

l ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。

l SocketTimeoutException:如果等待连接超时,就会抛出这种异常。

l BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定,就会抛出这种异常。

获取Socket的信息

以下方法用于获取Socket的有关信息:

l getInetAddress():获得远程服务器的IP地址。

l getPort():获得远程服务器的端口。

l getLocalAddress():获得客户本地的IP地址。

l getLocalPort():获得客户本地的端口。

l getInputStream():获得输入流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownInput()方法关闭输入流,那么此方法会抛出IOException。

l getOutputStream():获得输出流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownOutput()方法关闭输出流,那么此方法会抛出IOException。

了解Socket的用途

  说了一大堆关于,到底socket怎么用,用来干什么呢?
这里写图片描述

这里写图片描述
看了图大概明白了,socket就是用来和服务器进行通信的方法。

重要的Socket API

  重要的Socket API:java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其他方法大家可以参见JDK文档。

1)Accept方法用于产生“阻塞”,知道接收到一个连接,并且返回一个客户端的socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续,通常”阻塞”是由循环产生的。
2)getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
3)getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例,注意:其中getInputStream和getOutputStream方法均可能会产生一个IOException,所以必须使用try/catch捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

Socket连接过程

  根据连接启动的方式以及本地套接字连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
  服务器监听:是服务器套接字并不定位具体的客户端套接字,而是出于等待连接状态,实时监控网络状态。
  客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

还有另一个ServerSocket类。
这里写图片描述
该类在监听计算机上端口号为PORT的端口,随时监听可能的Client请求。
介绍下上面的accept();
Socket mySocket = ServerSocket.accpet();
该语句调用了ServerSocket对象的accept()方法,这个方法执行将使得Server 端的程序处于等待状态, 程序将一只阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket的对象myScoket,接下来就可以通过这个Socket向远端的CLient读写数据了。这里注意下,ServerSocket一般用于设置端口号和监听,真正进行通信的是服务器端的Socket和客户端的Socket,在ServerSocket进行Accept之后主动权转让了。

Socket通信实现步骤解析:

Step1: 创建ServerSocket和Socket
Step2:打开连接到Scoket的输入/输出流
Step3:按照协议对Socket进行读/写操作
Step4:关闭输入输出流,以及Socket

Socket服务端的编写

Step1:创建ServerSocket对象,绑定监听的端口
Step2:调用accept()方法监听客户端的请求
Step3:连接建立后,通过输入流读取客户端发送的请求信息
Step4:通过输出流向客户端发送响应信息
Step5:关闭相关资源

Socket客户端的编写

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值