socket 概念,简单用法

Socket描述了一个IP、端口对。它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息。所以,Socket一定包含了通信的双发,即客户端(Client)与服务端(server)。

1)服务端利用Socket监听端口;

2)客户端发起连接;

3)服务端返回信息,建立连接,开始通信;

4)客户端,服务端断开连接。

1套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应 用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

2 建立socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

4、SOCKET连接与TCP连接

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

5、Socket连接与HTTP连接

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网 络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

很多情况下,需要服务器端主动向客户端推送

iphone的标准推荐CFNetwork C库编程.但是编程比较烦躁。在其它OS往往用类来封装的对Socket函数的处理。比如MFC的CAsysncSocket.在iphone也有类似于 开源项目.cocoa AsyncSocket库, 官方网站:http://code.google.com/p/cocoaasyncsocket/ 它用来简化 CFnetwork的调用.

一.在项目引入ASyncSocket库

1.下载ASyncSocket库源码

2.把ASyncSocket库源码加入项目:只需要增加RunLoop目录中的AsyncSocket.h、AsyncSocket.m、AsyncUdpSocket.h和AsyncUdpSocket.m四个文件。

3.在项目增加CFNetwork框架

在Framework目录右健,选择Add-->Existing Files...    , 选择 CFNetwork.framework

二.TCP客户端

1. 在controller头文件定义AsyncSocket对象

  1. #import #import "AsyncSocket.h"
  2. @interface HelloiPhoneViewController : UIViewController {    UITextField    * textField;    AsyncSocket * asyncSocket;}@property (retain, nonatomic) IBOutlet UITextField *textField;- (IBAction) buttonPressed: (id)sender;- (IBAction) textFieldDoneEditing: (id)sender;    @end

复制代码

2.在需要联接地方使用connectToHost联接服务器

其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.

asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];

  1. NSError *err = nil;     if(![asyncSocket connectToHost:host on:port error:&err])     {         NSLog(@"Error: %@", err);     }

复制代码

3.增加Socket响应事件

因为initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法.

4.关于NSData对象

无论SOCKET收发都采用NSData对象.

NSData主要是带一个(id)data指向的数据空间和长度 length.

NSString 转换成NSData 对象

  1. NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];

复制代码

NSData 转换成NSString对象

NSData * data;

  1. NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

复制代码

4.发送数据

AsyncSocket  writeData    方法来发送数据,它有如下定义

  1. - (void)writeDataNSData *)data withTimeoutNSTimeInterval)timeout taglong)tag;

复制代码

以下是一个实例语句.

  1. NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];     [sock writeData:aData withTimeout:-1 tag:1];

复制代码

在onSocket重载函数,有如定义采用是专门用来处理SOCKET的发送数据的:

-(void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag

  1. {      NSLog(@"thread(%),onSocket:%p didWriteDataWithTag:%d",[[NSThread currentThread] name],     sock,tag);}

复制代码

5.接收Socket数据.

在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.

  1. -(void) onSocketAsyncSocket *)sock didReadDataNSData *)data withTaglong)tag

复制代码

在中间将其转换成NSString进行显示.

  1. NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];     NSLog(@"===%@",aStr);     [aStr release];

复制代码

下面是用开源的库Asyncsocket的例子:

  1. //
  2. //  SocketDemoViewController.h
  3. //  SocketDemo
  4. //
  5. //  Created by xiang xiva on 10-7-10.
  6. //  Copyright 2010 __MyCompanyName__. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AsyncSocket.h"
  10. #define SRV_CONNECTED 0
  11. #define SRV_CONNECT_SUC 1
  12. #define SRV_CONNECT_FAIL 2
  13. #define HOST_IP @"192.168.110.1"
  14. #define HOST_PORT 8080
  15. @interface SocketDemoViewController : UIViewController {
  16. UITextField *inputMsg;
  17. UILabel *outputMsg;
  18. AsyncSocket *client;
  19. }
  20. @property (nonatomic, retain) AsyncSocket *client;
  21. @property (nonatomic, retain) IBOutlet UITextField *inputMsg;
  22. @property (nonatomic, retain) IBOutlet UILabel *outputMsg;
  23. - (int) connectServer: (NSString *) hostIP port:(int) hostPort;
  24. - (void) showMessage:(NSString *) msg;
  25. - (IBAction) sendMsg;
  26. - (IBAction) reConnect;
  27. - (IBAction) textFieldDoneEditing:(id)sender;
  28. - (IBAction) backgroundTouch:(id)sender;
  29. @end
  30. //
  31. //  SocketDemoViewController.m
  32. //  SocketDemo
  33. //
  34. //  Created by xiang xiva on 10-7-10.
  35. //  Copyright 2010 __MyCompanyName__. All rights reserved.
  36. //
  37. #import "SocketDemoViewController.h"
  38. @implementation SocketDemoViewController
  39. @synthesize inputMsg, outputMsg;
  40. @synthesize client;
  41. /*
  42. // The designated initializer. Override to perform setup that is required before the view is loaded.
  43. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  44. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  45. if (self) {
  46. // Custom initialization
  47. }
  48. return self;
  49. }
  50. */
  51. /*
  52. // Implement loadView to create a view hierarchy programmatically, without using a nib.
  53. - (void)loadView {
  54. }
  55. */
  56. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
  57. - (void)viewDidLoad {
  58. //[super viewDidLoad];
  59. [self connectServer:HOST_IP port:HOST_PORT];
  60. //监听读取
  61. }
  62. // Override to allow orientations other than the default portrait orientation.
  63. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  64. return YES;
  65. }
  66. - (void)didReceiveMemoryWarning {
  67. // Releases the view if it doesn‘t have a superview.
  68. [super didReceiveMemoryWarning];
  69. // Release any cached data, images, etc that aren‘t in use.
  70. }
  71. - (void)viewDidUnload {
  72. self.client = nil;
  73. // Release any retained subviews of the main view.
  74. // e.g. self.myOutlet = nil;
  75. }
  76. - (int) connectServer: (NSString *) hostIP port:(int) hostPort{
  77. if (client == nil) {
  78. client = [[AsyncSocket alloc] initWithDelegate:self];
  79. NSError *err = nil;
  80. //192.168.110.128
  81. if (![client connectToHost:hostIP onPort:hostPort error:&err]) {
  82. NSLog(@"%@ %@", [err code], [err localizedDescription]);
  83. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Connection failed to host "
  84. stringByAppendingString:hostIP]
  85. message:[[[NSString alloc]initWithFormat:@"%@",[err code]] stringByAppendingString:[err localizedDescription]]
  86. delegate:self
  87. cancelButtonTitle:@"OK"
  88. otherButtonTitles:nil];
  89. [alert show];
  90. [alert release];
  91. //client = nil;
  92. return SRV_CONNECT_FAIL;
  93. } else {
  94. NSLog(@"Conectou!");
  95. return SRV_CONNECT_SUC;
  96. }
  97. }
  98. else {
  99. [client readDataWithTimeout:-1 tag:0];
  100. return SRV_CONNECTED;
  101. }
  102. }
  103. - (IBAction) reConnect{
  104. int stat = [self connectServer:HOST_IP port:HOST_PORT];
  105. switch (stat) {
  106. case SRV_CONNECT_SUC:
  107. [self showMessage:@"connect success"];
  108. break;
  109. case SRV_CONNECTED:
  110. [self showMessage:@"It‘s connected,don‘t agian"];
  111. break;
  112. default:
  113. break;
  114. }
  115. }
  116. - (IBAction) sendMsg{
  117. NSString *inputMsgStr = self.inputMsg.text;
  118. NSString * content = [inputMsgStr stringByAppendingString:@"\r\n"];
  119. NSLog(@"%a",content);
  120. NSData *data = [content dataUsingEncoding:NSISOLatin1StringEncoding];
  121. [client writeData:data withTimeout:-1 tag:0];
  122. //[data release];
  123. //[content release];
  124. //[inputMsgStr release];
  125. //继续监听读取
  126. //[client readDataWithTimeout:-1 tag:0];
  127. }
  128. #pragma mark -
  129. #pragma mark close Keyboard
  130. - (IBAction) textFieldDoneEditing:(id)sender{
  131. [sender resignFirstResponder];
  132. }
  133. - (IBAction) backgroundTouch:(id)sender{
  134. [inputMsg resignFirstResponder];
  135. }
  136. #pragma mark socket uitl
  137. - (void) showMessage:(NSString *) msg{
  138. UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"Alert!"
  139. message:msg
  140. delegate:nil
  141. cancelButtonTitle:@"OK"
  142. otherButtonTitles:nil];
  143. [alert show];
  144. [alert release];
  145. }
  146. #pragma mark socket delegate
  147. - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
  148. [client readDataWithTimeout:-1 tag:0];
  149. }
  150. - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
  151. {
  152. NSLog(@"Error");
  153. }
  154. - (void)onSocketDidDisconnect:(AsyncSocket *)sock
  155. {
  156. NSString *msg = @"Sorry this connect is failure";
  157. [self showMessage:msg];
  158. [msg release];
  159. client = nil;
  160. }
  161. - (void)onSocketDidSecure:(AsyncSocket *)sock{
  162. }
  163. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
  164. NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  165. NSLog(@"Hava received datas is :%@",aStr);
  166. self.outputMsg.text = aStr;
  167. [aStr release];
  168. [client readDataWithTimeout:-1 tag:0];
  169. }
  170. #pragma mark dealloc
  171. - (void)dealloc {
  172. [client release];
  173. [inputMsg release];
  174. [outputMsg release];
  175. [super dealloc];
  176. }
  177. @end

复制代码

时间: 2024-10-03 10:20:41

socket 概念,简单用法的相关文章

【android】Socket简单用法

原文地址:http://www.cnblogs.com/harrisonpc/archive/2011/03/31/2001565.html Socket通常也称做”套接字“,用于描述IP地址和端口,废话不多说,它就是网络通信过程中端点的抽象表示.值得一提的是,Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端.这是两个封装得非常好的类,使用起来很方便! 下面将首先创建一个SocketServer的类作为服务端如下,该服务端实现

OC学习篇之---协议的概念和用法

这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现 下面来看代码: WithProtocol.h [objc] vi

深入理解正则表达式环视的概念与用法

在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的概念与用法 一.环视的概念 (一)环视概念与匹配过程示例 示例一:简单环视匹配过程 (二)什么是消耗正则的匹配字符? 示例二:一次匹配消耗匹配字符匹配过程 示例三:多次匹配消耗匹配字符匹配过程 二.环视的类型 (一)肯定和否定 (二)顺序和逆序 · 两种类型名称组合 · 四种组合的用法 四种组合正则与环视的摆

NSCharacterSet 简单用法

NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMutableCharacterSet lowercaseLetterCharacterSet]; //字母 NSCharacterSet *decimalDigit = [NSCharacterSet decimalDigitCharacterSet];   //十进制数字 [base formUni

UpdatePanel的简单用法(转)

微软AJAX虽然是过时的玩意,但是得维护公司之前的老项目,转载看看. 局部更新是ajax技术的最基本,也是最重要的用法,今天大概把asp.net ajax中的局部更新控件 updatepanel的用法记录下,大家可以共同探讨 UpdatePanel控制页面的局部更新,这个更新功能依赖于scriptManger控件的EnablePartialRendering属性,如果这个属性设置为false局部更新会失去作用(scriptManger控件的EnablePartialRendering属性的默认值

GIT基本概念和用法总结【转】

在日常使用GIT过程中,经常会出错,比如无意间丢失了未提交的数据,回退版本时丢失了工作目录,等等.经过思考发现,所有这些错误都是因为对GIT中一些基本的概念模糊而导致,因为对一些基本概念不清晰,导致对GIT每一条命令将会产生的结果不符合预期.下面我就梳理以下我经常碰到的问题相关的基本概念. 1. Working Directory(工作目录) Git的工作目录是保存当前正在工作的文件所在的目录,和working tree是相同的意思.在这个目录中的文件可能会在切换branch时被GIT删除或者替

(转载)OC学习篇之---协议的概念和用法

在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现. 下面来看代码: Wit

OC中协议的概念以及用法

OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的.协议就是定义了一组方法,然后让其他类去实现 下面来看代码:WithProtocol.h[objc]  view plaincopy 

KVO的简单用法

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. //KVO是基于KVC的,观察者可以观察一个对象的某个属性(key),但这个属性的值(value)发生变化的时候,会触发一个事件 //KVO中涉及到以下几个概念 //被观察者 通常是  Model //观察者    通常是 Controller //key   被观察者的某个属性 //value