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)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。

posted @ 2019-08-14 21:12  Bugbiss  阅读(107)  评论(0编辑  收藏  举报