标签:通信 标识 其他 sendto 应用 div 选项 create 输出
套接字,它就
是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
# 创建客户端udp的socket,完成发送数据 import socket # 判断该模块是否是程序的入口 if __name__ == ‘__main__‘: # 1. 创建socket # 第一个参数是地址类型, 这个地方使用ipv4 # 第二个参数是传输层协议, udp udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本地信息,也就是本地程序的端口 # "": 表示本地的任意ip地址都可以,防止一台电脑上有多个网卡 udp_client_socket.bind(("", 8865)) # 发送的内容 send_content = "您好,我是客户端小白。" # 2. 发送消息 # 提示: 如果在乌班图系统下使用utf-8,如果在windows系统下使用gbk udp_client_socket.sendto(send_content.encode("utf-8"), ("192.168.101.81", 4343)) # 接收服务端socket发送的数据 # 1024:表示每次接收数据字节大小 # 提示: recvfrom这个接收数据的这个函数会如果服务端没有给我们客户端发送数据,那么会一直阻塞 # 提示: 只有服务端的socket给客户端的socket发送数据以后, # 客户端接收到以后才解阻塞,程序会继续往下执行 recv_data, ip_port = udp_client_socket.recvfrom(1024) # 解码操作 recv_content = recv_data.decode("utf-8") print("接收到的数据: %s ip地址: %s" % (recv_content, ip_port)) # 3. 关闭socket udp_client_socket.close()
创建一个udp客户端程序的流程是简单,具体步骤如下:
飞鸽传书小应用
下面这段代码主要用于定义常量
fq_verson = 1 fq_username = ‘firstname‘ hostname = ‘localhost‘ # 接收方 recv_ip = ‘192.168.101.200‘ # 固定端口 port = 2425 # 上线指令 IPMSG_BR_ENTRY = 0x00000001 # 下线指令 IPMSG_BR_EXIT = 0x00000002 # 发送内容 IPMSG_SENDMSG = 0x00000020 # 客户端socket默认为None client_socket = None recv_info = {}
下面这段代码主要用于设置发送指令并给飞秋发送消息
import config import time def send_fq(content): ‘‘‘发送给飞秋‘‘‘ config.client_socket.sendto(content.encode(‘gbk‘), (config.recv_ip, config.port)) def set_format(send_instruct,content): ‘‘‘设置发送指令‘‘‘ send_content = ‘%d:%d:%s:%s:%s:%s‘ % (config.fq_verson, int(time.time()), config.fq_username, config.hostname, send_instruct, content) send_fq(send_content) def onclient(): ‘‘‘上线提醒‘‘‘ set_format(config.IPMSG_BR_ENTRY,config.fq_username) def offclient(): ‘‘‘下线提醒‘‘‘ set_format(config.IPMSG_BR_EXIT,config.fq_username) def set_content(): ‘‘‘发送消息‘‘‘ user_int = input(‘请输入您要发送的内容:‘) set_format(config.IPMSG_SENDMSG,user_int)
接收飞秋返回来的消息,用字符串分割并保存输出
import config def recv_word(): ‘‘‘接收消息‘‘‘ while 1: recv_content,ip_prot = config.client_socket.recvfrom(1024) end_content = recv_content.decode(‘gbk‘) recv_list = end_content.split(‘:‘,5) config.recv_info[‘version‘] = recv_list[0] config.recv_info[‘number‘] = recv_list[1] config.recv_info[‘username‘] = recv_list[2] config.recv_info[‘hostname‘] = recv_list[3] config.recv_info[‘send_format‘] = recv_list[4] config.recv_info[‘conten‘] = recv_list[5] print(config.recv_info[‘conten‘])
创建socket 并启动应用程序
import socket import send_socket import recv_socket import config import threading def create_socket(): # global client_socket # 创建socket对象 config.client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立广播 config.client_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,True) # 绑定端口 config.client_socket.bind((‘‘,5555)) print(config.client_socket) def user_select(): print(‘======飞鸽传书V1.0======‘) print(‘1:上线提醒‘) print(‘2:下线提醒‘) print(‘3:发送消息‘) print(‘4:接受消息‘) print(‘0:退出‘) return input(‘请输入您要进行的操作选项:‘) if __name__ == ‘__main__‘: create_socket() print(config.client_socket) recv_socket_thread = threading.Thread(target=recv_socket.recv_word) recv_socket_thread.start() while True: ret = user_select() if ret == ‘1‘: send_socket.onclient() elif ret == ‘2‘: # 下线 send_socket.offclient() elif ret == ‘3‘: # 发送消息 send_socket.set_content() elif ret == ‘4‘: # 接受消息 recv_socket.recv_word() elif ret == ‘0‘: # 退出 break else: print(‘输入错误,请重新输入‘) config.client_socket.close()
标签:通信 标识 其他 sendto 应用 div 选项 create 输出
原文地址:http://www.cnblogs.com/zhangguodong/p/7528429.html