头一次写和服务器相关的东西,有很多要学习,Node.js是用于搭建服务器端的技术,通过javascript编写,iOS客户端利用AsyncSocket框架编写,实现客户端与服务器端建立长连接,并互相通信。服务器端采用本地地址5000端口。
iOS客户端:
AsyncSocket是个封装socket操作的第三方框架,头文件里要添加这个属性:
1
2
3
4
5
6
7
|
@
interface
MainViewController
:
UIViewController
{
AsyncSocket *
asyncSocket
;
}
|
在连接的时候:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-
(
IBAction
)
connectBtn
:
(
id
)
sender
{
asyncSocket
=
[
[
AsyncSocket
alloc
]
initWithDelegate
:
self
]
;
NSError *
err
=
nil
;
if
(
!
[
asyncSocket
connectToHost
:
@
"127.0.0.1"
onPort
:
5000
error
:
&
err
]
)
{
NSLog
(
@
"err %@"
,
err
)
;
}
;
[
asyncSocket
readDataWithTimeout
:
-
1
tag
:
0
]
;
}
|
连接以后就要执行readDataWithTimeout方法,这样就可以收到服务器端发送的数据,这里需要注意的是每次收到信息的时候要再次执行readDataWithTimeout方法,用于持续接受数据
这个是接收数据的代理方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//读数据成功代理
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didReadData
:
(
NSData *
)
data
withTag
:
(
long
)
tag
{
NSLog
(
@
"did read data"
)
;
NSString*
message
=
[
[
NSString
alloc
]
initWithData
:
data
encoding
:
NSUTF8StringEncoding
]
;
NSLog
(
@
"message is: \n%@"
,
message
)
;
//接收数据后还要执行接收方法
[
asyncSocket
readDataWithTimeout
:
-
1
tag
:
0
]
;
}
|
发送数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-
(
void
)
sendJson
:
(
NSDictionary *
)
dictionary
{
SBJsonWriter *
jsonWriter
=
[
[
SBJsonWriter
alloc
]
init
]
;
NSString *
jsonString
=
[
jsonWriter
stringWithObject
:
dictionary
]
;
NSData *
sendData
=
[
jsonString
dataUsingEncoding
:
NSUTF8StringEncoding
]
;
[
asyncSocket
writeData
:
sendData
withTimeout
:
-
1
tag
:
0
]
;
}
|
这里利用SBJson发送了一个Json格式的数据,这样连接,接收,发送功能就完成了,so easy,还有一些其他用到的代理方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#pragma ASY delegate
//连接成功代理
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didConnectToHost
:
(
NSString *
)
host
port
:
(
UInt16
)
port
{
NSLog
(
@
"did connect to host"
)
;
}
//写数据成功代理
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didWriteDataWithTag
:
(
long
)
tag
{
NSLog
(
@
"did write data"
)
;
}
//断开连接代理
-
(
void
)
onSocketDidDisconnect
:
(
AsyncSocket *
)
sock
{
//断开连接了
NSLog
(
@
"onSocketDidDisconnect:%p"
,
sock
)
;
}
|
服务器端:
第一次写服务器端的东西,当自己和自己联机成功的时候着实觉得有意思了一把。
运行的方法就是node xxxx.js
实现的顺序是先创建服务器,然后监听收到的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//net用于socket
net
=
require
(
"net"
)
;
// Start a TCP Server
net
.
createServer
(
function
(
socket
)
{
// Identify this client
socket
.
name
=
socket
.
remoteAddress
+
":"
+
socket
.
remotePort
// Send a nice welcome message and announce
socket
.
write
(
"Welcome "
+
socket
.
name
+
"\n"
)
;
// Handle incoming messages from clients.
socket
.
on
(
'data'
,
function
(
data
)
{
var
obj
=
JSON
.
parse
(
data
)
;
console
.
log
(
data
)
;
console
.
log
(
obj
)
;
}
)
;
// Remove the client from the list when it leaves
socket
.
on
(
'end'
,
function
(
)
{
console
.
log
(
'disconnect'
)
;
}
)
;
}
)
.
listen
(
5000
)
;
|
这样就监听了本地5000端口,iOS客户端发送信息的时候通过监听“data”就可以获取发送的信息
除了TCP通信,也可以用HTTP的各种请求,客户端利用ASIHTTPRequest或者什么实现方式(以前的博客写过),服务器端代码如下:
1
2
3
4
5
6
7
8
9
10
|
http
=
require
(
"http"
)
;
callback
=
function
(
request
,
response
)
{
response
.
writeHead
(
200
)
;
content
=
{
}
;
console
.
log
(
content
)
;
response
.
write
(
content
)
;
response
.
end
(
)
;
}
http
.
createServer
(
callback
)
.
listen
(
8080
)
console
.
log
(
"running on 8080"
)
|