即时通讯(II)
Socket 连接Demo
Socket客户端代码
#import "ViewController.h"
//0、导入头文件
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h> static const char *serevr_ip = "127.0.0.1";
static const short server_port = ; @interface ViewController () @property (assign, nonatomic) int clientSocket; @property (weak, nonatomic) IBOutlet UITextField *msgTextField;
@property (strong, nonatomic) IBOutletCollection(UITextView) NSArray *chatTextView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initSocket];
} - (void)initSocket{
//1、创建 Socket /*
参数
第一个参数: adress_family,协议簇 AF_INET ---> IPV4(本地主机通讯) IPV6 AF_UNIX(本地主机通讯,linux使用)
第二个参数: 数据格式----> SOCK_STREAM(TCP)/SOCK_DGRAM(UDP);TCP基于数据流传输,UDP基于数据报文传输
第三个参数: protocol IPPROTO_TCP,如果传入 0 ,会自动根据第二个参数,选中合适的协议;服务端自动给你确认需要什么协议
返回值: 成功 -----> 正值 失败 -------> -1
*/ _clientSocket = socket(AF_INET, SOCK_STREAM, ); //2、连接服务器
struct sockaddr_in sAddr = {}; sAddr.sin_len = sizeof(sAddr);//长度 inet_aton(serevr_ip, &sAddr.sin_addr); //字节序,分为:主机字节序(整数在主机中存放的顺序)和网络字节序。 sAddr.sin_port = htons(server_port); sAddr.sin_family = AF_INET; //协议簇 /*
第一个参数: 客户端 Socket 第二个参数: 指向数据结构 sockeAddr 的指针,其中包括目的端口和 IP地址 第三个参数: 结构体数据长度 返回值:成功 ----> 0 其他 ----> 错误代号
*/
int connectFlag = connect(_clientSocket, (struct sockaddr *)&sAddr, sizeof(sAddr)); if (connectFlag == ) {
//开启线程后要开为一个长度线程
NSThread *thread = [[NSThread alloc] initWithTarget:self
selector:@selector(receiveAction) object:nil];
[thread start]; }else{
NSLog(@"连接错误"); }
} - (void)receiveAction{
while () {
//内容缓存区
char rec_msg[] = {}; /**
监听服务端发送的数据 @param _clientSocket 客户端Socket
@param rec_msg 发送内容地址,内容缓存区
@param rec_msg 发送内容长度
@param rec_msg 发送方式标识,一般为 0
@return 成功---> 返回字节数,失败---->SOCKET-ERROR
*/
recv(_clientSocket, rec_msg, sizeof(rec_msg), );
printf("----->%s\n",rec_msg);
}
} - (void)sendMessage:(NSString *)msg{
const char *send_Message = [msg cStringUsingEncoding:NSUTF8StringEncoding];
send(_clientSocket,send_Message,strlen(send_Message) ,);
} - (IBAction)sendAction:(UIButton *)sender {
if ([_msgTextField.text isEqualToString:@""]) {
NSLog(@"发送消息不能为空");
return;
}
[self sendMessage:_msgTextField.text];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
TCP连接以后进行通讯可能会发生丢包事件,这时客户端和服务器端就要进行一定的约定,定义一些 “/n” 之类的一些标识符。
打开一个终端端口,输入:
nc -l 6969 //监听客户端数据的发送
然后运行客户端的程序代码,否则控制台会打印:"连接错误";
在模拟器中输入:33333
终端也会出现:33333
在终端输入:-----》》》welcome 即时通讯
在程序的控制台会打印:
终端如图:
Socket服务器端代码
代码图一:
代码图二:
代码图三:
代码图四:
代码图五:
面试题:
Socket 监听一个端口,最多有多少个连接?
与客户端最多有1024个连接,但同时能连接的请求最多5个。
服务器同一时刻,一个端口只能建立一个连接服务端,但是它会生成一个等待队列,每一个请求它都会放在这个请求队列里,根据某一算法在某一时刻处理哪个请求。
即时通讯(II)的更多相关文章
- 利用WCF双工模式实现即时通讯
概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...
- android环境下的即时通讯
首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...
- 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南
申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...
- 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答
申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...
- 【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了
申明:MobileIMSDK目前为个人原创开源工程,投入了大量的时间和精力,希望对需要的人有所帮助.如需与作者交流,见文章底部个人签名处,互相学习.Q群:215891622,欢迎共同志趣者学习和交流. ...
- ActiveMQ 即时通讯服务 浅析
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...
- APP邂逅即时通讯云,让你的手机APP聊起来
#推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5
- 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
随机推荐
- 事物 @Transactional
转载:http://www.cnblogs.com/kristain/articles/2038397.html 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库 ...
- 软件工程 in MSRA Code Search-第二次结对编程
重现基线模型 我们选择了 code2vec 模型进行复现.该模型由 Uri Alon 等作者于 2018 年提出. 模型思路: 从代码与普通语言相比的特殊性入手,首先,对于输入的代码段,作者考虑到尽管 ...
- A Network in a Laptop: Rapid Prototyping for Software-Defined Networks
文章名称:A Network in a Laptop: Rapid Prototyping for Software-Defined Networks 文章来源:Lantz B , Heller B ...
- Linux用户和用户组指令
1.创建用户 >useradd username 创建用户 >passwd username 给用户设置密码 ======================================= ...
- 网页分页page
public class PageBean { private int page; // 第几页 private int pageSize; // 每页记录数 private int start; / ...
- GMM demo
# GMM model # // library(mvtnorm) ) n1 = n2 = mu1 = c(,) mu2 = c(-,-) sigma1 = matrix(c(,.,.,),nrow= ...
- 腾讯重磅开源分布式NoSQL存储系统DCache
当你在电商平台秒杀商品或者在社交网络刷热门话题的时候,可以很明显感受到当前网络数据流量的恐怖,几十万商品刚开抢,一秒都不到就售罄:哪个大明星出轨的消息一出现,瞬间阅读与转发次数可以达到上亿.作为终端用 ...
- 【HANA系列】SAP HANA 1.0 SPS 11 新特性
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 1.0 SPS ...
- oracle--表空间处理
CREATE TABLESPACE命令详解(转) 表空间理解 https://www.cnblogs.com/kerrycode/p/3418694.html 常用操作 https://www.cnb ...
- Sentinel之熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一.由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积.Sentinel 熔断降级会在调用链路 ...