(转)socket 测试程序

(转)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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值