Socket

即套接字,是应用层 与 TCP/IP /udp协议族通信的中间软件抽象层,表现为一个封装了 TCP / IP协议族 的编程接口(API)。所以 Socket不是一种协议,而是一个编程调用接口(API),属于传输层(主要解决数据如何在网络中传输)。

底层原理

Socket的使用类型主要有两种:

  • 流套接字(streamsocket) :基于 TCP协议,采用 流的方式 提供可靠的字节流服务
  • 数据报套接字(datagramsocket):基于 UDP协议,采用 数据报文 提供数据打包发送的服务

连接过程  

具体使用(android)

客户端

new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //此处的Ip需要替换自己服务的IP
                            Socket socket = new Socket("192.168.1.93", 30000);
                            //设置10秒之后即认为是超时
                            socket.setSoTimeout(10000);
                            BufferedReader br = new BufferedReader(new InputStreamReader(
                                    socket.getInputStream()));
                            String line = br.readLine();

                            show.setText("来自服务器的数据:"+line);

                            br.close();
                            socket.close();

                        } catch (UnknownHostException e) {
                            // TODO Auto-generated catch block
                            Log.e("UnknownHost", "来自服务器的数据");
                            e.printStackTrace();
                        } catch (IOException e) {
                            Log.e("IOException", "来自服务器的数据");
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
        ).start();

 服务端

创建一个类,开启Socket

public class Main {

    public static void main(String[] args) throws IOException {
        //创建一个ServerSocket,用于监听客户端socket的连接请求
        ServerSocket ss=new ServerSocket(30000);
        //采用循环不断接受来自客户端的请求,服务器端也对应产生一个Socket
        while(true){
            Socket s=ss.accept();
            OutputStream os=s.getOutputStream();
            os.write("您好,您收到了服务器的新年祝福!\n".getBytes("utf-8"));
            os.close();
            s.close();
        }
    }
}

输出结果

Android socket 传输结构体 android socket协议_服务器

socket 与http对比

  • Socket属于传输层,因为 TCP / IP协议属于传输层,解决的是数据如何在网络中传输的问题
  • HTTP协议 属于 应用层,解决的是如何包装数据

由于二者不属于同一层面,所以本来是没有可比性的。但随着发展,默认的Http里封装了下面几层的使用,所以才会出现Socket & HTTP协议的对比:(主要是工作方式的不同):

  • Http:采用 请求—响应 方式。
  1. 即建立网络连接后,当 客户端 向 服务器 发送请求后,服务器端才能向客户端返回数据。
  2. 可理解为:是客户端有需要才进行通信
  • Socket:采用 服务器主动发送数据 的方式
  1. 即建立网络连接后,服务器可主动发送消息给客户端,而不需要由客户端向服务器发送请求
  2. 可理解为:是服务器端有需要才进行通信