Android Socket编程

来源:互联网 发布:淘宝搜索宝贝显示广告 编辑:程序博客网 时间:2024/06/11 16:07
Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求。Socket是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必需的5种信息:连接所使用的协议、本地主机的IP地址、本地进程的协议端口、远地主机的IP地址以及远地进程的协议端口。

 Socket有两种主要的操作方式:面向连接的和无连接的。

 面向连接的Socket操作就像一部电话,Socket必须在发送数据之前与目的地的Socket取得连接,一旦连接建立了,Socket就可以使用一个流接口进行打开、读写以及关闭操作。并且,所有发送的数据在另一端都会以相同的顺序被接收。

 无连接的Socket操作就像一个邮件投递,每一个数据报都是一个独立的单元,它包含了这次投递的所有信息(目的地址和要发送的内容)。在这个模式下的Socket不需要连接目的地Socket,它只是简单的投出数据报。

 由此可见,无连接的操作是快速高效的,但是数据安全性不佳;面向连接的操作效率较低,但数据的安全性较好。

面向连接的Socket操作步骤

Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的Socket客户端和服务器端。

  Socket的构造方法如下:

  (1)Socket(InetAddress address, int port);

  (2)Socket(InetAddress address, int port, boolean stream);

  (3)Socket(String host, int port);

  (4)Socket(String host, int port, boolean stream);

  (5)Socket(SocketImpl impl);

  (6)Socket(String host, int port, InetAddress localAddr, int localPort);

 (7)Socket(InetAddress address, int port, InetAddrss localAddr, int localPort);

  ServerSocket的构造方法如下:

  (1)ServerSocket(int port);

  (2)ServerSocket(int port, int backlog);

  (3)ServerSocket(int port, int backlog, InetAddress bindAddr);

  其中,参数address、host和port分别是双向连接中另一方的IP地址、主机名和端口号;参数stream表示Socket是流Socket还是数据报Socket;参数localAddr和localPort表示本地主机的IP地址和端口号;SocketImpl是Socket的父类,既可以用来创建ServerSocket,也可以用来创建Socket。

在服务器端创建了一个ServerSocket:

try {  ServerSocket serverSocket = new ServerSocket(50000);    //创建一个ServerSocket,用于监听客户端Socket的连接请求 50000是Socket通信的端口号,在创建Socket时,如果该端口号已经被别的服务占用,将会抛出异常。      while(true) {          Socket socket = serverSocket.accept();        //每当接收到客户端的Socket请求,服务器端也相应的创建一个Socket。 accept()是一个阻塞函数,就是说该方法被调用后就会一直等待客户端的请求,直到有一个客户端启动并请求连接到相同的端口,然后accept()返回一个对应于该客户端的Socket。      //todo开始进行Socket通信      }  }catch (IOException e) {      e.printStackTrace();  }

客户端创建并启动一个Socket:

try {   socket = new Socket("192.168.1.101", 50000);    //192.168.1.101是服务器的IP地址,50000是端口号//todo开始进行Socket通信} catch (IOException e) {    e.printStackTrace();}

客户端和服务器端都建立了用于通信的Socket,接下来就可以由各自的Socket分别打开各自的输入流和输出流进行通信了。

  Socket提供了方法getInputStream()和getOutPutStream()来获得对应的输入流和输出流,以便对Socket进行读写操作,这两个方法的返回值分别是InputStream和OutPutStream对象。

  为了便于读写数据,我们可以在返回的输入输出流对象上建立过滤流,如PrintStream、InputStreamReader和OutputStreamWriter等。

可以通过调用Socket的close()方法来关闭Socket。在关闭Socket之前,应该先关闭与Socket有关的所有输入输出流,然后再关闭Socket。

1 0
原创粉丝点击