Socket的简单使用
一.Socket:
- Socket又称”套接字"
- 网络上的两个程序通过一个双向的通信链接实现数据的交换,这个连接的一端成为一个socket
- 应用程序通常通过”套接字”向网络发出请求或者应答网络请

二.网络通信的要素
- 网络上的请求就是通过socket来建立链接然后互相通信
- ip地址(网络上主机设备的唯一标识)
- 端口号(定位程序)
用于标示进程的逻辑地址,不同进程的标示
有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发中建议使用1024以上的端口
- 传输协议
- 建立链接,形成传输数据的通道
- 在链接中进行打暑假传输(数据不受到限制 )
- 通过三次握手完成链接,是可靠协议,安全送达
- 必须建立链接,效率会稍低
- 将数据及源和目的封装成数据包中,不需要建立链接
- 每个数据报的大小限制在64k之内
- 因为无需链接,因此是不可靠协议
- 不需要建立链接,速度快
四.Socket通信流程图

五.实现Socket服务端监听
- 实现socket的方法
- Telnet命令
- 添加第三方框架cocoaAsyncSocket--->下载地址 https://github.com/robbiehanson/CocoaAsyncSocket
- 创建工程: 从第三方框架中拉入 GCDAsyncSocket.h GCDAsyncSocket.m

- 创建服务监听对象
#import "ServiceListen.h"
//引入头文件
#import "GCDAsyncSocket.h"
@interface ServiceListen()<GCDAsyncSocketDelegate>
//服务端对象
@property(nonatomic,strong)GCDAsyncSocket *serverSocket;
//保存客户端对象
@property(nonatomic,strong)NSMutableArray *NewSockets;//客户端socket对象 @end
@implementation ServiceListen
/**
* 懒加载
*/
-(NSMutableArray *)NewSockets
{
if (_NewSockets==nil) {
_NewSockets=[NSMutableArray new];
}
return _NewSockets;
}
/**
* 开启服务方法的实现
*/
-(void)start{
//开启10086服务
//服务端的socket只监听 有没客户端请求链接
GCDAsyncSocket *serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(, )];
//绑定端口,并开启监听,代表10086服务已经开启
NSError *error=nil;
[serverSocket acceptOnPort: error:&error];
if (!error) {
NSLog(@"10086服务开启成功");
}
else
{
NSLog(@"开启失败%@",error);
}
self.serverSocket=serverSocket; } #pragma mark 有客户端socket链接到服务器
/**
* 有客户端socket链接到服务器调用
*
* @param sock 服务端
* @param newSocket 客户端
*/
-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
NSLog(@"服务端serverSocket %@",sock);
NSLog(@"客户端newSocket %@",newSocket);
//保存客户端的socket
[self.NewSockets addObject:newSocket];
//提供服务
NSMutableString *serverStr = [NSMutableString string];
[serverStr appendString:@"欢迎光临!!!请输入下面的数字选择服务!\n"];
[serverStr appendString:@"[0]在线充值\n"];
[serverStr appendString:@"[1]在线投诉\n"];
[serverStr appendString:@"[2]优惠信息\n"];
[serverStr appendString:@"[3]特殊服务\n"];
[serverStr appendString:@"[4]退出\n"];
[newSocket writeData:[serverStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:- tag:]; //监听客户端有没有数据上传
//Timeout:-1 代表不超时
//tag:标识作用,现在不用
[newSocket readDataWithTimeout:- tag:];
}
#pragma mark 读取客户端的请求的数据
/**
* 读取客户端的请求的数据
*
* @param sock 客户端
* @param data 数据
* @param tag 标记
*/
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
//1:NSData转成NSString
NSString *str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"读取数据 sock: %@ %@",sock,str);
//获取客户端返回的数据
NSInteger code = [str integerValue];
//默认给客户端的数据
NSString *reponseStr=nil;
switch (code) {
case :
reponseStr = @"没有充值服务....\n";
break;
case :
reponseStr = @"当前没有员工....\n";
break;
case :
reponseStr = @"打折优惠5折....\n";
break;
case :
reponseStr = @"特殊服务一个....\n";
break;
case :
reponseStr = @"退出成功....\n";
break; default:
break;
} //2.处理请求,返回数据给客户端
[sock writeData:[reponseStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:- tag:];
if (code==) {
//移除客户端
[self.NewSockets removeObject:sock];
}
#warning 每次读完数据后,都要调用一次监听数据的方法
[sock readDataWithTimeout:- tag:];
}
- 实例化一个服务监听对象,开始监听
#import <Foundation/Foundation.h>
#import "ServiceListen.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//创建一个服务监听对象
ServiceListen *listen=[[ServiceListen alloc] init];
//开始监听
[listen start];
//开启主运行循环,让服务不能停
[[NSRunLoop mainRunLoop]run]; }
return ;
}
- 运行程序 ,打开终端-->链接服务器

Socket的简单使用的更多相关文章
- socket.io简单入门(一.实现简单的图表推送)
引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主 ...
- socket.io简单说明及在线抽奖demo
socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...
- 运用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...
- java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
- java Socket实现简单在线聊天(一)
最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...
- Java的Socket通信简单实例
服务端 package testlxd; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...
- C#中使用Socket实现简单Web服务器
上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...
- Socket通信 简单实现私聊、群聊(dos命令下)
很久以前的一个Demo,这里服务器只做转发功能,根据ID地址和端口号来标识身份,群聊和私聊只是简单实现, 服务器代码如下: import java.util.*; import java.io.*; ...
- C#基于Socket的简单聊天室实践
序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...
随机推荐
- C#开源
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
- 在WCF数据访问中使用缓存提高Winform字段中文显示速度
在我们开发基于WCF访问方式的Winform程序的时候,一般情况下需要对界面显示的字段进行中文显示的解析.如果是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,但是不建议这样处 ...
- 优化Angular应用的性能
MVVM框架的性能,其实就取决于几个因素: 监控的个数 数据变更检测与绑定的方式 索引的性能 数据的大小 数据的结构 我们要优化Angular项目的性能,也需要从这几个方面入手. 1. 减少监控值的个 ...
- jquery简单原则器(匹配偶数元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Redis数据库安装简介
方法一:Redis手动cmd启动服务 端客户端的方法-------Redis 服务端测试使用1. 下载Redis(https://github.com/mythz/redis-windows)2. 解 ...
- sina sae开发中出现的问题
都是些小问题,但既然出现了,下次就该避免! 网站加载速度慢: 1.安装 Disable Google Fonts 字体插件即可 2.删代码 http://jingyan.baidu.com/arti ...
- 泛函编程(27)-泛函编程模式-Monad Transformer
经过了一段时间的学习,我们了解了一系列泛函数据类型.我们知道,在所有编程语言中,数据类型是支持软件编程的基础.同样,泛函数据类型Foldable,Monoid,Functor,Applicative, ...
- 使用maven profile实现多环境可移植构建(转自CSDN)
使用maven profile实现多环境可移植构建 标签: maven profilemaven自动构建maven自动部署maven可移植构建持续集成 2014-04-25 23:37 26905人阅 ...
- android 查找某个特定文件后缀名
private void queryFiles(){ String[] projection = new String[] { MediaStore.Files.FileColumns._ID, Me ...