转载http://www.iashes.com/2015-02-504.html
主要流程就是,服务器先创建一个端口,通过自己服务器的IP地址,然后运行服务器端文件。完了客户端连接socket,发送和读取数据。socket是通过数据流传输的,和http的差别就是不需要多次请求。
服务器端创建好文件之后,在终端里边,通过这个命令执行,不要在浏览器里边打开:
1
2
3
|
php
-
q
.
.
/
.
.
/
Applications
/
XAMPP
/
htdocs
/
socket
.
php
或者
php
.
.
/
.
.
/
Applications
/
XAMPP
/
htdocs
/
socket
.
php
|
重要的一点就是服务器创建的IP和端口要和客户端的一致。
运行完服务器端之后,然后在ios客户端输入要发送的内容,服务器接收了显示在终端:
然后我点击获取数据,会得到服务器传过来的数据:
这个服务器是自己本地安装在PC的服务器,起始两个ios端也能通讯,一个充当服务器,一个充当客户端,通过局域网通讯。
服务器端准备的事儿:
开启socket,在PHP.INI里边:
extension=php_sockets.dll 取消前边冒号
default_socket_timeout=60这个是超时时间,60秒,一般不用动,在主要文件里边设置就行。
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
|
<?php
header
(
"Connection: Keep-Alive"
)
;
header
(
"Proxy-Connection: Keep-Alive"
)
;
set_time_limit
(
0
)
;
//
$ip
=
'127.0.0.1'
;
//配置服务端IP地址
$port
=
9999
;
//服务端端口
if
(
(
$sock
=
socket_create
(
AF_INET
,
SOCK_STREAM
,
SOL_TCP
)
)
<
0
)
{
//建立一个套接字
echo
"socket_create() failed:"
.
socket_strerror
(
$sock
)
.
"\n"
;
}
if
(
(
$ret
=
socket_bind
(
$sock
,
$ip
,
$port
)
)
<
0
)
{
//为套接字设置IP和端口
echo
"socket_bind() failed:"
.
socket_strerror
(
$ret
)
.
"\n"
;
}
if
(
(
$ret
=
socket_listen
(
$sock
,
4
)
)
<
0
)
{
//监听端口
echo
"socket_listen() failed:"
.
socket_strerror
(
$ret
)
.
"\n"
;
}
while
(
true
)
{
if
(
!
(
$msgsock
=
socket_accept
(
$sock
)
)
)
{
exit
;
}
//获取接收到的资源变成字符串
$buf
=
socket_read
(
$msgsock
,
1024
)
;
if
(
$buf
)
{
$gettalk
=
"收到的信息:$buf"
;
echo
$gettalk
;
}
usleep
(
1
)
;
//write发送资源给客户端
$talkback
=
'返回给你:'
.
$buf
;
socket_write
(
$msgsock
,
$talkback
,
strlen
(
$talkback
)
)
;
socket_close
(
$msgsock
)
;
}
socket_close
(
$sock
)
;
?>
|
IOS端:
添加CFNetwork.framework系统库,然后将AsyncSocket导入:
AsyncSocket下载地址:
http://pan.baidu.com/s/1sjI5cxn
如果是MRC,执行-fobjc-arc
然后.h文件中:
1
2
3
4
5
6
7
8
9
10
11
|
#import <UIKit/UIKit.h>
#import "AsyncSocket.h"
@
interface
ViewController
:
UIViewController
<
AsyncSocketDelegate
>
@
property
(
nonatomic
,
retain
)
AsyncSocket *
asyncSocket
;
@
property
(
nonatomic
,
retain
)
UITextField *
contentField
;
@
end
|
.m文件中:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
//
// ViewController.m
// SocketDemo
//
// Created by ashes on 15-2-9.
// Copyright (c) 2015年 ashes. All rights reserved.
//
//php -q ../../Applications/XAMPP/htdocs/socket.php
//php ../../Applications/XAMPP/htdocs/socket.php
#import "ViewController.h"
@
interface
ViewController
(
)
@
end
@
implementation
ViewController
-
(
void
)
viewDidLoad
{
[
super
viewDidLoad
]
;
//view of screen
_contentField
=
[
[
UITextField
alloc
]
initWithFrame
:
CGRectMake
(
10
,
200
,
300
,
30
)
]
;
_contentField
.
borderStyle
=
UITextBorderStyleBezel
;
_contentField
.
text
=
@
"我要发送的内容"
;
[
self
.
view
addSubview
:
_contentField
]
;
UIButton *
btn1
=
[
UIButton
buttonWithType
:
UIButtonTypeRoundedRect
]
;
btn1
.
frame
=
CGRectMake
(
10
,
150
,
140
,
30
)
;
btn1
.
backgroundColor
=
[
UIColor
cyanColor
]
;
[
btn1
setTitle
:
@
"接受数据"
forState
:
UIControlStateNormal
]
;
[
btn1
addTarget
:
self
action
:
@
selector
(
getData
:
)
forControlEvents
:
UIControlEventTouchUpInside
]
;
[
self
.
view
addSubview
:
btn1
]
;
[
btn1
release
]
;
UIButton *
btn2
=
[
UIButton
buttonWithType
:
UIButtonTypeRoundedRect
]
;
btn2
.
frame
=
CGRectMake
(
170
,
150
,
140
,
30
)
;
btn2
.
backgroundColor
=
[
UIColor
cyanColor
]
;
[
btn2
setTitle
:
@
"发送数据"
forState
:
UIControlStateNormal
]
;
[
btn2
addTarget
:
self
action
:
@
selector
(
sendData
:
)
forControlEvents
:
UIControlEventTouchUpInside
]
;
[
self
.
view
addSubview
:
btn2
]
;
[
btn2
release
]
;
_asyncSocket
=
[
[
AsyncSocket
alloc
]
initWithDelegate
:
self
]
;
NSError *
error
=
nil
;
[
_asyncSocket
connectToHost
:
@
"127.0.0.1"
onPort
:
9999
error
:
&
error
]
;
nil
!=
error
?
NSLog
(
@
"连接错误:%@"
,
error
)
:
NSLog
(
@
"连接正确"
)
;
}
-
(
void
)
viewDidDisappear
:
(
BOOL
)
animated
{
[
super
viewDidDisappear
:
animated
]
;
[
_asyncSocket
disconnect
]
;
//断开连接
}
#pragma mark - button enent method
-
(
void
)
getData
:
(
id
)
sender
{
if
(
[
_asyncSocket
isConnected
]
)
{
[
_asyncSocket
readDataWithTimeout
:
-
1
tag
:
0
]
;
}
}
-
(
void
)
sendData
:
(
id
)
sender
{
//发送数据
if
(
_asyncSocket
.
isConnected
)
{
NSLog
(
@
"send"
)
;
NSData *
data
=
[
_contentField
.
text
dataUsingEncoding
:
NSUTF8StringEncoding
]
;
//withTimeout - 超时时间(-1代表不限时)
//tag 是用于协议方法中确定某一条信息发送成功用的,跟服务器没关系
[
_asyncSocket
writeData
:
data
withTimeout
:
-
1
tag
:
10
]
;
}
}
#pragma mark - socket delegate method
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
willDisconnectWithError
:
(
NSError *
)
err
{
//出现连接/读/写 错误时候调用的方法,运行这个方法之后会自动管理socket
NSLog
(
@
"出现错误调用的方法: %@ "
,
err
)
;
}
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didConnectToHost
:
(
NSString *
)
host
port
:
(
UInt16
)
port
{
//socket连接成功之后调用的方法,这里边可以发送或者读取一写东西
NSLog
(
@
"- - - 已经连接"
)
;
/*
[sock readDataWithTimeout:-1 tag:0];
if (_secondTextField.text.length > 0) {
[sock writeData:[_secondTextField.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];
}else{
[sock writeData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"haha"]] withTimeout:3 tag:1];
}
*/
}
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didReadData
:
(
NSData *
)
data
withTag
:
(
long
)
tag
{
NSData *
strData
=
[
data
subdataWithRange
:
NSMakeRange
(
0
,
[
data
length
]
)
]
;
NSString *
msg
=
[
[
NSString
alloc
]
initWithData
:
strData
encoding
:
NSUTF8StringEncoding
]
;
NSLog
(
@
"接收到data时候调用的方法 --- %@"
,
msg
)
;
//通过tag不同,接收不同的数据
}
//发送数据成功时调用
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didWriteDataWithTag
:
(
long
)
tag
{
if
(
[
sock
isConnected
]
)
{
NSLog
(
@
"------ -- 数据发送成功! -- %ld"
,
tag
)
;
}
/*
NSLog(@"数据发送成功 - %ld",tag);
NSLog(@"_clientSocket - %p",_asyncSocket.unreadData);
NSLog(@"sock - %p",sock);
*/
}
-
(
void
)
onSocketDidDisconnect
:
(
AsyncSocket *
)
sock
{
NSLog
(
@
"断开连接"
)
;
}
-
(
void
)
dealloc
{
[
_asyncSocket
release
]
;
[
_contentField
release
]
;
[
super
dealloc
]
;
}
-
(
void
)
didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning
]
;
// Dispose of any resources that can be recreated.
}
@
end
|
ps
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<?php
$socket
=
socket_create
(
AF_INET
,
SOCK_STREAM
,
SOL_TCP
)
;
$max_clients
=
10
;
socket_set_option
(
$socket
,
SOL_SOCKET
,
SO_REUSEADDR
,
1
)
;
socket_bind
(
$socket
,
0
,
9999
)
;
socket_listen
(
$socket
,
$max_clients
)
;
$clients
=
array
(’
0′
=
>
array
(‘
socket’
=
>
$socket
)
)
;
while
(
TRUE
)
{
$read
[
0
]
=
$socket
;
for
(
$i
=
1
;
$i
<
count
(
$clients
)
+
1
;
$i
++
)
{
if
(
$clients
[
$i
]
!=
NULL
)
{
$read
[
$i
+
1
]
=
$clients
[
$i
]
[
'socket'
]
;
}
}
$ready
=
socket_select
(
$read
,
$write
=
NULL
,
$except
=
NULL
,
0
)
;
if
(
in_array
(
$socket
,
$read
)
)
{
for
(
$i
=
1
;
$i
<
$max_clients
+
1
;
$i
++
)
{
if
(
!
isset
(
$clients
[
$i
]
)
)
{
$clients
[
$i
]
[
'socket'
]
=
socket_accept
(
$socket
)
;
socket_getpeername
(
$clients
[
$i
]
[
'socket'
]
,
$ip
)
;
$clients
[
$i
]
[
'ipaddy'
]
=
$ip
;
socket_write
(
$clients
[
$i
]
[
'socket'
]
,
"Welcome to my Custom Socket Server"
)
;
$count
=
count
(
$clients
)
-
1
;
socket_write
(
$clients
[
$i
]
[
'socket'
]
,
"There are $count client(s)connected to this server."
)
;
echo
(
"New client connected: "
.
$clients
[
$i
]
[
'ipaddy'
]
.
""
)
;
break
;
}
elseif
(
$i
==
(
$max_clients
-
1
)
)
{
echo
"To many Clients connected!"
;
}
if
(
$ready
<
1
)
{
continue
;
}
}
}
for
(
$i
=
1
;
$i
<
$max_clients
+
1
;
$i
++
)
{
if
(
in_array
(
$clients
[
$i
]
[
'socket'
]
,
$read
)
)
{
$data
=
@
socket_read
(
$clients
[
$i
]
[
'socket'
]
,
1024000
,
PHP_NORMAL_READ
)
;
if
(
$data
===
FALSE
)
{
unset
(
$clients
[
$i
]
)
;
echo
"Client disconnected!"
;
continue
;
}
$data
=
trim
(
$data
)
;
if
(
!
empty
(
$data
)
)
{
for
(
$j
=
1
;
$j
<
$max_clients
+
1
;
$j
++
)
{
if
(
isset
(
$clients
[
$j
]
[
'socket'
]
)
)
{
if
(
(
$clients
[
$j
]
[
'socket'
]
!=
$clients
[
$i
]
[
'socket'
]
)
&&
(
$clients
[
$j
]
[
'socket'
]
!=
$socket
)
)
{
echo
(
$clients
[
$i
]
[
'ipaddy'
]
.
" is sending a message!"
)
;
socket_write
(
$clients
[
$j
]
[
'socket'
]
,
"["
.
$clients
[
$i
]
[
'ipaddy'
]
.
"] says: "
.
$data
.
""
)
;
}
}
}
break
;
}
}
}
}
?>
|
//最新的一个。
首先添加Security.framework,CFNetwork.framework两框架,然后给CocoaAsyncSocket框架加进来,用cocoapods。
然后.h文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//
// ViewController.h
// socket
//
// Created by skyzizhu on 15/6/29.
// Copyright (c) 2015年 skyzizhu. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <AsyncSocket.h>
@
interface
ViewController
:
UIViewController
<
AsyncSocketDelegate
>
@
property
(
nonatomic
,
strong
)
AsyncSocket *
asyncSocket
;
@
end
|
.m文件
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
//
// ViewController.m
// socket
//
// Created by skyzizhu on 15/6/29.
// Copyright (c) 2015年 skyzizhu. All rights reserved.
//
#import "ViewController.h"
@
interface
ViewController
(
)
@
property
(
nonatomic
,
strong
)
UITextField *
textField
;
@
end
@
implementation
ViewController
-
(
void
)
viewDidDisappear
:
(
BOOL
)
animated
{
[
super
viewDidDisappear
:
animated
]
;
//断开连接
[
_asyncSocket
disconnect
]
;
}
-
(
void
)
viewDidLoad
{
[
super
viewDidLoad
]
;
UIButton *
button
=
[
[
UIButton
alloc
]
initWithFrame
:
CGRectMake
(
50
,
50
,
50
,
50
)
]
;
button
.
backgroundColor
=
[
UIColor
grayColor
]
;
[
button
setTitle
:
@
"Post"
forState
:
UIControlStateNormal
]
;
[
self
.
view
addSubview
:
button
]
;
[
button
addTarget
:
self
action
:
@
selector
(
postData
:
)
forControlEvents
:
UIControlEventTouchUpInside
]
;
_textField
=
[
[
UITextField
alloc
]
initWithFrame
:
CGRectMake
(
100
,
150
,
200
,
50
)
]
;
_textField
.
borderStyle
=
1
;
[
self
.
view
addSubview
:
_textField
]
;
_asyncSocket
=
[
[
AsyncSocket
alloc
]
initWithDelegate
:
self
]
;
NSError *
error
=
nil
;
if
(
[
_asyncSocket
connectToHost
:
@
"localhost"
onPort
:
9999
error
:
&
error
]
)
{
//NSLog(@"%d",[_socket isConnected]);
NSLog
(
@
"可以连接 - - -"
)
;
}
else
{
NSLog
(
@
"%@ fail"
,
error
)
;
}
[
_asyncSocket
readDataWithTimeout
:
-
1
tag
:
0
]
;
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark - button event
-
(
void
)
postData
:
(
id
)
sender
{
NSLog
(
@
" - - - isconnected %d"
,
[
_asyncSocket
isConnected
]
)
;
if
(
[
_textField
text
]
.
length
>
0
&&
[
_asyncSocket
isConnected
]
)
{
NSData *
postData
=
[
[
_textField
text
]
dataUsingEncoding
:
NSUTF8StringEncoding
]
;
[
_asyncSocket
writeData
:
postData
withTimeout
:
-
1
tag
:
0
]
;
[
_asyncSocket
readDataWithTimeout
:
-
1
tag
:
0
]
;
}
/*
UIImage *img = [UIImage imageNamed:@"User1.jpg"];
NSData *imgData = UIImagePNGRepresentation(img);
[_asyncSocket writeData:imgData withTimeout:-1 tag:0];
[_asyncSocket readDataWithTimeout:-1 tag:0];
*/
}
#pragma mark - socket delegate
//这个方法走一次,连接成功之后走一次
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didConnectToHost
:
(
NSString *
)
host
port
:
(
UInt16
)
port
{
NSLog
(
@
" - - delegate 连接成功调用"
)
;
}
//走一次,连接错误时候走
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
willDisconnectWithError
:
(
NSError *
)
err
{
NSLog
(
@
" - -- 未连接 出现错误调用 %@ "
,
err
)
;
}
//每调用一次[_asyncSocket writeData:postData withTimeout:-1 tag:0];这个方法就会走一次
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didWriteDataWithTag
:
(
long
)
tag
{
if
(
[
sock
isConnected
]
)
{
//_textField.text = nil;
NSLog
(
@
"发送数据成功调用 - - tag == %ld"
,
tag
)
;
}
}
//每调用一次[_asyncSocket readDataWithTimeout:-1 tag:0];这个方法就会走一次
-
(
void
)
onSocket
:
(
AsyncSocket *
)
sock
didReadData
:
(
NSData *
)
data
withTag
:
(
long
)
tag
{
NSData *
strData
=
[
data
subdataWithRange
:
NSMakeRange
(
0
,
[
data
length
]
)
]
;
NSString *
msg
=
[
[
NSString
alloc
]
initWithData
:
strData
encoding
:
NSUTF8StringEncoding
]
;
NSLog
(
@
"接收到data时候调用的方法 数据是 --- %@"
,
msg
)
;
|
|
/*
NSLog(@"接收到data时候调用的方法 数据是 --- %@",data);
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
UIImageView *views = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 300, 300)];
UIImage *i = [UIImage imageWithData:strData];
views.image = i;
[self.view addSubview:views];
*/
}
//走一次,断开连接的时候调用
-
(
void
)
onSocketDidDisconnect
:
(
AsyncSocket *
)
sock
{
NSLog
(
@
" 断开连接- - - "
)
;
}
-
(
void
)
didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning
]
;
// Dispose of any resources that can be recreated.
}
@
end
|
PHP后台:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<?php
$socket
=
socket_create
(
AF_INET
,
SOCK_STREAM
,
SOL_TCP
)
;
$max_clients
=
10
;
socket_set_option
(
$socket
,
SOL_SOCKET
,
SO_REUSEADDR
,
1
)
;
socket_bind
(
$socket
,
'127.0.0.1'
,
9999
)
;
socket_listen
(
$socket
,
$max_clients
)
;
$clients
=
array
(’
0′
=
>
array
(‘
socket’
=
>
$socket
)
)
;
while
(
TRUE
)
{
$read
[
0
]
=
$socket
;
for
(
$i
=
1
;
$i
<
count
(
$clients
)
+
1
;
$i
++
)
{
if
(
$clients
[
$i
]
!=
NULL
)
{
$read
[
$i
+
1
]
=
$clients
[
$i
]
[
'socket'
]
;
}
}
$ready
=
socket_select
(
$read
,
$write
=
NULL
,
$except
=
NULL
,
0
)
;
//print_r ($read);
if
(
in_array
(
$socket
,
$read
)
)
{
for
(
$i
=
1
;
$i
<
$max_clients
+
1
;
$i
++
)
{
if
(
!
isset
(
$clients
[
$i
]
)
)
{
$clients
[
$i
]
[
'socket'
]
=
socket_accept
(
$socket
)
;
socket_getpeername
(
$clients
[
$i
]
[
'socket'
]
,
$ip
)
;
$clients
[
$i
]
[
'ipaddy'
]
=
$ip
;
socket_write
(
$clients
[
$i
]
[
'socket'
]
,
"Welcome to my Custom Socket Server"
)
;
$count
=
count
(
$clients
)
-
1
;
socket_write
(
$clients
[
$i
]
[
'socket'
]
,
"There are $count client(s)connected to this server."
)
;
echo
(
"New client connected: "
.
$clients
[
$i
]
[
'ipaddy'
]
.
""
)
;
break
;
}
elseif
(
$i
==
(
$max_clients
-
1
)
)
{
echo
"To many Clients connected!"
;
}
if
(
$ready
<
1
)
{
continue
;
}
}
}
for
(
$i
=
1
;
$i
<
$max_clients
+
1
;
$i
++
)
{
//echo ("this is bool value".in_array($clients[$i]['socket'],$read));
if
(
in_array
(
$clients
[
$i
]
[
'socket'
]
,
$read
)
)
{
//echo $clients[$i]['socket'];
//PHP_NORMAL_READ
$data
=
@
socket_read
(
$clients
[
$i
]
[
'socket'
]
,
102400
,
PHP_BINARY_READ
)
;
if
(
!
empty
(
$data
)
)
{
echo
"服务器接受到客户端的数据 - - - "
.
$data
.
" - $$$$$ "
;
}
if
(
$data
===
FALSE
)
{
unset
(
$clients
[
$i
]
)
;
echo
"Client disconnected!"
;
continue
;
}
$data
=
trim
(
$data
)
;
if
(
!
empty
(
$data
)
)
{
for
(
$j
=
1
;
$j
<
$max_clients
+
1
;
$j
++
)
{
if
(
isset
(
$clients
[
$j
]
[
'socket'
]
)
)
{
/*判断是否是当前连接的socket资源
if(($clients[$j]['socket'] != $clients[$i]['socket']) && ($clients[$j]['socket'] != $socket)) {
echo($clients[$i]['ipaddy'] . " is sending a message!");
socket_write($clients[$j]['socket'],"[" . $clients[$i]['ipaddy']. "] says: " . $data . "");
}
*/
echo
(
$clients
[
$i
]
[
'ipaddy'
]
.
" is sending a message!"
.
$data
)
;
socket_write
(
$clients
[
$j
]
[
'socket'
]
,
"["
.
$clients
[
$i
]
[
'ipaddy'
]
.
"] says: "
.
$data
.
""
)
;
//socket_write($clients[$j]['socket'], $data);
}
}
break
;
}
}
}
}
|
/*
NSLog(@"接收到data时候调用的方法 数据是 --- %@",data);
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
UIImageView *views = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 300, 300)];
UIImage *i = [UIImage imageWithData:strData];
views.image = i;
[self.view addSubview:views];
*/
}
//走一次,断开连接的时候调用
-
(
void
)
onSocketDidDisconnect
:
(
AsyncSocket *
)
sock
{
NSLog
(
@
" 断开连接- - - "
)
;
}
-
(
void
)
didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning
]
;
// Dispose of any resources that can be recreated.
}
@
end
|
PHP后台:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<?php
$socket
=
socket_create
(
AF_INET
,
SOCK_STREAM
,
SOL_TCP
)
;
$max_clients
=
10
;
socket_set_option
(
$socket
,
SOL_SOCKET
,
SO_REUSEADDR
,
1
)
;
socket_bind
(
$socket
,
'127.0.0.1'
,
9999
)
;
socket_listen
(
$socket
,
$max_clients
)
;
$clients
=
array
(’
0′
=
>
array
(‘
socket’
=
>
$socket
)
)
;
while
(
TRUE
)
{
$read
[
0
]
=
$socket
;
for
(
$i
=
1
;
$i
<
count
(
$clients
)
+
1
;
$i
++
)
{
if
(
$clients
[
$i
]
!=
NULL
)
{
$read
[
$i
+
1
]
=
$clients
[
$i
]
[
'socket'
]
;
}
}
$ready
=
socket_select
(
$read
,
$write
=
NULL
,
$except
=
NULL
,
0
)
;
//print_r ($read);
if
(
in_array
(
$socket
,
$read
)
)
{
for
(
$i
=
1
;
$i
<
$max_clients
+
1
;
$i
++
)
{
if
(
!
isset
(
$clients
[
$i
]
)
)
{
$clients
[
$i
]
[
'socket'
]
=
socket_accept
(
$socket
)
;
socket_getpeername
(
$clients
[
$i
]
[
'socket'
]
,
$ip
)
;
$clients
[
$i
]
[
'ipaddy'
]
=
$ip
;
socket_write
(
$clients
[
$i
]
[
'socket'
]
,
"Welcome to my Custom Socket Server"
)
;
$count
=
count
(
$clients
)
-
1
;
socket_write
(
$clients
[
$i
]
[
'socket'
]
,
"There are $count client(s)connected to this server."
)
;
echo
(
"New client connected: "
.
$clients
[
$i
]
[
'ipaddy'
]
.
""
)
;
break
;
}
elseif
(
$i
==
(
$max_clients
-
1
)
)
{
echo
"To many Clients connected!"
;
}
if
(
$ready
<
1
)
{
continue
;
}
}
}
for
(
$i
=
1
;
$i
<
$max_clients
+
1
;
$i
++
)
{
//echo ("this is bool value".in_array($clients[$i]['socket'],$read));
if
(
in_array
(
$clients
[
$i
]
[
'socket'
]
,
$read
)
)
{
//echo $clients[$i]['socket'];
//PHP_NORMAL_READ
$data
=
@
socket_read
(
$clients
[
$i
]
[
'socket'
]
,
102400
,
PHP_BINARY_READ
)
;
if
(
!
empty
(
$data
)
)
{
echo
"服务器接受到客户端的数据 - - - "
.
$data
.
" - $$$$$ "
;
}
if
(
$data
===
FALSE
)
{
unset
(
$clients
[
$i
]
)
;
echo
"Client disconnected!"
;
continue
;
}
$data
=
trim
(
$data
)
;
if
(
!
empty
(
$data
)
)
{
for
(
$j
=
1
;
$j
<
$max_clients
+
1
;
$j
++
)
{
if
(
isset
(
$clients
[
$j
]
[
'socket'
]
)
)
{
/*判断是否是当前连接的socket资源
if(($clients[$j]['socket'] != $clients[$i]['socket']) && ($clients[$j]['socket'] != $socket)) {
echo($clients[$i]['ipaddy'] . " is sending a message!");
socket_write($clients[$j]['socket'],"[" . $clients[$i]['ipaddy']. "] says: " . $data . "");
}
*/
echo
(
$clients
[
$i
]
[
'ipaddy'
]
.
" is sending a message!"
.
$data
)
;
socket_write
(
$clients
[
$j
]
[
'socket'
]
,
"["
.
$clients
[
$i
]
[
'ipaddy'
]
.
"] says: "
.
$data
.
""
)
;
//socket_write($clients[$j]['socket'], $data);
}
}
break
;
}
}
}
}
?>
|
/*
NSLog(@"接收到data时候调用的方法 数据是 --- %@",data);
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
UIImageView *views = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 300, 300)];
UIImage *i = [UIImage imageWithData:strData];
views.image = i;
[self.view addSubview:views];
*/
}
//走一次,断开连接的时候调用
-
(
void
)
onSocketDidDisconnect
:
(
AsyncSocket *
)
sock
{
NSLog
(
@
" 断开连接- - - "
)
;
}
-
(
void
)
didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning
]
;
// Dispose of any resources that can be recreated.
}
@
end
|