即时通讯(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 ...
随机推荐
- Spring——简介
学习网站: [1]http://spring.io/ [2]http://projects.spring.io/spring-framework/ Spring是为解决企业应用开发的复杂性而创建的,是 ...
- HDU 6614 AND Minimum Spanning
Time limit 1000 ms Memory limit 131072 kB OS Windows 中文题意 给一张n个点的无向完全图(输入一个n就完事了),每个点标号为1~n,每条边的边权为它 ...
- Python_020(几个经典内置方法)
一.内置方法 1.内置方法表示:__名字__ 几种名称: 1)双下方法 2)魔术方法 3)类中的特殊方法/内置方法 类中的每一个双下方法都有它自己的特殊意义;所有的双下方法没有 需要你在外部直接调用的 ...
- 纯CSS写的各种小三角和小箭头
头朝下的小三角 width:0; height:0; border:50px solid transparent; //所有border都是透明的, border-top-color:black; / ...
- JSP异常处理
JSP异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方.JSP代码中通常有以下几类异常: 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员无 ...
- uniapp开发
问题1:去掉导航条 给一个单独的页面隐藏顶部的 导航栏 可以在pages.json里 单独的路由style下面配置 "app-plus": {"titleNView&q ...
- CentOS yum 安装历史版本 java
1.以1.6为例,找到对应版本 $ yum --showduplicate list java* |grep 1.6 java--openjdk.x86_64 :1.6.0.41-1.13.13.1. ...
- MongoDB学习【一】—MongoDB简介和安装
一.MongoDB简介 1.MongoDB是什么 MongoDB是一款强大.灵活.且易于扩展的通用型数据库,MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_8_使用try_catch_finally处理流中的异常
变量没有初始化的赋值 变量可能赋值会失败.设置fw为null.close报错 把close也用try catch捕获异常 修改写入w盘.实际盘符没有这个 上面异常是这里打印的 继续优化代码
- 测开之路一百二十三:快速搭建python虚拟环境
前提:已装好python3.4+且环境可正常运行 一:手动搭建: 准备好一个工作目录 管理员运行cmd,进入到准备的目录里面 执行命令:python -m venv 虚拟环境名 激活虚拟环境(在ven ...