iOS微信QQ聊天界面的UI框架以及Socket简单实现群聊功能

7.1日更新 Python3 TCP Demo相关

https://blog.csdn.net/Deft_MKJing/article/details/80851879

2.2日更新,socket简易群聊通信,之前实现的是静态本地聊天模拟

Socket群聊
最新版本Demo传送门

1.需要的先下载下来,先开启SocketSeverce 2 这个服务器代码,已经封装好了Socket建立和连接

2.打开工程,自动会连上服务器,已经写好了socket的生成和连接

3.再打开一个终端,模拟第二个客户端telnet 192.168.31.150 3667 输入之后就能进行简单的群聊功能

// 客户端示例代码
// 连接到聊天服务器GCDAsyncSocket *socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];[socket connectToHost:@"127.0.0.1" onPort:3667 error:nil];self.clientSocket = socket;
// 服务端部分示例代码
- (instancetype)init
{if (self = [super init]) {/**注意:这里的服务端socket,只负责socket(),bind(),lisence(),accept(),他的任务到底结束,只负责监听是否有客户端socket来连接*/self.serviceSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];}return self;
}- (void)connected
{NSError *error = nil;// 给一个需要连接的端口,0-1024是系统的[self.serviceSocket acceptOnPort:3667 error:&error];if (error) {NSLog(@"3666服务器开启失败。。。。。%@",error);}else{NSLog(@"开启成功,并开始监听");}
}




很早之前有写过一个很简单的文本聊天的思路微信QQ聊天简单Demo传送门,这东西显然不能在项目中拿来用,常年混在github上的少年,你会发现,很多模仿微信和QQ的小项目或者大项目,都会涉及到一个非常优雅的框架,在github上也有将近1W的star,没错,他就是JSQMessagesViewController

搞事情啊
这里写图片描述


这里写图片描述

个人非常喜欢老外写的框架,而且是还是不断更新的,这个简直是不断学习的好资料啊,人家那面向对象封装的,值得学习,那么花时间来简单介绍下该框架的应用场景

核心类名介绍

  • Mode数据类

    • JSQAudioMediaItem.h 语音
    • JSQLocationMediaItem.h 定位
    • JSQMediaItem.h 非文件的Media基类
    • JSQMessage.h 所有消息都由该类包装,因此,最外层 collectionView用到的就是数组包含该类
    • JSQMessageAvatarImageDataSource.h 头像数据代理
    • JSQMessageBubbleImageDataSource.h 气泡数据代理
    • JSQMessageData.h 发送消息ID date代理
    • JSQMessageMediaData.h 非文本消息数据代理
    • JSQMessagesAvatarImage.h 头像类
    • JSQMessagesBubbleImage.h 气泡类
    • JSQMessagesCollectionViewDataSource.h
    • JSQMessagesCollectionViewDelegateFlowLayout.h
    • JSQPhotoMediaItem.h 图片
    • JSQVideoMediaItem.h 视频
  • View类

    • JSQMessagesCellTextView.m 纯文本TextView
    • JSQMessagesCollectionView.m 核心collectionView继承原生的
    • JSQMessagesCollectionViewCell.m 核心cell
    • JSQMessagesCollectionViewCellIncoming.xib 收到消息cell
    • JSQMessagesCollectionViewCellOutgoing.xib 发送消息cell
    • JSQMessagesComposerTextView.m 粘贴文本
    • JSQMessagesInputToolbar.m 底部的toolBar
    • JSQMessagesLabel.m 头部时间或者底部文字Label
    • JSQMessagesLoadEarlierHeaderView.xib 更多加载View
    • JSQMessagesMediaPlaceholderView.m MediaPlaceHolderView
    • JSQMessagesTypingIndicatorFooterView.xib 预加载指示Bubble

类虽然很多,但是肯定越多越好,说明功能越强大啊
这里写图片描述

1.万事开头难,第一步

创建一个ViewController继承与JSQMessagesViewController,然后来一个数据model,来存放所有接受和发出去的消息,各种类型上面已经介绍了,直接放h文件的代码

// VC
@interface MKJChatViewcontroller : JSQMessagesViewController<UIActionSheetDelegate, JSQMessagesComposerTextViewPasteDelegate>
@property (strong, nonatomic) DemoModelData *demoData; //!< 消息模型- (void)receiveMessagePressed:(UIBarButtonItem *)sender;// Model
***  This is for demo/testing purposes only. *  This object sets up some fake model data.*  Do not actually do anything like this.*  假数据,用来展示玩玩的,别当真*/static NSString * const kJSQDemoAvatarDisplayNameSquires = @"Jesse Squires";
static NSString * const kJSQDemoAvatarDisplayNameCook = @"Tim Cook";
static NSString * const kJSQDemoAvatarDisplayNameJobs = @"Jobs";
static NSString * const kJSQDemoAvatarDisplayNameWoz = @"Steve Wozniak";static NSString * const kJSQDemoAvatarIdSquires = @"053496-4509-289";
static NSString * const kJSQDemoAvatarIdCook = @"468-768355-23123";
static NSString * const kJSQDemoAvatarIdJobs = @"707-8956784-57";
static NSString * const kJSQDemoAvatarIdWoz = @"309-41802-93823";@interface DemoModelData : NSObject/**  这里放的都是JSQMessage对象 该对象有两个初始化方式 1.media or noMedia*/@property (strong, nonatomic) NSMutableArray *messages; // message数组@property (strong, nonatomic) NSDictionary *avatars; // 聊天人所有头像@property (strong, nonatomic) JSQMessagesBubbleImage *outgoingBubbleImageData; // 发出去的气泡颜色@property (strong, nonatomic) JSQMessagesBubbleImage *incomingBubbleImageData; // 收到的气泡颜色@property (strong, nonatomic) NSDictionary *users; // 用户名字信息- (void)addPhotoMediaMessage;//!< 图片消息- (void)addLocationMediaMessageCompletion:(JSQLocationMediaItemCompletionBlock)completion; //!< 定位小心- (void)addVideoMediaMessage; //!< 视频 无底图- (void)addVideoMediaMessageWithThumbnail; //!< 视频带底图- (void)addAudioMediaMessage; //!< 音频


首先注意的,这里的数据都是faker,没错,就是faker大魔王,拿来玩玩而已,具体需要根据业务逻辑来,那么再来看看伪造的实现数据

2.搞事情,搞数据啊

// 纯文本JSQMessage对象创建
self.messages = [[NSMutableArray alloc] initWithObjects:[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquiressenderDisplayName:kJSQDemoAvatarDisplayNameSquiresdate:[NSDate distantPast]text:NSLocalizedString(@"Welcome to JSQMessages: A messaging UI framework for iOS.", nil)]
// 非纯文本JSQMessage对象创建之图片
JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"goldengate"]];JSQMessage *photoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquiresdisplayName:kJSQDemoAvatarDisplayNameSquiresmedia:photoItem];// 非纯文本JSQMessage对象创建之Location定位CLLocation *ferryBuildingInSF = [[CLLocation alloc] initWithLatitude:37.795313 longitude:-122.393757];JSQLocationMediaItem *locationItem = [[JSQLocationMediaItem alloc] init];[locationItem setLocation:ferryBuildingInSF withCompletionHandler:completion];JSQMessage *locationMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquiresdisplayName:kJSQDemoAvatarDisplayNameSquiresmedia:locationItem];// 非纯文本JSQMessage对象创建之视频NSURL *videoURL = [NSURL URLWithString:@"http://qingdan.img.iwala.net/v/twt/twt1612_720P.mp4"];JSQVideoMediaItem *videoItem = [[JSQVideoMediaItem alloc] initWithFileURL:videoURL isReadyToPlay:YES];JSQMessage *videoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquiresdisplayName:kJSQDemoAvatarDisplayNameSquiresmedia:videoItem];       
// 非纯文本JSQMessage对象创建之语音
NSString * sample = [[NSBundle mainBundle] pathForResource:@"jsq_messages_sample" ofType:@"m4a"];NSData * audioData = [NSData dataWithContentsOfFile:sample];JSQAudioMediaItem *audioItem = [[JSQAudioMediaItem alloc] initWithData:audioData];JSQMessage *audioMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquiresdisplayName:kJSQDemoAvatarDisplayNameSquiresmedia:audioItem];
// 最后都加到Model的数据里面
[self.messages addObject:JSQMessage对象];                                                                                           


3.搞头像和气泡

// 头像图片制作工具类// 新方法// 通过文字和颜色创建头像JSQMessagesAvatarImage *jsqImage = [JSQMessagesAvatarImageFactory avatarImageWithUserInitials:@"MKJ"backgroundColor:[UIColor colorWithWhite:0.85f alpha:1.0f]textColor:[UIColor colorWithWhite:0.60f alpha:1.0f]font:[UIFont systemFontOfSize:14.0f]diameter:kJSQMessagesCollectionViewAvatarSizeDefault+10];// 通过image创建头像JSQMessagesAvatarImage *cookImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_cook"] diameter:kJSQMessagesCollectionViewAvatarSizeDefault];;// 气泡图片制作工具类// [UIImage jsq_bubbleRegularImage]这个方法有很多种气泡模式,圆的,尖的以及边框形式的JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] initWithBubbleImage:[UIImage jsq_bubbleRegularImage] capInsets:UIEdgeInsetsZero];// 发出去的气泡颜色self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleLightGrayColor]];
//        self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor whiteColor]];// 收到的气泡颜色self.incomingBubbleImageData = [bubbleFactory incomingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleGreenColor]];

4.控制器写数据逻辑代理

先提一下那个滚动动画,慎用,有点不可控

- (void)viewDidAppear:(BOOL)animated
{[super viewDidAppear:animated];/***  Enable/disable springy bubbles, default is NO.*  You must set this from `viewDidAppear:`*  Note: this feature is mostly stable, but still experimental*  注意啊,这个有时候会蹦掉,玩玩就好了*/// 一个bubbles的移动动画效果self.collectionView.collectionViewLayout.springinessEnabled = [[[NSUserDefaults standardUserDefaults] valueForKey:@"kDynamic"] boolValue];
}



模拟个右上角的按钮,来接受消息,最核心代码

// 收到别人发的消息了
- (void)receiveMessagePressed:(UIBarButtonItem *)sender
{// 这仅仅是模拟Demo/***  Show the typing indicator to be shown*  是否需要一个加载指示*/self.showTypingIndicator = YES;/***  Scroll to actually view the indicator 滚动到最后*/[self scrollToBottomAnimated:YES];/***  Copy last sent message, this will be the new "received" message*  来一份上一次的数据*/JSQMessage *copyMessage = [[self.demoData.messages lastObject] copy];if (!copyMessage) {copyMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdJobsdisplayName:kJSQDemoAvatarDisplayNameJobstext:@"First received!"];}/***  Allow typing indicator to show*/dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{NSMutableArray *userIds = [[self.demoData.users allKeys] mutableCopy];[userIds removeObject:self.senderId];NSString *randomUserId = userIds[arc4random_uniform((int)[userIds count])];JSQMessage *newMessage = nil;id<JSQMessageMediaData> newMediaData = nil;id newMediaAttachmentCopy = nil;// JSQMessage对应的BOOL isMediaMessage = NO就是text,YES就是图片,音频,视频,定位if (copyMessage.isMediaMessage) {/***  Last message was a media message*/// 先把代理存储下id<JSQMessageMediaData> copyMediaData = copyMessage.media;// 如果是图片if ([copyMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {JSQPhotoMediaItem *photoItemCopy = [((JSQPhotoMediaItem *)copyMediaData) copy];// 默认都是YES的,这句话的意思是气泡的小尖尖朝哪个方向,YES是发出去的,就朝右,反之photoItemCopy.appliesMediaViewMaskAsOutgoing = NO;newMediaAttachmentCopy = [UIImage imageWithCGImage:photoItemCopy.image.CGImage];/***  Set image to nil to simulate "downloading" the image*  and show the placeholder view*  代表发出去的消息会进行短暂的loading*/photoItemCopy.image = nil;newMediaData = photoItemCopy;}else if ([copyMediaData isKindOfClass:[JSQLocationMediaItem class]]) {// 坐标消息  同上JSQLocationMediaItem *locationItemCopy = [((JSQLocationMediaItem *)copyMediaData) copy];locationItemCopy.appliesMediaViewMaskAsOutgoing = NO;newMediaAttachmentCopy = [locationItemCopy.location copy];/***  Set location to nil to simulate "downloading" the location data*/locationItemCopy.location = nil;newMediaData = locationItemCopy;}else if ([copyMediaData isKindOfClass:[JSQVideoMediaItem class]]) {// 视频消息 同上JSQVideoMediaItem *videoItemCopy = [((JSQVideoMediaItem *)copyMediaData) copy];videoItemCopy.appliesMediaViewMaskAsOutgoing = NO;newMediaAttachmentCopy = [videoItemCopy.fileURL copy];/***  Reset video item to simulate "downloading" the video*/videoItemCopy.fileURL = nil;videoItemCopy.isReadyToPlay = NO;newMediaData = videoItemCopy;}else if ([copyMediaData isKindOfClass:[JSQAudioMediaItem class]]) {// 同上JSQAudioMediaItem *audioItemCopy = [((JSQAudioMediaItem *)copyMediaData) copy];audioItemCopy.appliesMediaViewMaskAsOutgoing = NO;newMediaAttachmentCopy = [audioItemCopy.audioData copy];/***  Reset audio item to simulate "downloading" the audio*/audioItemCopy.audioData = nil;newMediaData = audioItemCopy;}else {NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);}// 除开Text外的消息类newMessage = [JSQMessage messageWithSenderId:randomUserIddisplayName:self.demoData.users[randomUserId]media:newMediaData];}else {/***  Last message was a text message  纯文本消息类*/newMessage = [JSQMessage messageWithSenderId:randomUserIddisplayName:self.demoData.users[randomUserId]text:copyMessage.text];}/***  Upon receiving a message, you should:**  1. Play sound (optional)*  2. Add new id<JSQMessageData> object to your data source*  3. Call `finishReceivingMessage`*/// [JSQSystemSoundPlayer jsq_playMessageReceivedSound];// 播放声音[self.demoData.messages addObject:newMessage];[self finishReceivingMessageAnimated:YES];// 如果消息类型是Media  非文本形式if (newMessage.isMediaMessage) {/***  Simulate "downloading" media  模拟下载*/dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{/***  模拟下载,下载完之后重新刷*/if ([newMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {((JSQPhotoMediaItem *)newMediaData).image = newMediaAttachmentCopy;[self.collectionView reloadData];}else if ([newMediaData isKindOfClass:[JSQLocationMediaItem class]]) {[((JSQLocationMediaItem *)newMediaData)setLocation:newMediaAttachmentCopy withCompletionHandler:^{[self.collectionView reloadData];}];}else if ([newMediaData isKindOfClass:[JSQVideoMediaItem class]]) {((JSQVideoMediaItem *)newMediaData).fileURL = newMediaAttachmentCopy;((JSQVideoMediaItem *)newMediaData).isReadyToPlay = YES;[self.collectionView reloadData];}else if ([newMediaData isKindOfClass:[JSQAudioMediaItem class]]) {((JSQAudioMediaItem *)newMediaData).audioData = newMediaAttachmentCopy;[self.collectionView reloadData];}else {NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);}});}});
}



注意:收到消息三步骤
1.playSound 可选
2.Add new id object to your data source 把数据源加入
3. Call finishReceivingMessage,告诉完成了,直接刷新数据


发送纯文本消息,步骤和上面一样

// 纯文本发送
- (void)didPressSendButton:(UIButton *)buttonwithMessageText:(NSString *)textsenderId:(NSString *)senderIdsenderDisplayName:(NSString *)senderDisplayNamedate:(NSDate *)date
{/***  Sending a message. Your implementation of this method should do *at least* the following:**  1. Play sound (optional)*  2. Add new id<JSQMessageData> object to your data source*  3. Call `finishSendingMessage`*/// 套路三部曲 直接完成组装// [JSQSystemSoundPlayer jsq_playMessageSentSound];JSQMessage *message = [[JSQMessage alloc] initWithSenderId:senderIdsenderDisplayName:senderDisplayNamedate:datetext:text];[self.demoData.messages addObject:message];[self finishSendingMessageAnimated:YES];
}



发送非文本消息,ActionSheet选择器

// 点击左侧accessory按钮启动actionSheet
- (void)didPressAccessoryButton:(UIButton *)sender
{[self.inputToolbar.contentView.textView resignFirstResponder];UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Media messages", nil)delegate:selfcancelButtonTitle:NSLocalizedString(@"Cancel", nil)destructiveButtonTitle:nilotherButtonTitles:NSLocalizedString(@"Send photo", nil), NSLocalizedString(@"Send location", nil), NSLocalizedString(@"Send video", nil), NSLocalizedString(@"Send video thumbnail", nil), NSLocalizedString(@"Send audio", nil), nil];[sheet showFromToolbar:self.inputToolbar];
}// 点击左侧accessory按钮弹出sheet,选择需要发送的事件添加到数据源
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{if (buttonIndex == actionSheet.cancelButtonIndex) {[self.inputToolbar.contentView.textView becomeFirstResponder];return;}switch (buttonIndex) {case 0:[self.demoData addPhotoMediaMessage];break;case 1:{__weak UICollectionView *weakView = self.collectionView;[self.demoData addLocationMediaMessageCompletion:^{[weakView reloadData];}];}break;case 2:[self.demoData addVideoMediaMessage];break;case 3:[self.demoData addVideoMediaMessageWithThumbnail];break;case 4:[self.demoData addAudioMediaMessage];break;}// [JSQSystemSoundPlayer jsq_playMessageSentSound];[self finishSendingMessageAnimated:YES];
}

注意:发送消息三步骤和上面的收到的步骤一模一样的

剩下的都是一些修饰的代理数据UI以及一些附带事件的实现

// 发送的人ID
- (NSString *)senderId
// 发送人名字
- (NSString *)senderDisplayName
// 根据index返回需要加载的message对象
- (id<JSQMessageData>)collectionView:(JSQMessagesCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath
// 删除消息
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didDeleteMessageAtIndexPath:(NSIndexPath *)indexPath
// 聊天气泡,根据ID判断是发送的还是接受的
- (id<JSQMessageBubbleImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView messageBubbleImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
// 头像
- (id<JSQMessageAvatarImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView avatarImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
// 时间UI
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
// 除本人以外显示bubble cell上面的名字
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForMessageBubbleTopLabelAtIndexPath:(NSIndexPath *)indexPath
// 气泡cell底部文字
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellBottomLabelAtIndexPath:(NSIndexPath *)indexPath



基本上的逻辑就已经完成了,只要根据业务加载实际的逻辑就能自己做一套聊天的了,但是细节还需要完善很多,毕竟一套成熟的聊天框架是需要不断完善的,这里抛砖引玉,觉得可以的同学可以顺手给个赞,有问题及时留言,多交流多学习总是不会错的



1.WechatQQ聊天初级Demo

2.Wechat朋友圈高度自适应

3.RunLoop理解和常见问题

4.RunTime基本使用和面试问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34075.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JetChat-简仿微信聊天应用

Swift5.0编写的简仿微信聊天应用&#xff0c;完美支持表情键盘、单聊、群聊、本地消息会话缓存、朋友圈、白天和黑夜主题模式 Examples - 主要界面展示 聊天朋友圈 白天模式黑夜模式 主要技术运用 聊天功能采用RxSwiftMVVM响应式架构设计&#xff0c;通过ViewModel合理过渡处…

程序员聊天必备表情包,收好不谢

现在聊天用表情代替文字已经是潮流了&#xff0c;往往一张图片比文字更能表达内心的想法&#xff0c;今天我们就来了解下程序员聊天时都用些什么表情。 程序员怒产品 &#xff1a; 被吐槽写BUG时怎么办 产品又来提需求 产品又要改需求&#xff0c;怎么办 产品说&#xff0c;这个…

【华为云技术分享】云图说|全新华为云云备份服务:为您的数据提供三合一的保障

云上道路千万条&#xff0c;数据安全第一条。当不幸在云上发生病毒袭击、误删除、软件故障等“车祸”时&#xff0c;如果没有事先对数据进行保护&#xff0c;业务将会中断&#xff0c;并且将导致数据丢失、损坏的后果&#xff01; 华为云云备份就像安全气囊&#xff0c;关键时…

云存储——华为网盘

华为网盘 编辑本段信息 [1] 华为网盘是华为 软件公司&#xff08;下简称 华为公司&#xff0c;华为投资控 [2] 股有限公司的子公司&#xff09;旗下的互联网存储服务。首次注册为5G容量&#xff0c;可以通过各种渠道来获得更多 网络存储空间。可以当作U盘使用,但比优盘方便安全…

利用群晖nas备份华为手机数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、确保手机和nas处于同一局域网二、nas启用smb服务&#xff0c;并且设置正确1.启用smb服务2.在设置最小SMB协议时&#xff0c;会有提示不安全因数的可能。但是…

阿里云/华为云云盘挂载步骤

参拷文章&#xff1a;linux centos7 磁盘分区、挂载 初始化Linux数据盘&#xff08;fdisk&#xff09; 挂在的相关指令 #查看磁盘及分区信息 fdisk -l看到vdb没有启用 对/dev/vdb进行分区操作 fdisk /dev/vdb总结输入&#xff1a;n > p > 回车 > 回车 》 回车 》 …

DTT年度收官圆桌π,华为云8位技术专家的年末盘点

摘要&#xff1a;收下这份DTT年度收官圆桌π总结&#xff0c;在新的一年心想事成&#xff0c;技术上更上一层楼。 本文分享自华为云社区《DTT年度收官圆桌π&#xff0c;华为云8位技术专家的年末盘点》&#xff0c;作者&#xff1a;华为云社区精选 。 在2022年的年末&#xff…

【华为云技术分享】打卡APIG服务专享版,打造全栈API治理方案

伴随企业的数字化转型跟IT架构演进&#xff0c;越来越多的企业&组织选择以API的方式实现能力的开放跟通讯&#xff0c;这部分也成了系统集成的交界点。通过三组数据来看整体趋势 2017年&#xff0c;有50%的B2B商业合作将通过API完成2018年&#xff0c;75%的财富500强公司将…

华为云混合云备份解决方案、云南华为云数据备份存储、备份软件解决方案

标题 一、数据是企业的生命线&#xff0c;备份系统应作为IT基础设施进行建设 标题 二、 数据爆炸性增长带给数据备份的挑战 标题 三、混合云备份&#xff1a;优化企业运营成本的重要手段 1、按需预定 备份软件按需使用与付费 备份服务器按需使用与付费 存储空间按需使用与付…

微信云托管云调用使用指南

微信云托管云调用使用指南 一、云调用是什么&#xff1f; 云调用是具有「免鉴权调用微信开放服务接口」特性的能力&#xff0c;是云开发/云托管中微信生态的一部分。 在云调用出现之前&#xff0c;微信开放服务接口的正常调用&#xff0c;需要开发者使用密钥信息获取access_t…

华为云盘古大模型登Nature:秒级完成气象预测,速度快10000多倍

来源&#xff1a;机器之心 华为云盘古气象大模型突破了 AI 预报天气精度不及传统数值预报的世界性难题&#xff0c;该模型是首个精度超过传统数值预报方法的 AI 预测模型&#xff0c;对比传统方法预测速度提升 10000 倍&#xff0c;可秒级完成对全球气象的预测。 天气预报是科学…

中科磐云 数据包分析infiltration

任务环境说明&#xff1a; ●服务器场景&#xff1a;Server6&#xff08;封闭靶机&#xff09; ●服务器场景操作系统&#xff1a;未知 ●FTP用户名&#xff1a;infiltration密码&#xff1a;infiltration 1.登录FTP下载数据包文件infiltration.pacapng&#xff0c;找出恶意…

专家解惑 | 关于华为云盘古大模型,你想问的都在这里~

本文分享自华为云社区《专家解惑 | 关于华为云盘古大模型&#xff0c;你想问的都在这里~》&#xff0c;原文作者&#xff1a;HWCloudAI。 4月25日&#xff0c;华为云发布盘古系列超大规模预训练模型&#xff0c;包括30亿参数的全球最大视觉&#xff08;CV&#xff09;预训练模…

探秘华为云盘古大模型:AI for industries的身体力行

摘要&#xff1a;大模型是新一轮AI发展的核心&#xff0c;其已在推进产业智能化升级中已表现出巨大潜力&#xff0c;并将在未来三年里形成风起云涌之势。 本文分享自华为云社区《探秘华为云盘古大模型&#xff1a;AI for industries的身体力行》&#xff0c;作者&#xff1a;华…

聚观早报 |腾讯Q1营收重回两位数增长;特斯拉向印度政府提议建厂

今日要闻&#xff1a;腾讯Q1营收重回两位数增长&#xff1b;传特斯拉向印度政府提议建厂&#xff1b;ChatGPT创始人呼吁加强对AI监管&#xff1b;笑果被罚款1335万&#xff1b;药明康德联合创始人赵宁去世 腾讯Q1营收重回两位数增长 5 月 17 日&#xff0c;腾讯控股发布 2023 …

向量数据库是如何工作的?

点击上方“芋道源码”&#xff0c;选择“设为星标” 管她前浪&#xff0c;还是后浪&#xff1f; 能浪的浪&#xff0c;才是好浪&#xff01; 每天 10:33 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源…

“危险!立刻停下所有大型AI研究!”马斯克领衔,1000多名硅谷企业家科学家联名呼吁...

看见更大的世界 打开App APP内打开 华尔街见闻 原创1个小时前 华尔街见闻官方账号 优质财经领域创作者 关注 当全社会都在为AI的进化而欢呼雀跃&#xff0c;全新的、意想不到的风险可能也正在悄悄酝酿。 3月22日&#xff0c;生命未来研究所&#xff08;Future of Life&#xf…

OpenAI将用新方法来训练模型;英伟达CEO拟本月会见腾讯、字节跳动等企业高管;摩根大通正寻求雇佣更多AI员工丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 176比特“祖冲之号”量子计算云平台上线 5月31日&#xff0c;在中科院量子信息与量子科技创新研究院的指导下&#xff0c;在中科院软件所和中电科十六所的技术支持下&#xff0c;科大国盾量子技术股份有限公司携…

OpenAI CEO 在美国国会首秀:回应对 AI 的一切质疑,主动要求接受监管!

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 从最初只有十来个人的小团队&#xff0c;到如今的 300 人&#xff1b;从起步拿到 10 亿美元启动资金&#xff0c;到创造了估值约为 300 亿美元的 AI 独角兽“神话”&#xff0c;OpenAI 用 GPT 系列、Wh…

LaTeX常用符号及希腊字母

LaTeX常用符号及希腊字母 在LaTeX代码加载包的地方添加 \usepackage{amsmath} LaTeX符号代码效果\rightarrow{}→\leftarrow{}←\xleftarrow[下方公式]{上方公式}\xrightarrow[下方公式]{上方公式}Eg:A \xleftarrow[n]{x>0} B\emptyset∅\in∈\notin∉\subset⊂\supset⊃\…