即时通讯(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 ...
随机推荐
- .Net手动实现ORM及代码生自动成器
序言 代码生成器 同时提供便捷的开发管理功能和多项开发工作中常用到的辅助工具功能,您可以很方便轻松地进行项目开发,让软件开发变得轻松而快乐!帮您快速开发项目,缩短开发周期,减少开发成本,大大提高了企业 ...
- Codeforces 864E - Fire(dp)
原题连接:http://codeforces.com/problemset/problem/864/E 题意:一个人想从大火中带走一些东西.每次他只能带一个,耗时ti ,价值为pi, 当总时间超过di ...
- Leetcode 12. Integer to Roman(打表,水)
12. Integer to Roman Medium Roman numerals are represented by seven different symbols: I, V, X, L, C ...
- Python_015(面向对象(接口类,抽象类,多态,封装)
一.抽象类与接口类 1.抽象类:抽象即类似或者说比较像的部分,继承描述的是父类与子类的一种关系,要找出这种关系,必须先抽象再继承; a:抽象分成两个层次: 1)由对象->类:将两个有相似地方的对 ...
- 洛谷P1310 表达式的值——题解
题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...
- [BZOJ1478&1488&1815][SGU282]Isomorphism:Polya定理
分析 三倍经验题,本文以[BZOJ1478][SGU282]Isomorphism为例展开叙述,主体思路与另外两题大(wan)致(quan)相(yi)同(zhi). 这可能是博主目前写过最长也是最认真 ...
- [CSP-S模拟测试]:连连看(图论+容斥)
题目传送门(内部题74) 输入格式 输入文件$link.in$ 第一行三个整数$n,m,k$,之间用空格隔开,$n,m$表示地图行数和列数,$k$表示每个方块周围相邻的位置(至多有$4$个,至少有$2 ...
- Java实体类之间的映射(多对多关系)
多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...
- 使用 Python 实现多进程
w 使用 Python 实现多进程https://www.ibm.com/developerworks/cn/aix/library/au-multiprocessing/
- 在mpvue或者Vue中使用VUEX
第一个页面Index,主页哦 import Vue from'vue' import Vuex from'vuex' import getters from'./getters' import sta ...