socket初级使用(客户端)
在国庆这段时间里用零星的一些时间看了一下socket的学习资料,由于笔者偏向学习实用方面的内容,因此此篇文章涉及理论知识较少,主要是以实现思路(怎么做)为主,但在实现之前还是需要了解一些基础的理论知识(如果其中有误请指出)
TCP是用socket来实现,或者说socket就是对TCP的封装,因此要想明白Socket连接,先要明白TCP连接。
TCP(传输控制协议)(对应TCP的另一种协议是UDP协议,读者可自行查阅相关资料)
作用:建立连接,形成传输数据的通道
特点:在连接中进行大数据传输(数据大小不收限制)
优点:通过三次握手完成连接,是可靠协议,安全送达(关于三次握手可以用打电话的例子说明)

/**
主要实现思路
* 1.创建主机地址,设置端口号
2.连接到主机
3.将c语言输入输出流转化为oc语言并代理
4.打开输入输出流,并加入消息循环池
最后个根据代理方法来监听输入输出流的变化即可
*/
//设置主机地址和端口号根据服务端所给端口号设置
NSString *host = @"127.0.0.1";
int port = ;
//创建c语言输入输出流
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
//链接至主机
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
//将c语言输入输出流转化为oc对象,此处用到定义好的OC全局变量
_outputStream = (__bridge NSOutputStream *)writeStream;
_inputStream = (__bridge NSInputStream *)readStream;
//设置代理
_outputStream.delegate = self;
_inputStream.delegate = self;
//打开输入输出流通道并监听
[_outputStream open];
[_inputStream open];
//加入消息循环池,若不放入消息循环池不能做到监听
[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
接下来实现输入输出流的代理方法让我们可以实时监听输入输出流的改变
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventOpenCompleted:
// NSLog(@"%@",[aStream class]);
NSLog(@"连接到主机完成");
break;
case NSStreamEventHasBytesAvailable:
// NSLog(@"%@",[aStream class]);
NSLog(@"有字节可读");
//读取对应的字节
[self readData];
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"%@",[aStream class]);
NSLog(@"可发送字节");
break;
case NSStreamEventErrorOccurred:
NSLog(@"链接错误");
break;
case NSStreamEventEndEncountered:
NSLog(@"断开链接");
//链接断开后需要关闭输出输出流通道并将其移出消息循环池
[_outputStream close];
[_inputStream close];
[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
break;
}
}
对应的就有输出数据和输入数据
//输出数据,此处name需要匹配服务器端输入格式要求
NSString *name = [@"iam:" stringByAppendingString:@"lisi"];
//做出对应的转化
NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding];
//将数据输出
[_outputStream write:data.bytes maxLength:data.length]; //有输出后输入端会监听到接收了新的数据此处就可以直接读取
- (void)readData {
//设置一个字符数组用于接收字符数据
uint8_t buff[];
//获取字符数据并得到其长度
NSUInteger length = [_inputStream read:buff maxLength:sizeof(buff)];
//将接收的字符数组转化为OC对象
NSString *receving = [[NSString alloc] initWithBytes:buff length:length encoding:NSUTF8StringEncoding];
NSLog(@"%@",receving);
}
从上述代码中可以看出socket的使用方法其实还是较为简单,关键是需要理解到其实现步骤,只要记住了步骤再做出对应的转化就能很好的实现,当然此处只是最简单的socket编程。希望此文对各位有帮助,最后祝大家国庆快乐!
socket初级使用(客户端)的更多相关文章
- Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...
- Socket实现聊天客户端
今天在极客学院上看到了一个关于Socket的视频讲解,感觉还不错,就写了份代码,拿来分享一下. Socket使用方法 关于Socket的使用,我们首先要弄清楚的是,在服务器端还是在客户端使用.因为这的 ...
- c#Socket服务器与客户端的开发(1)
上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发 ...
- day 29 socket 初级版
# 客户端介绍简单版# import socket# #1买手机# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STR ...
- 异步Socket服务器与客户端
本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. S ...
- Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)
Ajax跨域问题及解决方案 目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- C#版 Winform界面 Socket编程 Client客户端
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- socket编程中客户端常用函数 以及简单实现
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
随机推荐
- Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算
Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差. DeltaHeight = ...
- 12.162s 1805.867s
[SQL]DROP PROCEDURE IF EXISTS truncate_insert_sales_rank_toparow_week; 受影响的行: 时间: .001s [SQL] CREATE ...
- 《linux内核设计与实现》读书笔记第十八章
第18章 调试 18.1 准备开始 准备工作需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 18.2 内核中的bug 内核中bug的产生原因 从明白无误的错误代码——没有把 ...
- 移除\禁用 jquery mobile 元素样式渲染
在元素上加属性. data-role="none"
- js 除法 取整
js 除法 取整 1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.roun ...
- jquery的toFixed方法的正确使用
最近一段时候公司的项目中遇到这么个事情,需要计算手续费,而这个手续费必须是保留小数点后面两位,且是由小数点后面第三位四舍五入,就这么个场景: 说说我计算的过程,下面是前两个数是测试用的: howMuc ...
- 安装vim
命令安装vim sudo apt-get install vim
- ubuntu 15.04 联网提示:wifi已通过硬件开关禁用
执行以下命令: echo "options asus_nb_wmi wapf=4"| sudo tee /etc/modprobe.d/asus_nb_wmi.conf 重启
- BJFU 1015
描述 数字具有神奇的魔力,神奇到ben想把所有数字全部保存起来.于是他设想了如下的保存方法.假设有一张无限大的纸板,将所有自然数(不包括0)按如下顺序排列书写在纸板上保存:1 2 6 7 15 1 ...
- 【实践】jQuery实现三联联动
网上看过很多关于联动的jq或js代码,最近班上的前端大神教了我一种比网上还简单的jq联动方法,自己琢磨过之后确实比其他方法更简单更简洁所以在这里分享一下 先上html代码 <div id=&qu ...