socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”(unix 系统出现的时候,网络协议还没有出来),对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket和file的区别:
下面是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("\033[31;1m>>:\033[0m").strip() ###实现颜色的区分 ,这个需要后续再琢磨颜色的问题 23 conn.send(bytes(server_response,‘utf8‘)) ###发送用户输入的内容 24 conn.close()
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import socket 4 ip_port = (‘127.0.0.1‘,9999) 5 6 sk = socket.socket() 7 sk.connect(ip_port) 8 9 sk.sendall(bytes("请求占领地球",encoding=‘utf8‘)) 10 11 server_reply = sk.recv(1024) 12 print(str(server_reply,‘utf8‘)) 13 14 while True: ###使用循环实现 多次说话 15 user_input = input(">>:").strip() 16 sk.send(bytes(user_input,‘utf8‘)) ##发送client 端的输入 17 server_reply = sk.recv(1024) ##接收server 端发送的内容 18 print(str(server_reply,‘utf8‘)) ## 19 20 sk.close()
三 在二的基础上,修改一下,实现了一个server 和clienta通讯,当clienta 关闭了,开启clientb 时,能在server 不关闭的情况和clientb 实现通讯
运行方式:先运行socket_server,然后运行socket-clienta, 然后关闭clienta,开启clientb, 能实现了clientb 和server的通讯
在代码实现的过程中,为了简化形式,只是client发送什么内容,server返回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: 20 try: 21 client_data = conn.recv(1024) 22 print(str(client_data,‘utf8‘)) 23 except Exception: ########因为client 断开,server端程序会异常,为了让这个现象不再出现,而设置的这个异常处理 24 print("client closed,break") 25 break ###只要出现任何异常,break 跳出while 执行conn.close() 26 conn.send(client_data) 27 conn.close() 28 29 30 31 32 ‘‘‘ 33 try: ###抓异常的语法 34 client_data = conn.recv(1024) 35 print(client_data) 36 except Exception: ###所有的异常都处理 37 break 38 ‘‘‘
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import socket 4 ip_port = (‘127.0.0.1‘,9999) 5 6 sk = socket.socket() 7 sk.connect(ip_port) 8 9 sk.sendall(bytes("请求占领地球",encoding=‘utf8‘)) 10 11 server_reply = sk.recv(1024) 12 print(str(server_reply,‘utf8‘)) 13 14 while True: 15 user_input = input(">>:").strip() 16 sk.send(bytes(user_input,‘utf8‘)) 17 server_reply = sk.recv(1024) 18 print(str(server_reply,‘utf8‘)) 19 20 sk.close()
原文:http://www.cnblogs.com/qing-add/p/5270109.html