Socket(套接字)

* Socket就是为网络服务提供的一种机制

* 通信的两端都是Socket
* 网络通信其实就是Socket间的通信
* 数据在两个Socket间通过IO传输
我们来看看下面这张图:
如上图所示:假设客户端要向服务端发送消息,并且服务器会回应客户端。那么步骤是这样的:
1. 必须先将带有IP+端口等数据发送给服务器,在与服务器完成三次握手后建立连接。
2.如果建立连接成功,会出现2条传输通道,两端分别有个输出流和一个输入流。一旦连接建立成功,两端便会实时地监控各自的输入流。
3.因为是长连接,所以连接一直存在,直至任何一方主动断开连接!
拓展:
关于长连接与短连接
*一般选择长连接或者短连接由我们的需求决定,上面举的是即时通信的例子,所以选择长连接。因为如果中途一方断开,连接便失效,数据也将没有运输通道。(暂且这样理解,后面会详细讲解)
*而平时我们常常用到得HTTP就是短连接,因为客户端只需向服务器请求一次,服务器也只需根据客户端请求的数据进行相应地回应,便不再实时交流,所以服务器在成功返回数据后便会主动断开与客户端的连接。客户端如果需要进行请求,便需要建立新的连接。
接下来简单地实现一下聊天功能
在DEMO里面已经放了个预先准备好的数据库,可以直接使用。使用方法:打开终端 —— 打开文件路径(cd ../../../)—— 打开文件(python chat.py)出现chat server success!字样表示启动成功。

然后新建项目,连接数据库,这里需要用到C语言的代码,然后再将C语言转换成OC对象

//1.建立一个连接

NSString*host = @"127.0.0.1";

;

CFReadStreamRefreadStream;    
//输入流

CFWriteStreamRefwriteStream;   
//输出流

CFStreamCreatePairWithSocketToHost(NULL,(__bridgeCFStringRef)host,port, &readStream, &writeStream);

// 将C语言输入输出流转换成OC对象

_inputStream= (__bridgeNSInputStream*)(readStream);

_outputStream= (__bridgeNSOutputStream*)(writeStream);

//
设置代理

_inputStream.delegate=self;

_outputStream.delegate=self;

//把输入输出流添加到主运行循环

//不添加的话代理可能不被调用

[_inputStreamscheduleInRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];

[_outputStreamscheduleInRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];

//
打开输入输出流

[_inputStream
open];

[_outputStream
open];

实现NSStream代理方法

- (void)stream:(NSStream*)aStream handleEvent:(NSStreamEvent)eventCode

{

NSLog(@"%@",aStream);

//   NSStreamEventOpenCompleted = 1UL << 0,  
流打开成功

//   NSStreamEventHasBytesAvailable = 1UL << 1,  
有字节可读

//   NSStreamEventHasSpaceAvailable = 1UL << 2,  
可以发送字节

//   NSStreamEventErrorOccurred = 1UL << 3,  
连接出错

//   NSStreamEventEndEncountered = 1UL << 4  
连接结束

switch(eventCode) {

caseNSStreamEventOpenCompleted:

NSLog(@"流打开成功");

break;

caseNSStreamEventHasBytesAvailable:

NSLog(@"有字节可读");

[selfreadData];

break;

caseNSStreamEventHasSpaceAvailable:

NSLog(@"可以发送字节");

break;

caseNSStreamEventErrorOccurred:

NSLog(@"连接出错");

break;

caseNSStreamEventEndEncountered:

NSLog(@"连接结束");

//关闭输入输出流

[_inputStreamclose];

[_outputStreamclose];

//从主运行循环移除

[_inputStreamremoveFromRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];

[_outputStreamremoveFromRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];

break;

default:

break;

}

}

既然是聊天,首先就需要登录,还需要一个UITextField 输入框,这边就不验证密码,直接用用户名登录

- (void)login

{

// 2.聊天

// 2.1登录

//
发送用户名

//
登录指令

NSString*loginStr =
@"iam:zhangsan";

//
把Str转成NSData

NSData*data= [loginStr dataUsingEncoding:NSUTF8StringEncoding];

[_outputStreamwrite:data.bytesmaxLength:data.length];

}

登陆成功后读取服务器返回的数据

#pragma mark 读了服务器返回的数据

-(void)readData{

//建立一个缓冲区可以放1024个字节

];

// 返回实际装的字节数

NSIntegerlen = [_inputStreamread:bufmaxLength:sizeof(buf)];

//把字节数组转化成字符串

NSData*data = [NSDatadataWithBytes:buflength:len];

// 从服务器接收到的数据

NSString*recStr=  [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

NSLog(@"gdgdfgdf%@",recStr);

[selfreloadDataWithText:recStr];

}

实现输入框代理

-(BOOL)textFieldShouldReturn:(UITextField*)textField{

NSString*text = textField.text;

NSLog(@"%@",text);

//
聊天信息

NSString*msgStr = [NSStringstringWithFormat:@"msg:%@",text];

//把Str转成NSData

NSData*data= [msgStr dataUsingEncoding:NSUTF8StringEncoding];

//
刷新表格

[selfreloadDataWithText:msgStr];

//
发送数据

[_outputStreamwrite:data.bytesmaxLength:data.length];

//
发送完数据,清空textField

textField.text=
nil;

return
YES;

}

因为刷新等部分代码很多地方会用到,所以抽出来放到一个方法内方便调用

-(void)reloadDataWithText:(NSString*)text{

[self.chatMsgsaddObject:text];

[self.tableViewreloadData];

// 数据多,应该往上滚动

NSIndexPath*lastPath = [NSIndexPathindexPathForRow:self.chatMsgs.count-
];

[self.tableViewscrollToRowAtIndexPath:lastPathatScrollPosition:UITableViewScrollPositionBottomanimated:YES];

}

最后就是完成Tableview的数据集

#pragma mark 表格的数据源

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{

return
self.chatMsgs.count;

}

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

staticNSString*ID =
@"Cell";

UITableViewCell*cell= [tableView dequeueReusableCellWithIdentifier:ID];

cell.textLabel.text=
self.chatMsgs[indexPath.row];

return cell;

}

运行效果如下:

Socket的概念和简单使用就先到这里了,需要DEMO的可以到下面链接下载:
链接: http://pan.baidu.com/s/1mgITR7M 密码: q916
如果有错误或者有什么问题可以联系我,转载请注明出处,谢谢!

【网络编程】Socket概念及简单聊天…的更多相关文章

  1. [转]C#网络编程(基本概念和操作) - Part.1

    本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part1.aspx 引言 C#网络编程系列文章计划简单地讲述 ...

  2. C#网络编程(基本概念和操作) - Part.1

    引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助.如果想要更加深入的内容,可以参考相关书籍 ...

  3. python网络编程——socket基础篇

    python的网络编程比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西. 1 TCP/IP 要想理解socket,首先得熟悉一下TCP/IP协议 ...

  4. 铁乐学Python_Day33_网络编程Socket模块1

    铁乐学Python_Day33_网络编程Socket模块1 部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 理解socket Socket是应用层与TCP/IP协 ...

  5. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  6. 【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解

    ZooKeeper的介绍以及集群环境搭建.网络编程和RPC的简单了解 ZooKeeper介绍 概述 ZooKeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题.例如 ...

  7. 网络编程socket基本API详解(转)

    网络编程socket基本API详解   socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...

  8. linux网络编程-socket(37)

    在编程的时候需要加上对应pthread开头的头文件,gcc编译的时候需要加了-lpthread选项 第三个参数是线程的入口参数,函数的参数是void*,返回值是void*,第四个参数传递给线程函数的参 ...

  9. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...

随机推荐

  1. Git:错误:error:src refspec master does not match any

    新建立了一个远程仓库,想着把项目放上去.于是在项目目录上: git init 然后就添加远程库 git remote add origin xxxx.git 然后就想push: git push -u ...

  2. Halcon与MFC交互编程

    Halcon是商业化的机器视觉软件.网上下了halcon10的破解版,安装后编写了个图像显示的MFC小程序. 编译器用的是VS2008. 1 配置halcon环境 新建为MFC后,在VC++目录中配置 ...

  3. 一行代码,让你的应用中UIScrollView的滑动与侧滑返回并存

    侧滑返回是iOS系统的一个很贴心的功能,特别是在大屏手机上,单手操作的时候去按左上角的返回键特别不方便.当我在使用一个APP的时候,如果控制器不能侧滑返回,我会觉得这个APP十分不友好...这款产品在 ...

  4. 大话PHP缓存头

    304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地 ...

  5. Elasticsearch 教程--入门

    1.1 初识 Elasticsearch 是一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,可以说 Lucene 是当今最先进,最高效的全功能开源搜索引擎框架. 但是 L ...

  6. linux专题一之文件管理(目录结构、创建、查看、删除、移动)

    在linux系统中一切都是文件./ 在linux中为根目录,是一切文件的根目录.本文将通过linux系统的目录结构和与linux文件操作有关的相关命令(touch.mkdir.cp.mv.mv.les ...

  7. 【原创】Kakfa message包源代码分析

    笔者最近在研究Kafka的message包代码,有了一些心得,特此记录一下.其实研究的目的从来都不是只是看源代码,更多地是想借这个机会思考几个问题:为什么是这么实现的?你自己实现方式是什么?比起人家的 ...

  8. [Asp.net]通过uploadify将文件上传到B服务器的共享文件夹中

    写在前面 客户有这样的一个需求,针对项目中文档共享的模块,客户提出如果用户上传特别的大,或者时间久了硬盘空间就会吃满,能不能将这些文件上传到其他的服务器?然后就稍微研究了下这方面的东西,上传到网络中的 ...

  9. C语言写的流氓关机程序及破解

    记得大二刚开始接触电脑的那个时候,偶尔会弹出一个强制关机的窗口,当时没有办法,如下: 现在看来只是一个小程序而已,用C语言编写的: #include<windows.h> int main ...

  10. 【SQL】CLR聚合函数什么鬼

    之前写过一个合并字符串的CLR聚合函数,基本是照抄MS的示例,外加了一些处理,已经投入使用很长时间,没什么问题也就没怎么研究,近日想改造一下,遇到一些问题,遂捣鼓一番,有些心得,记录如下. 一.杂项 ...