(转)socket 测试程序
2011年03月16日
测试应用程序
现在可以将所有代码集合到一起进行测试了,在NetworkViewController.h文件中,声明下面的出口和行为:
#import
@interface NetworkViewController : UIViewController {
IBOutlet UITextField *txtMessage;
}
@property (nonatomic, retain) UITextField *txtMessage;
-(IBAction) btnSend: (id) sender;
@end
双击NetworkViewController.xib,在Interface Builder中打开编辑它,在View窗口中,使用下面的视图填充它,如图1所示。
l 文本区域(Text Field)
l 圆形按钮(Round Rect Button)
图 1 填充:使用视图填充View窗口
执行下面的操作
1、在File’s Owner上点击,将其拖到文本区域视图中,选择txtMessage。
2、选中圆形按钮视图,将其拖到File’s Owner上,选择btnSend。
在File’s Owner上点击右键,验证它的连接,如图2所示。
图 2 验证:验证File’s Owner上的连接
回到NetworkViewController.m文件,将下面的代码添加到viewDidLoad方法中。
- (void)viewDidLoad {
[self connectToServerUsingStream:@"192.168.1.102" portNo:500];
//---OR---
//[self connectToServerUsingCFStream:@"192.168.1.102" portNo:500];
[super viewDidLoad];
}
上面的代码假设你正连接到一个ip地址为192.168.1.102的服务器的500端口上。btnSend:方法的代码如下:
-(IBAction) btnSend: (id) sender {
const uint8_t *str =
(uint8_t *) [txtMessage.text cStringUsingEncoding:NSASCIIStringEncoding];
[self writeToServer:str];
txtMessage.text = @"";
}
在dealloc方法中重新发布txtMessage出口。
- (void)dealloc {
[txtMessage release];
[self disconnect];
[iStream release];
[oStream release];
if (readStream) CFRelease(readStream);
if (writeStream) CFRelease(writeStream);
[super dealloc];
}
构建服务器
现在已经构建好一个可以在iPhone上运行的客户端,并已经可以通过它向服务器发送一些文本信息,但为了测试这个应用程序还需要一个服务端程序,我使用C#构建了一个非常简单的控制台服务器,下面是Program.cs文件的代码。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Net.Sockets;
5 namespace Server_CS
6 {
7 class Program
8 {
9 const int portNo = 500;
10 static void Main(string[] args)
11 {
12 System.Net.IPAddress localAdd =
13 System.Net.IPAddress.Parse("192.168.1.102");
14 TcpListener listener = new TcpListener(localAdd, portNo);
15 listener.Start();
16 while (true)
17 {
18 TcpClient tcpClient = listener.AcceptTcpClient();
19 NetworkStream ns = tcpClient.GetStream();
20 byte[] data = new byte[tcpClient.ReceiveBufferSize];
21 int numBytesRead = ns.Read(data, 0,
22 System.Convert.ToInt32(tcpClient.ReceiveBufferSize));
23 Console.WriteLine("Received :" +
24 Encoding.ASCII.GetString(data, 0, numBytesRead));
25 //---write back to the client---
26 ns.Write(data, 0, numBytesRead);
27 }
28 }
29 }
30 }
31
服务端程序执行下面的任务:
l 它假设服务器的ip地址是192.168.1.102,在你的终端上测试时,请将这个ip地址替换为你运行这个服务端程序的计算机的ip地址。
l 它将接收到的所有数据返回给客户端。
l 一旦接收到数据,服务端不再监听入站数据,如果客户端要再次发生数据,需要重新连接到服务器。
在文本区域中输入一些文字,然后点击Send按钮,如果连接成功,你将会看到Alert视图显示接收到数据。
一个更有趣的例子
在View窗口中添加下面的视图,如图3所示。
l 标签(Label)
l 文本区域(Text Field)
l 圆形按钮(Round Rect Button)
l 文本视图(Text View)
图 3 视图:增加更多的视图
选择文本视图,按下Command-T将字体大小修改为9,如图4所示。
图 4 修改文本视图的字体大小
在NetworkViewController.h文件中,增加下面的代码:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
1 #import
2 @interface NetworkViewController : UIViewController {
3 IBOutlet UITextField *txtMessage;
4 IBOutlet UITextField *txtNickName;
5 IBOutlet UITextView *txtMessages;
6 }
7 @property (nonatomic, retain) UITextField *txtMessage;
8 @property (nonatomic, retain) UITextField *txtNickName;
9 @property (nonatomic, retain) UITextView *txtMessages;
10 -(IBAction) btnSend:(id) sender;
11 Figure 5. Connections: Verify the connections.
12 -(IBAction) btnLogin:(id) sender;
13 @end
14
执行下面的操作
1、按住CTRL键,点击File’s Owner,将其拖到文本区域的顶部,选择txtNickName。
2、按住CTRL键,点击File’s Owner,将其拖到文本视图的顶部,选择txtMessages。
3、按住CTRL键,点击圆形按钮,将其拖到File’s Owner上,选择btnLogin。
在File’s Owner上点击右键,验证它的连接,如图5所示。
图 5 连接:验证连接
在NetworkViewController.m文件中,添加下面的代码:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
1 #import "NetworkViewController.h"
2 #import "NSStreamAdditions.h"
3 #import
4 @implementation NetworkViewController
5 @synthesize txtMessage;
6 @synthesize txtNickName;
7 @synthesize txtMessages;
8
9 -(IBAction) btnLogin:(id) sender {
10 const uint8_t *str = (uint8_t *)
11 [txtNickName.text cStringUsingEncoding:NSASCIIStringEncoding];
12 [self writeToServer:str];
13 }
14 - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
15 switch(eventCode) {
16 case NSStreamEventHasBytesAvailable:
17 {
18 if (data == nil) {
19 data = [[NSMutableData alloc] init];
20 }
21 uint8_t buf[1024];
22 unsigned int len = 0;
23 len = [(NSInputStream *)stream read:buf maxLength:1024];
24 if(len) {
25 [data appendBytes:(const void *)buf length:len];
26 int bytesRead;
27 bytesRead += len;
28 } else {
29 NSLog(@"No data.");
30 }
31 NSString *str = [[NSString alloc] initWithData:data
32 encoding:NSUTF8StringEncoding];
33 NSLog(str);
34 NSString *existingMsg = txtMessages.text;
35 existingMsg = [existingMsg stringByAppendingString:str];
36 txtMessages.text = existingMsg;
37 [str release];
38 [data release];
39 data = nil;
40 } break;
41 }
42 }
43 - (void)dealloc {
44 [txtNickName release];
45 [txtMessages release];
46 [txtMessage release];
47 [self disconnect];
48 [iStream release];
49 [oStream release];
50 if (readStream) CFRelease(readStream);
51 if (writeStream) CFRelease(writeStream);
52 [super dealloc];
53 }
54
Ok!按Command-R测试这个应用程序,首先,为你自己输入一个昵称,然后点击Login按钮,如图6所示。现在就可以输入消息,点击发送按钮开始聊天了。
图 6 聊天:开始在iPhone上聊天
小结
在这篇文章中,你看到了如何使用TCP/IP与另一台服务器进行通信,知道如何构建与外界通信的应用程序编写方法后,你可以在上面增加更多有趣的功能,iPhone完全可以成为一台mini PC。
2011年03月16日
测试应用程序
现在可以将所有代码集合到一起进行测试了,在NetworkViewController.h文件中,声明下面的出口和行为:
#import
@interface NetworkViewController : UIViewController {
IBOutlet UITextField *txtMessage;
}
@property (nonatomic, retain) UITextField *txtMessage;
-(IBAction) btnSend: (id) sender;
@end
双击NetworkViewController.xib,在Interface Builder中打开编辑它,在View窗口中,使用下面的视图填充它,如图1所示。
l 文本区域(Text Field)
l 圆形按钮(Round Rect Button)
图 1 填充:使用视图填充View窗口
执行下面的操作
1、在File’s Owner上点击,将其拖到文本区域视图中,选择txtMessage。
2、选中圆形按钮视图,将其拖到File’s Owner上,选择btnSend。
在File’s Owner上点击右键,验证它的连接,如图2所示。
图 2 验证:验证File’s Owner上的连接
回到NetworkViewController.m文件,将下面的代码添加到viewDidLoad方法中。
- (void)viewDidLoad {
[self connectToServerUsingStream:@"192.168.1.102" portNo:500];
//---OR---
//[self connectToServerUsingCFStream:@"192.168.1.102" portNo:500];
[super viewDidLoad];
}
上面的代码假设你正连接到一个ip地址为192.168.1.102的服务器的500端口上。btnSend:方法的代码如下:
-(IBAction) btnSend: (id) sender {
const uint8_t *str =
(uint8_t *) [txtMessage.text cStringUsingEncoding:NSASCIIStringEncoding];
[self writeToServer:str];
txtMessage.text = @"";
}
在dealloc方法中重新发布txtMessage出口。
- (void)dealloc {
[txtMessage release];
[self disconnect];
[iStream release];
[oStream release];
if (readStream) CFRelease(readStream);
if (writeStream) CFRelease(writeStream);
[super dealloc];
}
构建服务器
现在已经构建好一个可以在iPhone上运行的客户端,并已经可以通过它向服务器发送一些文本信息,但为了测试这个应用程序还需要一个服务端程序,我使用C#构建了一个非常简单的控制台服务器,下面是Program.cs文件的代码。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Net.Sockets;
5 namespace Server_CS
6 {
7 class Program
8 {
9 const int portNo = 500;
10 static void Main(string[] args)
11 {
12 System.Net.IPAddress localAdd =
13 System.Net.IPAddress.Parse("192.168.1.102");
14 TcpListener listener = new TcpListener(localAdd, portNo);
15 listener.Start();
16 while (true)
17 {
18 TcpClient tcpClient = listener.AcceptTcpClient();
19 NetworkStream ns = tcpClient.GetStream();
20 byte[] data = new byte[tcpClient.ReceiveBufferSize];
21 int numBytesRead = ns.Read(data, 0,
22 System.Convert.ToInt32(tcpClient.ReceiveBufferSize));
23 Console.WriteLine("Received :" +
24 Encoding.ASCII.GetString(data, 0, numBytesRead));
25 //---write back to the client---
26 ns.Write(data, 0, numBytesRead);
27 }
28 }
29 }
30 }
31
服务端程序执行下面的任务:
l 它假设服务器的ip地址是192.168.1.102,在你的终端上测试时,请将这个ip地址替换为你运行这个服务端程序的计算机的ip地址。
l 它将接收到的所有数据返回给客户端。
l 一旦接收到数据,服务端不再监听入站数据,如果客户端要再次发生数据,需要重新连接到服务器。
在文本区域中输入一些文字,然后点击Send按钮,如果连接成功,你将会看到Alert视图显示接收到数据。
一个更有趣的例子
在View窗口中添加下面的视图,如图3所示。
l 标签(Label)
l 文本区域(Text Field)
l 圆形按钮(Round Rect Button)
l 文本视图(Text View)
图 3 视图:增加更多的视图
选择文本视图,按下Command-T将字体大小修改为9,如图4所示。
图 4 修改文本视图的字体大小
在NetworkViewController.h文件中,增加下面的代码:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
1 #import
2 @interface NetworkViewController : UIViewController {
3 IBOutlet UITextField *txtMessage;
4 IBOutlet UITextField *txtNickName;
5 IBOutlet UITextView *txtMessages;
6 }
7 @property (nonatomic, retain) UITextField *txtMessage;
8 @property (nonatomic, retain) UITextField *txtNickName;
9 @property (nonatomic, retain) UITextView *txtMessages;
10 -(IBAction) btnSend:(id) sender;
11 Figure 5. Connections: Verify the connections.
12 -(IBAction) btnLogin:(id) sender;
13 @end
14
执行下面的操作
1、按住CTRL键,点击File’s Owner,将其拖到文本区域的顶部,选择txtNickName。
2、按住CTRL键,点击File’s Owner,将其拖到文本视图的顶部,选择txtMessages。
3、按住CTRL键,点击圆形按钮,将其拖到File’s Owner上,选择btnLogin。
在File’s Owner上点击右键,验证它的连接,如图5所示。
图 5 连接:验证连接
在NetworkViewController.m文件中,添加下面的代码:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
1 #import "NetworkViewController.h"
2 #import "NSStreamAdditions.h"
3 #import
4 @implementation NetworkViewController
5 @synthesize txtMessage;
6 @synthesize txtNickName;
7 @synthesize txtMessages;
8
9 -(IBAction) btnLogin:(id) sender {
10 const uint8_t *str = (uint8_t *)
11 [txtNickName.text cStringUsingEncoding:NSASCIIStringEncoding];
12 [self writeToServer:str];
13 }
14 - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
15 switch(eventCode) {
16 case NSStreamEventHasBytesAvailable:
17 {
18 if (data == nil) {
19 data = [[NSMutableData alloc] init];
20 }
21 uint8_t buf[1024];
22 unsigned int len = 0;
23 len = [(NSInputStream *)stream read:buf maxLength:1024];
24 if(len) {
25 [data appendBytes:(const void *)buf length:len];
26 int bytesRead;
27 bytesRead += len;
28 } else {
29 NSLog(@"No data.");
30 }
31 NSString *str = [[NSString alloc] initWithData:data
32 encoding:NSUTF8StringEncoding];
33 NSLog(str);
34 NSString *existingMsg = txtMessages.text;
35 existingMsg = [existingMsg stringByAppendingString:str];
36 txtMessages.text = existingMsg;
37 [str release];
38 [data release];
39 data = nil;
40 } break;
41 }
42 }
43 - (void)dealloc {
44 [txtNickName release];
45 [txtMessages release];
46 [txtMessage release];
47 [self disconnect];
48 [iStream release];
49 [oStream release];
50 if (readStream) CFRelease(readStream);
51 if (writeStream) CFRelease(writeStream);
52 [super dealloc];
53 }
54
Ok!按Command-R测试这个应用程序,首先,为你自己输入一个昵称,然后点击Login按钮,如图6所示。现在就可以输入消息,点击发送按钮开始聊天了。
图 6 聊天:开始在iPhone上聊天
小结
在这篇文章中,你看到了如何使用TCP/IP与另一台服务器进行通信,知道如何构建与外界通信的应用程序编写方法后,你可以在上面增加更多有趣的功能,iPhone完全可以成为一台mini PC。