在学习UDP的时候,想着试一试能不能搞一个命令窗口的udp聊天工具,因为udp的广播机制,所以就想着干脆直接搞一个群聊的吧。不过最后搞来搞去,命令窗口下使用多线程,没有做出什么好看整洁的“图形化”界面,凑合着用吧,毕竟是一个练习的学习型的小玩意。有时间把打印格式再搞一搞,争取以后能好看一点。
不说了,上代码(先来一个V1.0):
#!/usr/bin/python3
# -*-coding:utf-8-*-
"""使用udp实现群聊9091聊天室"""
import socket, threading
port = 9090
ip_host = "192.168.14.255"
# 发送消息
def send_msg(udp_socket,address):
send_content = input(">")
udp_socket.sendto(send_content.encode('gbk'),address)
# 接受消息
def recv_msg(udp_socket):
while True:
recv_data, ip_port = udp_socket.recvfrom(1024)
print("来自:" + str(ip_port))
print(recv_data.decode('gbk'))
if __name__ == '__main__':
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 绑定端口
udp_socket.bind(('', port))
# 设置目标地址
# addr = ("192.168.14.255", 9090)
# 创建接受数据的线程
recv_thread = threading.Thread(target=recv_msg, args=(udp_socket,))
# 设置成为守护进程
recv_thread.setDaemon(True)
recv_thread.start()
while True:
# 接受用户指令
option = input("请输入功能:1.发送\t2.退出\n")
if option == '1':
addr = (ip_host, port)
send_msg(udp_socket, addr)
elif option == '2':
break
# 关闭流
udp_socket.close()
再来一个版本(v1.2):
#!/usr/bin/python3
# -*-coding:utf-8-*-
"""使用udp实现群聊9091群聊天室"""
import socket, threading
port = 9091
ip_host = "192.168.14.255" # 广播地址
# 创建套接字
def create_socket():
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
udp_socket.bind(('', port))
print(udp_socket)
# 设置广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
return udp_socket
# 发送消息
def send_msg(udp_socket):
while True:
send_content = input(">")
udp_socket.sendto((send_content+"\r\n").encode('gbk'),(ip_host,port))
# 接受消息
def recv_msg(udp_socket):
while True:
recv_data, ip_port = udp_socket.recvfrom(1024)
print(("来自:" + str(ip_port)).rjust(50))
print(recv_data.decode('gbk').rjust(50))
print("-"*80)
if __name__ == '__main__':
udp_socket = create_socket()
# 创建接受数据的线程
recv_thread = threading.Thread(target=recv_msg, args=(udp_socket,))
# 设置成为守护进程
recv_thread.setDaemon(True)
recv_thread.start()
send_thread = threading.Thread(target=send_msg, args=(udp_socket,))
send_thread.start()
# # 关闭流
# udp_socket.close()
具体实现
实现两个python文件,其中server.py包含Manager类,用于充当服务器记录用户的信息,并广播通话内容,实现私聊模式,管理成员的进入和退出。使用多线程服务多个用户。
client.py文件包含Chatter类,用于与Manager类建立一对一关联,向管理员发送加入和退出请求。其中发送和退出分别使用不同的线程完成。
最后在用户退出之后log.txt文件可以记录用户的日志并保存到本地磁盘上。
代码实现
server.py文件
import socket,time
from threadi.
使用Python编写的基于socket UDP通信的多功能即时聊天室,包含Tkinter编写的图形化聊天界面,功能包括有账号注册和登录,登录成功后可以查看在线用户,并和聊天室内的其他在线用户聊天,包含私聊和群发,能发送文字、表情包,以及文件等。
1.进程
一个运行的程序就是一个进程,没有运行的代码叫做程序。
进程是系统分配资源的最小单位,进程拥有自己独立的内存空间 相对独立,所以进程间的数据不共享,开销大。
2.线程
CPU调度执行的最小单位(程序真正执行的时候调用的是线程),也叫执行路径,依赖于进程存在,
一个进程最小存在一个线程,叫做主线程
而多个线程共享进程内存资源(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
一个进程中可以有一个或多个线程。一个线程只属于一个进程。
一个进程中的多个线程是一种竞争关系
本文承接上篇文章的客户端—服务器聊天对话程序,进一步设计开发了微信群聊的python模拟程序,涉及的python知识点为:Python聊天程序与TCP Socket知识大汇总和进程与线程编程!本文的内容章节为:群聊对话演示与设计结构进程与线程详解与代码演示Python群聊程序代码详解Python群聊程序代码获取python群聊程序实战一、群聊对话演示与设计结构直接来看已经完成的python群聊程序...
文章目录线程和进程一、 什么是进程 / 线程1、 引论2、 线程3、 进程4、 区别5、 使用二、 多线程使用1、 常用方法2、 常用参数3、 多线程的应用3.1 重写线程法3.2 直接调用法4、 线程间数据的共享三、 多进程使用1、 简介2、 应用2.1 重写进程法2.2 直接调用法3、 进程之间的数据共享3.1 Lock 方法3.2 Manager 方法四、 池并发1、 语法2、 获取 CPU 数量3、 线程池3、 进程池
线程和进程
一、 什么是进程 / 线程
1、 引论
众所周知,CPU是计算机的
class ClientThread(threading.Thread):
def __init__(self, sock, addr, conn_pool, pool_lock):
Java网络编程–TCP+多线程 实现聊天室群聊功能
功能描述:
简单的聊天室,可以有多个用户同时加入聊天,每个用户可以随时发送消息,其他用户都会收到该用户的信息(显示发送者姓名)
1.采用TCP实现,服务端需要完成的任务:
(1)为每个加入聊天室的用户创建一个服务线程,该线程用于接收该用户的信息并发送给其他用户
(2)用户加入和退出聊天室时给出相应的提示信息
(3)用户退出时...
udp可以通过多线程来实现两机之间的 ‘’类似’‘ qq一样 ‘’自由‘’ 聊天功能,不再是死板的要么只接收数据,要么只发送数据。
import socket #引入套接字
import threading #引入并行
def udp_send(udp_socket):
while True:
num1 = '192.168.232.1'