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)的更多相关文章

  1. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

  2. android环境下的即时通讯

    首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...

  3. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

  4. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答

    申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...

  5. 【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了

    申明:MobileIMSDK目前为个人原创开源工程,投入了大量的时间和精力,希望对需要的人有所帮助.如需与作者交流,见文章底部个人签名处,互相学习.Q群:215891622,欢迎共同志趣者学习和交流. ...

  6. ActiveMQ 即时通讯服务 浅析

      一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...

  7. APP邂逅即时通讯云,让你的手机APP聊起来

     #推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5 

  8. 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯

    岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...

  9. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

随机推荐

  1. Codeforces 980D

    这题其实挺水的,但我比较vegetable,交了好多次才过. 题意: 给定一个序列,把这个序列的所有连续子序列分组,每组中任意两个数相乘是个完全平方数,输出每个子序列最少分的组数: 思路: 先把每个数 ...

  2. Linux用户和用户组指令

    1.创建用户 >useradd username 创建用户 >passwd username 给用户设置密码 ======================================= ...

  3. E. You Are Given Some Strings...

    E. You Are Given Some Strings... AC自动机 求一个串$t$中包含子串$s_{i}+s_{j}$的个数. 可以正反跑两遍AC自动机 正着跑,表示$s_{i}$结束,反正 ...

  4. Laravel 的Artisan 命令学习

    Laravel 的Artisan 命令学习 Artisan 是 Laravel 提供的 CLI(命令行接口),它提供了非常多实用的命令来帮助我们开发 Laravel 应用.前面我们已使用过 Artis ...

  5. leetcode-mid-Linked list-94 Binary Tree Inorder Traversal

    mycode  95% # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): ...

  6. Oracle12c ASMM和hugepage

    在Oracle 12c,测试发现默认并不启用AMM 特性,而是使用了ASMM.因为在X86 架构下的linux 平台中,配置hugepage时,也是需要关闭AMM,使用ASMM特性. AMM分配内存的 ...

  7. SeaJS基本开发原则

    SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则.使用SeaJS开发JavaScript的基本原则就是:一切皆为模块.引入SeaJS后,编写JavaScr ...

  8. vue-element-template模板项目使用记录(持续更新)

    1. npm 使用注意事项: a. node.js 使用 v8.16.0 版本,使用 v10 版本会有各种莫名其妙的报错 b. 开箱先改淘宝镜像: npm config set registry ht ...

  9. 类StringBuffer

    1字符串声明和创建 public StringBuffer() 无参构造函数 public StringBuffer(int capacity) 指定容量的字符串缓冲区对象 public String ...

  10. Mac 设置git命令tab自动补全(亲测有效)

    转载 :https://blog.csdn.net/tiancaijyy/article/details/84888868 注意: 获取git-completion.bash  要对应自己的git版本 ...