当前位置: 首页 > 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.rkmt.cn/news/124108.html

相关文章:

  • 2025年江苏小程序开发怎么做服务权威推荐榜单:微信小程序开发展会/小程序开发设计服务商/小程序开发渠道精选 - 品牌推荐官
  • 详细介绍:Dubbo 全解析:从入门到精通的分布式服务框架实战指南
  • 2025年终盘点:ATCC菌种哪家公司靠谱?进口ATCC菌种经销商/供应商/代理商推荐 - 品牌推荐大师1
  • 深入解析:GSV5100B@ACP#一种具有音频提取和插入功能的 2 进 2 出 HDMI2.0 中继器 / CAT 延长器
  • 2026年烟台威海英格索兰空压机配件销售服务商优选推荐:空压机维保/空压机余热回收/空压机管路改造服务商 - 工业企业赋能社
  • 2025年酚醛板复合风管权威推荐榜单:酚醛树脂板/酚醛发泡保温板/酚醛树脂防火板源头厂家精选 - 品牌推荐官
  • 2025年佛山PVC塑料瓦品牌供应商推荐,源头PVC塑料瓦厂家全解析 - 工业推荐榜
  • 2025年佛山PVC天沟水槽专业厂家TOP5排行榜,批量定制与服务商家测评推荐 - 工业品牌热点
  • 青岛直播带货公司 推荐君哲互联 - 博客万
  • 带宽延迟检查需要监控什么
  • 2025佛山PVC塑料瓦供应商TOP5权威推荐:源头厂家甄选指南 - 工业推荐榜
  • 【赵渝强老师】Kubernetes中Pod的探针
  • 垂直深耕,效率革新:BillusAI AI设计工具、AI设计软件实测测评 - 一搜百应
  • 安卓10-13动态申请sd卡权限
  • 水蛭素哪个品牌最可靠效果好?水蛭素十大品牌排行榜,中老年人群专用 - 博客万
  • 2025 Xhorse XSMA41EN MLB Remote Key: 3-Button Shell for MLB/VVDI2/Key Tool Plus
  • 语音中的Encoder-Decoder学习——跳跃连接UNET
  • 2025年12月网架,球形网架,大跨度网架公司推荐:行业测评与选型指南 - 品牌鉴赏师
  • 2025年度FAG进口轴承五大靠谱供应商推荐 - mypinpai
  • 2025年国内十大酒店家具头部品牌推荐:五星级酒店家具推荐厂家有哪些? - 工业品牌热点
  • 上海申光阿贝折射仪全系列产品介绍 - 品牌推荐大师1
  • 2025年12月重庆渝北区配眼镜标杆店铺最新推荐:雷曼森眼镜,青少年配眼镜。儿童配眼镜、老年人配眼镜、小孩配眼镜、娃儿配眼镜、北碚区配眼镜、视力健康管理新标准 - 海棠依旧大
  • 异构协同・全域洞察:军用异构机群侦察无人机蜂群系统供应商推荐 - 品牌2025
  • Hydration Mismatch 原理详解:SSR 项目中最容易踩的坑
  • Ventoy:多系统USB启动盘制作 报错
  • 从单点勘测到集群协同:无人机集群开启复杂地形测绘新纪元 - 品牌2025
  • 2025年律师适合用的AI法律智能合约工具台TOP5排行榜,律师常用ai有哪些 - myqiye
  • 2025 年 12 月北京老房改造装修公司排名推荐top10:儿童房改造优选亿丰方圆 - 品牌智鉴榜
  • 2025年度数控旋风铣智能生产厂推荐,数控旋风铣供应商与生产商全解析 - mypinpai
  • 10 个 CSS 奇技淫巧