尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

网络聊天器,前端wxpython,后端c++

网络聊天器,前端wxpython,后端c++
📅 发布时间:2026/6/22 2:43:45

前端代码

import wx
import socket
import threading
import randomfrom wx import TE_MULTILINEclass chatFrame(wx.Frame):def __init__(self,nickname):super().__init__(parent=None,title="多人聊天室",size=(600,400))self.nickname = nicknameself.client_socket = Noneself.initSocket()self.initUI()self.Center()self.Show()def initSocket(self):try:self.client_socket=socket.socket()self.client_socket.connect(('123.56.19.236',8080))self.client_socket.send(bytes(self.nickname,encoding='utf8'))threading.Thread(target=self.recv_msg, daemon=True).start()except Exception as e:wx.MessageBox(f'连接聊天室失败:{e}','错误',wx.ICON_EXCLAMATION)self.Close()def initUI(self):panel=wx.Panel(self)v_sizer = wx.BoxSizer(wx.VERTICAL)  # 垂直布局self.chatItf=wx.TextCtrl(parent=panel,size=(580,300),#readonly只读style=TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL|wx.VSCROLL #此处查资料的,书上没有,就是用来聊天记录滑动的)v_sizer.Add(self.chatItf,0,wx.ALL | wx.EXPAND, 10)h_sizer=wx.BoxSizer(wx.HORIZONTAL)self.inputMsg=wx.TextCtrl(parent=panel,size=(480,30))btn=wx.Button(parent=panel,label="发送", size=(80, 30))#这个bind坑点:绑定的方法必须有两个参数,他会默认传递一个event(事件说明书)btn.Bind(wx.EVT_BUTTON, self.send_msg)h_sizer.Add(self.inputMsg, 0,  wx.EXPAND,0)h_sizer.Add(btn,0,wx.EXPAND,0)#将水平的sizer垂直放在垂直sizer的下面v_sizer.Add(h_sizer, 0,wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, 10) #我操,这里一定不要用wx.ALL,不然文本框和按钮就直接被边距挤没了panel.SetSizer(v_sizer)def recv_msg(self):while True:msg=self.client_socket.recv(1024).decode('utf8')#接受到的消息一定要记得解码self.chatItf.AppendText(str(msg)+'\n')#记得换行def send_msg(self,event):#不写event直接报错,参数不匹配msg=self.inputMsg.GetValue()#这里要记得判空,别把自己名字发过去了if not msg:returnself.chatItf.AppendText(f'[{self.nickname}]#{msg}\n')#要记得换行self.client_socket.send(bytes(msg,encoding='utf8'))self.inputMsg.SetValue('')
#程序运行主逻辑def main():app=wx.App()dlg=wx.TextEntryDialog(parent=None,message='请输入你的昵称',caption='用户-昵称',value='用户'+str(int(random.random()*1000)))if dlg.ShowModal()==wx.ID_OK:nickname=dlg.GetValue()if not nickname:nickname = "匿名用户"frame=chatFrame(nickname)dlg.Destroy()app.MainLoop()
if __name__=="__main__":main()

c++后端

#include<iostream>
#include<cstdio>
#include<cstring>
#include<unistd.h>
#include<pthread.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include<arpa/inet.h>
#include<sys/wait.h>
#include<cstdlib>
#include<vector> 
using namespace std;vector<int> client_fds;void* task(void * arg) {int client_fd = (int)(long)arg;char nickname[128] = {0};char recv_buf[1024] = {0};ssize_t recv_len = recv(client_fd, nickname, sizeof(nickname)-1, 0);if (recv_len <= 0) { close(client_fd);return nullptr;}nickname[recv_len] = '\0';client_fds.push_back(client_fd);char join_msg[256] = {0};snprintf(join_msg, sizeof(join_msg), "[系统]# %s 加入了聊天室!", nickname);for (int fd : client_fds) {if (fd != client_fd) {send(fd, join_msg, strlen(join_msg), 0);}}while (true) {memset(recv_buf, 0, sizeof(recv_buf));recv_len = recv(client_fd, recv_buf, sizeof(recv_buf)-1, 0);if (recv_len <= 0) {for (auto it = client_fds.begin(); it != client_fds.end(); ++it) {if (*it == client_fd) {client_fds.erase(it);break;}}char leave_msg[256] = {0};snprintf(leave_msg, sizeof(leave_msg), "[系统]# %s 离开了聊天室!", nickname);for (int fd : client_fds) {send(fd, leave_msg, strlen(leave_msg), 0);}close(client_fd);break;}char broadcast_msg[1024] = {0};snprintf(broadcast_msg, sizeof(broadcast_msg), "[%s]# %s", nickname, recv_buf);for (int fd : client_fds) {if (fd != client_fd) {send(fd, broadcast_msg, strlen(broadcast_msg), 0);}}}return nullptr;
}int main(){int listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd < 0) {perror("socket create failed");exit(EXIT_FAILURE);}int opt = 1;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(8080); local.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(listenfd, (struct sockaddr*)&local, sizeof(local)) < 0) {perror("bind failed");close(listenfd);exit(EXIT_FAILURE);}if (listen(listenfd, 5) < 0) {perror("listen failed");close(listenfd);exit(EXIT_FAILURE);}printf("服务端启动成功,监听端口 8080\n");while(true) {struct sockaddr_in src;socklen_t len = sizeof(src);int client_fd = accept(listenfd, (struct sockaddr*)(&src), &len);if (client_fd < 0) {perror("accept failed");continue;}printf("客户端[%s:%d] 连接成功\n", inet_ntoa(src.sin_addr), ntohs(src.sin_port));pthread_t tid;// 这里一定要记得:int转void*需转long,避免64位系统截断int n = pthread_create(&tid, nullptr, task, (void*)(long)client_fd);if (n != 0) {perror("pthread_create failed");close(client_fd);continue;}pthread_detach(tid);}close(listenfd);return 0;
}

相关新闻

  • 2025年江苏小程序开发怎么做服务权威推荐榜单:微信小程序开发展会/小程序开发设计服务商/小程序开发渠道精选 - 品牌推荐官
  • 详细介绍:Dubbo 全解析:从入门到精通的分布式服务框架实战指南
  • 2025年终盘点:ATCC菌种哪家公司靠谱?进口ATCC菌种经销商/供应商/代理商推荐 - 品牌推荐大师1

最新新闻

  • OpenClaw-ios:集成Frida与SSL Pinning绕过的iOS逆向工程工具链
  • 2026 浙江绍兴市全域彩钢瓦修缮 TOP4 权威推荐|纺织化工厂房金属屋面除锈防水喷漆企业对比 + 绍兴专属避坑指南 - 本地便民网
  • 汽车贴玻璃膜品牌费用多少?靠谱的品牌分析 - myqiye
  • DeepSeek-V4架构解析:CSA、HCA与Muon三大认知计算原语
  • AI测试不是写用例,是重构测试工程师的思考链路
  • IDOR与XSS组合攻击:从漏洞原理到账户接管的实战剖析

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号