Socket(套接字)是对TCP/IP协议的封装和应用,根据底层封装协议的不同,Socket的类型可以分为流套接字(streamsocket)和数据报套接字(datagramsocket)两种。流套接字将TCP作为端对端协议,提供了一个可信赖的字节流服务;数据报套接字使用UDP协议,提供数据打包发送服务,应用程序可以通过它发送最长64KB的信息。Socket的通信模型图如1-1所示。
图1-1Socket的通信模型图
通过图1-1可以很容易地看出,使用Socket进行两个应用程序之间的通信时可以选择使用TCP还是UDP作为其底层协议。对比两种方式,就会发现它们各有优劣,TCP首先连接接收方,然后发送数据,保证成功率,速度相对较慢(相比HTTP方式还是非常快的);UDP把数据打包成数据包,然后直接发送对应的IP地址,速度快,但是不保证成功率,并且数据大小有限。
一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含4个基本的步骤∶创建Socket,打开连接到Socket的输入/出流,按照一定的协议对Socket进行读/写操作,关闭Socket。
Java在java.net包中提供了Socket和ServerSocket两个类,分别用来表示双向连接的客户端和服务端,是Socket编程的核心类。构造方法很多,一般情况下使用下面两种∶
Socketclient=newSocket(".0.0.1",);
ServerSocketserver=newServerSocket();
其中,Socket类用于实例化一个Client,参数分别是要访问的IP地址和端口号,这个端口号要与服务端一致。ServerSocket类用于实例化一个Server,其中的参数用来设置端口这里的端口不能与"""80"""等常用端口号冲突。
下面以基于TCP的Socket为例来讲解如何使用Socket。
使用JavaSocket创建一个服务端程序,运行在eclipse平台,并运行在PC上,然后在手机上编写客户端程序,在局域网内访问服务端。下面先编写服务端,代码如下:
packagesocket;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclasssockettest{
publicstaticvoidmain(String[]args)throwsIOException{
SuppressWarnings("resource")
ServerSocketservice=newServerSocket();
while(true){
//等待客户端连接
Socketsocket=service.accept();
newThread(newAndroidRunable(socket)).start();
}
}
}
classAndroidRunableimplementsRunnable{
Socketsocket=null;
publicAndroidRunable(Socketsocket)
{
this.socket=socket;
}
publicvoidrun(){
//向Android客户端输出hellothisis