socket
1.什么是socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
2.socket()函数
用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
参数
- family: 套接字家族可以使AF_UNIX或者AF_INET type:
- 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
- protocol: 一般不填默认为0
3.基于UDP协议的Socket使用
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接。
服务端
我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。
完整代码如下:
#服务端
import socket
#1.创建一个服务端
server = socket.socket(type=socket.SOCK_DGRAM)
#2.绑定套接字
ip_port=("127.0.0.1",8000)
server.bind(ip_port)
while True:
#3. 接收客户端的消息
msg,addr=server.recvfrom(1024)
msg=msg.decode("utf-8")
print("客户端{}发给的消息是:{}".format(addr,msg))
#4. 回复客户端
content=input("我回复的消息是:")
content=content.encode("utf-8")
server.sendto(content,addr)
#关闭
server.close()
客户端
完整代码如下:
#客户端
import socket
while True:
#1. 创建一个服务器soket对象
client=socket.socket(type=socket.SOCK_DGRAM)
#2. 给服务器发消息
#服务器地址和端口
ip_port=("127.0.0.1",8000)
content = input("请输入你的聊天内容:")
#以UTF-8编码对content进行编码,获取二进制bytes类型对象,encode函数进行编码
content=content.encode("utf-8")
#向服务器发一条消息,client。sendto 发送udp数据,将数据发送到套接字,address 形式是(ip地址 ,port)的元组
client.sendto(content,ip_port)
#3. 接收服务器信息
#接收的是从服务器返回的消息。client。recvfrom() 接收udp数据,但返回的是(data,address)
msg,addr=client.recvfrom(1024)
msg=msg.decode("utf-8")
#4. 打印消息
print("服务器{}发的消息是:{}".format(addr,msg))
#5. 关闭套接字
client.close()
运行结果如下:
服务端
客户端
4.基于TCP协议的Socket使用
Socket是基于tcp协议的,tcp是基于链接的,因此在通讯开始之前,一定要先建立相关的 链接,才能发送数据。必须先启动服务端,然后再启动客户端去链接服务端。
服务端
完整代码如下:
import socket
#1.创建服务器套接字
tcp_server = socket.socket(type=socket.SOCK_STREAM)
#2.绑定端口
ip_port=("127.0.0.1",9000)
tcp_server.bind(ip_port)
while True:
# 3.将socket创建的套接字变成被动类型,等待客户链接请求
tcp_server.listen(5)
# 4.让服务器阻塞,等待客户端的链接
client_socket, client_addr = tcp_server.accept()
#5. 接收客户端发来的消息
recv_msg=client_socket.recv(1024)
recv_msg =recv_msg.decode("utf-8")
#打印客户端消息
print("客户端{}的消息是:{}".format(client_addr,recv_msg))
#6. 给客户端发消息
msg=input("给客户端发的消息是:")
msg=msg.encode("utf-8")
client_socket.send(msg)
client_socket.close()
tcp_server.close()
客户端
完整代码如下:
import socket
while True:
#1. 创建客户端的套接字
tcp_client =socket.socket(type=socket.SOCK_STREAM)
#2. 连接服务器端口
ip_port=("127.0.0.1",9000)#服务器的ip端口
tcp_client.connect(ip_port)
#3. 给服务器发消息
msg=input("给服务器发消息:")
msg=msg.encode("utf-8")
tcp_client.send(msg)
#4. 接受服务器的消息
recv_msg =tcp_client.recv(1024)
recv_msg=recv_msg.decode("utf-8")
print("服务器的消息是:{}".format(recv_msg))
#5. 关闭套接字
tcp_client.close()
运行结果如下:
服务端
客户端
5.python里的编码
-
ASCII码
ASCII码 表示127个英文字符
-
Unicode码
Unicode 用来把所有语言都统一到一套编码里,这样就不会再有乱 码问题了。Unicode 通常用两个字节编码(有的也用四个字节),而 ASCII码通常用一个字节字节。ASCII码转换成Unicode在前面一个字节 补0
-
UTF-8码
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字 节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生 僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文 字符,用UTF-8编码就能节省空间。 UTF-8的一个好处在于,原有的ASCII的编码可以在UTF-8下继续工 作。