Python_网络编程_socket()
什么是 Socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
详细资料查看菜鸟教程http://www.runoob.com/python3/python3-socket.html
案例1 - 实现连接:
1.1服务端
# -*- coding: UTF-8 -*- # Filename : Python_网络编程_服务器端.py #引入模块 import socket,sys #创建socket对象 serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #socket内的两个参数分别是:IPV4、TCP # 获取本地主机名 host = socket.gethostname() port = 9999 #注:这里是自定义的,尽量不要用4000以内的端口 # 绑定端口 serversocket.bind((host, port)) # 设置最大连接数,超过后排队 serversocket.listen(5) print("服务器已经开启,可以连接...") while True: # 建立客户端连接 clientsocket,addr = serversocket.accept() print("连接地址: %s" % str(addr)) msg='欢迎访问!'+ "\r\n" clientsocket.send(msg.encode('utf-8')) clientsocket.close()
1.2客户端
# 导入 socket、sys 模块 import socket import sys # 创建 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() # 设置端口好 port = 9999 # 连接服务,指定主机和端口 s.connect((host, port)) # 接收小于 1024 字节的数据 msg = s.recv(1024) s.close() print (msg.decode('utf-8'))
案例2 - 实现双向信息传递:
2.1服务器端
# -*- coding:utf8 -*- """ 备注:这是服务器 """ import socket,sys # 导入socket模块 sk = socket.socket() # 创建socket对象 sk.bind(("127.0.0.1", 8888)) # 绑定端口,“127.0.0.1”代表本机地址,8888为设置链接的端口地址 sk.listen(5) # 设置监听,最多可有5个客户端进行排队 print("等待客户连接中……") while True: #准备循环执行以下步骤 conn, addr = sk.accept() # 阻塞状态,被动等待客户端的连接 print(conn) # conn可以理解客户端的socket对象 print(addr) # addr为客户端的端口地址 # ('127.0.0.1', 40966) accept_data = conn.recv(1024) # conn.recv()接收客户端的内容,接收到的是bytes类型数据,通常最大是1024个字节 if accept_data: #‘如果能正常接收到客户端传来数据,就...’即:不为空 accept_data2 = accept_data.decode("utf-8") # str(data,encoding="utf8")用“utf8”进行解码 if accept_data2=='exit': #如果客户端传来的是“exit”就执行。。。 sys.exit() else: print("".join(("接收内容:", accept_data2, " 客户端口:", str(addr[1])))) send_data = input("输入发送内容:") #给客户端发送内容 conn.sendall(bytes(send_data, encoding="utf8")) # 发送内容必须为bytes类型数据,bytes(data, encoding="utf8")用“utf8”格式进行编码 conn.close() sys.close()
2.2客户端:
# -*- coding:utf8 -*- #修改接口,和server4链接 #修改为多次运行 while True ''' 备注:这是客户端;当在客户端输入“exit”时服务端断开 ''' import socket while True: obj = socket.socket() #注 括号内默认“socket.AF_INET,socket.SOCK_STREAM”,是IPV4 和 TCP协议 obj.connect(("127.0.0.1",8888)) #声明链接方式,ip 和 端口 send_data = input("输入发送内容:") #输入传输内容(字符串格式) obj.sendall(bytes(send_data, encoding="utf8")) #转换为字节码格式并发送给服务器 ret = str(obj.recv(1024),encoding="utf-8") #接收到(服务器传来的)字节码格式的内容,转为字符串格式 print(ret) #输出