初识socket:
首先我们写的网络编程,属于应用层,当我们写好了程序后,需要将数据发送给运输层,
但是应用层和运输层通信需要遵循相关协议,关键是我们不了解运输层的协议,那该怎么办呢?因此提供了Socket层,Socket英文插座,插口,套接字意思。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,让Socket去组织数据,以符合指定的协议。(面向对象的特点,我们只负责编写逻辑即可,不用去管TCP/IP具体的格式,Sockect会帮我们做)。
socket参数详解:
family | 地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 |
type | 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 |
我们来模拟一下QQ聊天环境:
服务端:
import socket
server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sk.bind(('10.10.65.176', 9953)) # 服务端的是绑定----->bind
server_sk.listen(128)
new_socket, addr = server_sk.accept()
print(addr)
while True: # 设置一个while循环使得可以连续聊天
# 发送消息
ret = new_socket.recv(1024).decode('utf-8')
print('客户端:', ret)
content = input('请输入内容>>>>>')
new_socket.send(content.encode('utf-8'))
if content == 'b': # 设置一个退出
break
new_socket.close()
server_sk.close()
客户端:
import socket
client_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sk.connect(('10.10.65.176', 9953)) # 客户端的是------>connect
# 发送消息
while True:
content = input('请输入----->')
client_sk.send(content.encode('utf-8'))
ret = client_sk.recv(1024).decode('utf-8')
print('服务端:', ret)
if content == 'b':
break
client_sk.close()
注意事项:
1.socket.SOCK_STREAM是基于CTP协议的
2. 服务端要绑定ip地址和端口,而服务端是连接服务器的ip和端口
3.服务端和客户端的ip地址和端口号要一致
4.要先运行服务端,然后在运行客户端