当前位置: 首页 > news >正文

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

前端代码

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;
}
http://www.jsqmd.com/news/112389/

相关文章:

  • 2025年珠海硬盘恢复维修权威推荐榜单:固态恢复/HP数据恢复/内存卡维修精选 - 品牌推荐官
  • 在Kubernetes(k8s)环境中无法删除持久卷(PV)和持久卷声明(PVC)
  • 2025年江苏小程序开发怎么做服务权威推荐榜单:微信小程序开发展会/小程序开发设计服务商/小程序开发渠道精选 - 品牌推荐官
  • 2025年淄博滨州潍坊济南抖音运营团队推荐,抖音运营团队哪家便宜全解析 - mypinpai
  • Xhorse VVDI MLB Tool: Solder-free Adapter + 5pcs Audi MLB Keys for EU/US Mechanics Owners
  • 详细介绍:Dubbo 全解析:从入门到精通的分布式服务框架实战指南
  • 【2025最新】Watt Toolkit下载安装教程:从安装到网络加速,一文讲透全流程 - PC修复电脑医生
  • PyCharm自定义注释模板
  • 2025年水镁石粉生产企业年度排名:哪家合作案例多? - 工业品牌热点
  • 深入解析:GSV5100B@ACP#一种具有音频提取和插入功能的 2 进 2 出 HDMI2.0 中继器 / CAT 延长器
  • 2025年燃气灶厂家权威推荐榜单:灶盘/煤气炉/煤气灶源头厂家精选 - 品牌推荐官
  • 2025年氯化钙粉厂家权威推荐榜单:氯化钙片/二水氯化钙/无水氯化钙源头厂家精选 - 品牌推荐官
  • 2025年燃气灶制造厂权威推荐榜单:煤气炉/煤气灶/炉具源头制造厂精选 - 品牌推荐官
  • 注册表中以 Windows. 开头 的 Shell 命令通常用于 右键菜单、控制面板项、系统设置 等功能的快速调用
  • 2025年12月螺栓球网架,加油站网架,大型网架厂商推荐:聚焦企业综合实力与核心竞争力 - 品牌鉴赏师
  • 2026年烟台威海英格索兰空压机配件销售服务商优选推荐:空压机维保/空压机余热回收/空压机管路改造服务商 - 工业企业赋能社
  • 垂直深耕,效率革新:BillusAI AI设计工具、AI设计软件实测测评 - 一搜百应
  • (2025)山东烟台海阳英格索兰空压机设备维保服务商推荐用分析报告 - 工业企业赋能社
  • 水蛭素哪个品牌最可靠效果好?水蛭素十大品牌排行榜,中老年人群专用 - 博客万
  • 2025年短视频推广公司排名:短视频推广哪家可靠? - mypinpai
  • 2025年佛山PVC塑料瓦品牌供应商推荐,源头PVC塑料瓦厂家全解析 - 工业推荐榜
  • 2025年佛山PVC天沟水槽专业厂家TOP5排行榜,批量定制与服务商家测评推荐 - 工业品牌热点
  • 2025年12月网架,球形网架,大跨度网架公司推荐:行业测评与选型指南 - 品牌鉴赏师
  • 2025年12月网架,球形网架,大跨度网架公司推荐:行业测评与选型指南 - 品牌鉴赏师
  • 2025年水镁石粉制造工厂年度排名:看哪家产品性价比高? - 工业品牌热点
  • 青岛直播带货公司 推荐君哲互联 - 博客万
  • 2025保温耐火材料企业TOP5权威推荐:安泰恒信,聚焦海泡石细分领域的实力角逐 - myqiye
  • 2025山东空压机维保/空压机节能改造/空压机管路升级改造服务商实力推荐榜单 - 工业企业赋能社
  • 带宽延迟检查需要监控什么
  • nmn公认哪里产的最好,2025全网蕞好NMN品牌是哪个十大NMN热榜 - 资讯焦点