同一台笔记本下的客户端和服务端

TCPClient 客户端:

//  RootViewController.h
#import <UIKit/UIKit.h>
#import "AsyncSocket.h"  //封装了基于tcp协议的socket编程
//tcp协议是位于网络传输层的协议,规定客户端与服务端之间、或者是客户端与客户端之间数据通信的方式
//每个客户端或者服务端通过ip地址+端口来标识
/*客户端与服务端基于tcp协议进行数据通信
 *1、客户端需要通过ip+端口连接指定的服务器
 *2、连接成功后,客户端可以向服务端发送数据
 *3、服务端能够接收数据,并进行后续处理
 *4、如果客户端与服务端断开连接,服务端能够知晓
 5、AsyncSocket的使用方法->文件夹直接拖拽进工程,将两个.m文件设置成-fno-objc-arc
 */
@interface RootViewController : UIViewController
<AsyncSocketDelegate>

//  RootViewController.m
#import "RootViewController.h"

@interface RootViewController ()
{
    //客户端的socket,用于与服务器进行数据通信
    AsyncSocket *_clientSocket;
}
@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UIButton *connectBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [connectBtn setTitle:@"connect" forState:UIControlStateNormal];
    [connectBtn setFrame:CGRectMake(10,30,300,40)];
    [connectBtn addTarget:self action:@selector(connectBtnClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:connectBtn];
    
    UIButton *sendBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [sendBtn setTitle:@"send" forState:UIControlStateNormal];
    [sendBtn setFrame:CGRectMake(10,80,300,40)];
    [sendBtn addTarget:self action:@selector(sendData) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:sendBtn];
    
    // Do any additional setup after loading the view.
}
//向已经连接成功的服务器发送数据
- (void)sendData{
    NSString *sendMsg = @"hello server!";
    NSData *data = [sendMsg dataUsingEncoding:NSUTF8StringEncoding];
    //writeData 要发送的数据, -1不限时发送,tag 用于标识当前操作
    [_clientSocket writeData:data withTimeout:-1 tag:0];
}

- (void)connectBtnClicked{
    //如果对象不存在,则创建
    if (!_clientSocket) {
        //初始化并设置代理
        _clientSocket = [[AsyncSocket alloc] initWithDelegate:self];
    }
    //isConnected 是否与服务器进行了联系
    if ([_clientSocket isConnected]) {
        [_clientSocket disconnect];//如果连接了,则断开连接
    }
    //通过ip+端口,连接到指定的服务器
    //[_clientSocket connectToHost:<#(NSString *)#> onPort:<#(UInt16)#> error:<#(NSError *__autoreleasing *)#>]
    //ip地址为本机的,因为服务器也是在同一台电脑里建立

//端口 任意四位数字
    //connectToHost 和onPort 为服务器的ip地址和端口
    //-1 不限时连接
    [_clientSocket connectToHost:@"自己的ip地址" onPort:5678 withTimeout:-1 error:nil];
}

#pragma mark - asyncsocket delegate
//如果与服务器连接成功,则调用此方法
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
    NSLog(@"did connected!");
}
//数据发送完成,调用此方法
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{
    NSLog(@"send data!");
}

TcpServer 服务端:  需要导入AsyncSocket 第三方

#import "AppDelegate.h"
@implementation AppDelegate{
    //服务端的socket对象,负责监听是否有客户端连入
    AsyncSocket *_serverSocket;
    //用于存储socket对象
    NSMutableArray *_socketArray;
   
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    _socketArray = [[NSMutableArray alloc] init];
    //执行createServer方法
    //让self 0.2秒之后执行 createServer
    [self performSelector:@selector(createServer) withObject:nil afterDelay:0.2];
    
}
- (void)createServer{
    //初始化
    _serverSocket = [[AsyncSocket alloc] initWithDelegate:self];
    //监听自己的ip和端口是否有客户端连入
    //[_serverSocket acceptOnInterface:@"自己的ip地址" port:5678 error:nil];
    //ip地址可以缺省
    [_serverSocket acceptOnPort:5678 error:nil];
}
#pragma mark - async Socket delegate
//一旦有客户端连入,会调用此方法
//newSocket 服务端创建的socket对象,用于与客户端进行后续的数据交互
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
    NSLog(@"accept socket!");
    //需要将newSocket对象存储起来,否则,该对象会被自动释放
    [_socketArray addObject:newSocket];
    //newSocket对象用于监听已经接入的客户端是否会发来消息
    //不限时监听是否有数据发送过来
   [newSocket readDataWithTimeout:-1 tag:100];
}
//接收到客户端的数据时,会触发此方法
//data为客户端的数据
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"receive data:%@",msg);
    //一旦接收到了数据,上一次监听失效,需要继续监听
    [sock readDataWithTimeout:-1 tag:101];
}
//当客户端与服务端即将断开连接时,触发此方法
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err{
    NSLog(@"will disconnect!");
}
//已经断开连接
- (void)onSocketDidDisconnect:(AsyncSocket *)sock{
    NSLog(@"did disconnect!");
}

TCP移动端跟服务器数据交互的更多相关文章

  1. UDP协议实现客户服务器数据交互

    UDP协议实现客户服务器数据交互 按照往常一样将今天自己写的题目答案写在了博客上习题:客户端循环发送消息给服务端,服务端循环接收,并打印出来,直到收到Bye就退出程序. package network ...

  2. java 基于tcp客户端服务端发送接收数据

    客户端: package demo03; import java.io.IOException; import java.io.InputStream; import java.io.OutputSt ...

  3. Appcn 移动开发 前台与服务器数据交互

    第一次写.嘿嘿. 言归正传,这几天开始学习移动开发,使用的是Appcan平台.Appcan平台采用HTML5+CSS3做开发 实现跨平台,正好可以满足我们的业务需求. Appacn和数据库进行交互的方 ...

  4. unity用json和服务器数据交互

    第一种类型:服务器json数据是个对象 /// <summary> /// 获取用户信息初始化信息 /// </summary> void InitUserMessage() ...

  5. 利用缓存实现APP端与服务器接口交互的Session控制

    与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...

  6. mui.ajax()和asp.net sql服务器数据交互【2】json数组和封装

    今天没有做循环创建显示:可以参考张鑫旭的文章:<基于HTML模板和JSON数据的JavaScript交互> 1.ashx页面代码 //下面的封装一般框架底层都是写好的:连接 数据库和获取D ...

  7. mui.ajax()和asp.net sql服务器数据交互【1】

    简单的ajax和asp.net的交互,例如遍历数据,前端显示复杂内容没有添加代码,可自行研究!非常适合懂那么一点点的我们! 实现步骤: 1.APP前端HTML: <div class=" ...

  8. android get或post及HttpClient与服务器数据交互

    1.Service package mydemo.mycom.demo2.service; import org.apache.http.HttpResponse; import org.apache ...

  9. mui.ajax()和asp.net sql服务器数据交互【3】最终版

    1.前端页面 <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-ic ...

随机推荐

  1. [转]ThreadPoolExecutor线程池的分析和使用

    1. 引言 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第 ...

  2. GDB调试笔记

    参考资料:GDB调试精粹及使用实例 # 调试实例 #include <iostream> #include <cstring> using namespace std; ][] ...

  3. Java Hour 22 I/O

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. I/O InputStream, OutStream, Reader, Wri ...

  4. Ninja - chromium核心构建工具

    转自:http://guiquanz.me/2014/07/28/a_intro_to_Ninja/ Ninja - chromium核心构建工具Jul 28, 2014 [在线编辑] 缘由 经过上次 ...

  5. 如何正确读取war包中配置文件的路径

    转自:http://free-chenwei.iteye.com/blog/1507480 下面展示一段代码String path = getClass().getResource("/&q ...

  6. Oracle创建表空间和表

    创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablesp ...

  7. 2016.6.17 kali Linux 隧道工具

    隧道工具的基本概念: 1.在计算机网络中,隧道工具是指使用一种网络协议去封装另一种网络协议的技术. 2.通常用来数据伪装或者穿越防火墙,在入侵目标系统后,可用来提升权限和权限维持. Kali中的隧道工 ...

  8. partial(C# 参考)

    分部类型定义允许将类.结构或接口的定义拆分到多个文件中. 在 File1.cs 中:     namespace PC { partial class A { } } 在 File2.cs 中:   ...

  9. HDU 4405 期望DP

    期望DP算是第一题吧...虽然巨水但把思路理理清楚总是好的.. 题意:在一个1×n的格子上掷色子,从0点出发,掷了多少前进几步,同时有些格点直接相连,即若a,b相连,当落到a点时直接飞向b点.求走到n ...

  10. JAVA操作COOKIE

    JAVA操作COOKIE 1.设置Cookie Cookie cookie = new Cookie("key", "value"); cookie.setMa ...