socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”(unix 系统出现的时候,网络协议还没有出来),对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket和file的区别:
- file模块是针对某个指定文件进行【打开】【读写】【关闭】
- socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】
下面是socket 在客户端和server 端通讯的具体情况
socket 作为“文件“来实现网络的通讯的基本情况
运行方式: 先运行socket_server,然后运行socket-client
实现的情况,客户端发送的一句话,服务器发送一句话
基本的形式
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import socket 5 6 ip_port = ('127.0.0.1',9999) 7 8 sk = socket.socket() 9 sk.bind(ip_port) ###实现到服务器上申请端口,开启服务的情况 10 sk.listen(5) ####最大允许链接5个 11 12 while True: 13 print('server waiting...') 14 conn,addr = sk.accept() ###在服务器端,开启端口后,默认是阻塞状态 15 16 client_data = conn.recv(1024) ###接收客户端的数据 17 print(str(client_data,'utf8')) ###打印客户端的数据 18 conn.sendall(bytes('不要回答,不要回答,不要回答','utf8')) ###给客户发送数据 ####socket发送和接收的过程是使用的bytes 形式 19 20 conn.close()
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import socket ######导入socket 模块 4 ip_port = ('127.0.0.1',9999) ##定义一个ip加端口的元组 5 6 sk = socket.socket() ###实例化一个socket 7 sk.connect(ip_port) ###调用上面提到的定义的元组 connect 去实现连接 8 9 sk.sendall(bytes("请求占领地球",encoding='utf8')) ###发送数据的写法 ###bytes的形式 10 11 server_reply = sk.recv(1024) ###定义一个接收到的数据的限制 12 print(str(server_reply,'utf8')) ###打印接收到的信息, ###字符串的形式 13 14 sk.close() ###关闭socket
二 在socket 基础上,添加功能实现了,和qq聊天类似的功能(你说一句,我说一句,继续下去)
运行方式:先运行socket_server,然后运行socket-client,两边都有输入
代码如下:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import socket 5 6 ip_port = ('127.0.0.1',9999) 7 8 sk = socket.socket() 9 sk.bind(ip_port) 10 sk.listen(5) ####最大允许链接5个 11 12 while True: 13 print('server waiting...') 14 conn,addr = sk.accept() 15 16 client_data = conn.recv(1024) 17 print(str(client_data,'utf8')) 18 conn.sendall(bytes('不要回答,不要回答,不要回答','utf8')) 19 while True: ######用while 循环来实现输入 20 client_data = conn.recv(1024) ###接收client的输入 21 print(str(client_data,'utf8')) ###打印输入 22 server_response = input("