zoukankan      html  css  js  c++  java
  • Socket初识

    Socket初步认识

    ​ 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

    ​ 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。

    • socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统.
    • 为什么存在socket抽象层? 如果直接与操作系统数据交互非常麻烦,繁琐,socket对这些繁琐的的操作高度的封装,简化.socket在python中就是一个模块.
    import socket
    
    # 买电话
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 默认基于TCP协议的socket
    
    # 绑定电话卡
    phone.bind(('192.168.14.198',8848))  # 绑定IP地址和端口
    
    # 开机监听
    phone.listen(5)
    print(111)
    
    # 等待连接
    conn, addr = phone.accept() # 阻塞
    print(conn,addr)
    
    from_client_data = conn.recv(1024)  # 至多接受1024个字节  阻塞
    print(f'来自客户端{addr[0]}的消息:{from_client_data.decode("utf-8")}')
    
    to_client_data = input('>>>')
    conn.send(to_client_data.encode('utf-8'))
    conn.close()
    phone.close()
    
    client端
    
    
    import socket
    
    # 买电话
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 默认基于TCP协议的socket
    
    # 拨号打电话
    phone.connect(('127.0.0.1',8848))
    data = input('请输入>>>')
    
    phone.send(data.encode('utf-8'))
    from_server_data = phone.recv(1024)
    print(f'来自服务端的消息:{from_server_data}')
    
    
    # 关闭电话
    phone.close()
    
    服务器端:
    
    其过程是首先服务器方要先启动,并根据请求提供相应服务:
    
    (1)打开一通信通道并告知本地主机,它愿意在某一公认地址上的某端口(如FTP的端口可能为21)接收客户请求;
    
    (2)等待客户请求到达该端口;
    
    (3)接收到客户端的服务请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。
    
    (4)返回第(2)步,等待另一客户请求。
    
    (5)关闭服务器
    
    客户端:
    
    (1)打开一通信通道,并连接到服务器所在主机的特定端口;
    
    (2)向服务器发服务请求报文,等待并接收应答;继续提出请求......
    
    (3)请求结束后关闭通信通道并终止。
    
    从上面所描述过程可知:
    (1)客户与服务器进程的作用是非对称的,因此代码不同。
    (2)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。
    

  • 相关阅读:
    如何获取Apollo上项目下的所有namespace?
    从源码研究如何不重启Springboot项目实现redis配置动态切换
    用 Explain 命令分析 MySQL 的 SQL 执行
    MySQL死锁系列-常见加锁场景分析
    带你100% 地了解 Redis 6.0 的客户端缓存
    Java 数据持久化系列之 HikariCP (一)
    MySQL的死锁系列- 锁的类型以及加锁原理
    Java 数据持久化系列之池化技术
    Redis Cluster 的数据分片机制
    Redis 命令执行过程(下)
  • 原文地址:https://www.cnblogs.com/tutougold/p/11354737.html
Copyright © 2011-2022 走看看