zoukankan      html  css  js  c++  java
  • TCP移动端跟服务器数据交互

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

    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!");
    }

  • 相关阅读:
    手动卸载Office2010
    css盒子模型和定位
    [转]Mysql 存储过程和函数区别
    (转载)今天面试两个人的感受
    配置apache和php mysql的一些问题
    css position[转
    drools7 (四、FactHandle 介绍)
    drools7 (三、kmodule 介绍)
    drools7 (二、agenda-group 的使用)
    drools7 (一、最简单的例子)
  • 原文地址:https://www.cnblogs.com/sayimba/p/5662065.html
Copyright © 2011-2022 走看看