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


TCP移动端跟服务器数据交互的更多相关文章
- UDP协议实现客户服务器数据交互
UDP协议实现客户服务器数据交互 按照往常一样将今天自己写的题目答案写在了博客上习题:客户端循环发送消息给服务端,服务端循环接收,并打印出来,直到收到Bye就退出程序. package network ...
- java 基于tcp客户端服务端发送接收数据
客户端: package demo03; import java.io.IOException; import java.io.InputStream; import java.io.OutputSt ...
- Appcn 移动开发 前台与服务器数据交互
第一次写.嘿嘿. 言归正传,这几天开始学习移动开发,使用的是Appcan平台.Appcan平台采用HTML5+CSS3做开发 实现跨平台,正好可以满足我们的业务需求. Appacn和数据库进行交互的方 ...
- unity用json和服务器数据交互
第一种类型:服务器json数据是个对象 /// <summary> /// 获取用户信息初始化信息 /// </summary> void InitUserMessage() ...
- 利用缓存实现APP端与服务器接口交互的Session控制
与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...
- mui.ajax()和asp.net sql服务器数据交互【2】json数组和封装
今天没有做循环创建显示:可以参考张鑫旭的文章:<基于HTML模板和JSON数据的JavaScript交互> 1.ashx页面代码 //下面的封装一般框架底层都是写好的:连接 数据库和获取D ...
- mui.ajax()和asp.net sql服务器数据交互【1】
简单的ajax和asp.net的交互,例如遍历数据,前端显示复杂内容没有添加代码,可自行研究!非常适合懂那么一点点的我们! 实现步骤: 1.APP前端HTML: <div class=" ...
- android get或post及HttpClient与服务器数据交互
1.Service package mydemo.mycom.demo2.service; import org.apache.http.HttpResponse; import org.apache ...
- mui.ajax()和asp.net sql服务器数据交互【3】最终版
1.前端页面 <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-ic ...
随机推荐
- mysql_4(解决中文乱码问题)
mysql> create database if not exists xdb default character set utf8;Query OK, 1 row affected (0.0 ...
- JUC回顾之-Semaphore底层实现和原理
1.控制并发线程数的Semaphore Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,保证合理的使用公共资源. 线程可以通过acquire()方法来获取信号量的 ...
- go编写简单的web服务器
package main import ( "fmt" "log" "net/http" "strings" ) //h ...
- poj 1087 最大流
没啥好说的,慢慢建图 Sample Input 4 A B C D 5 laptop B phone C pager B clock B comb X 3 B X X A X D Sample Out ...
- 实现Activity刷新(转)
目前刷新Acitivity,只想到几种方法.仅供参考,如果您有更好的方法,请赐教. 程序界面: 点击refresh view可以刷新界面,点击write content可以在EditText中自动写入 ...
- loj 1156(二分+最大流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26870 思路:由于溢出问题,wa了半天,还以为构图错了呢,查了半天 ...
- hdu 4751(dfs染色)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751 思路:构建新图,对于那些两点连双向边的,忽略,然后其余的都连双向边,于是在新图中,连边的点是能不 ...
- 【JUnit 报错】 method initializationerror not found:JUnit4单元测试报错问题
今天是用JUnit测试一段代码,报错method initializationerror not found::出现如下问题: 双击这个就显示出现如下的错误: 查询网上,说是junit版本的问题: 那 ...
- [MySQL]导入导出
[MySQL]导入导出 一 导入文本数据 1)mysql->load data infile 数据文件c:/mytable.txt 如下:(每一行为一条记录,记录的字段间用tab隔开,最后一个字 ...
- java 输入输出流1 FileInputStrem&&FileOutStream
通过文件输入流读取问价 package unit6; import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...