ios实现基于socket tcp/ip 的通讯

之前写过基于http的网络传输层的通讯,现在项目需要实现tcp/ip的通讯协议,通过网络查找了一下,已经有人写好了公开的类库AsyncSocket,下面介绍一下AsyncSocket的使用方法。

AsyncSocket的官方文档:http://code.google.com/p/cocoaasyncsocket/

使用方法如下:

1、创建工程。

2、把AsyncSocket添加到项目中。

3、添加CFNetwork.framework到工程中。

4、实现测试类:

#import <UIKit/UIKit.h> 
#import "AsyncSocket.h" 
@interface iphone_socketViewController : UIViewController { 

    AsyncSocket *asyncSocket; 

@end

相应的方法实现:

 

#import "iphone_socketViewController.h" 
@implementation iphone_socketViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    asyncSocket = [[AsyncSocket alloc] initWithDelegate:self]; 
    NSError *err = nil; 
   if(![asyncSocket connectToHost:@"192.168.0.113" onPort:25001 error:&err]) 
    { 
        NSLog(@"Error: %@", err); 
    } 

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port 

    NSLog(@"onSocket:%p didConnectToHost:%@ port:%hu", sock, host, port); 
    [sock readDataWithTimeout:1 tag:0]; 

-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 

    NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"===%@",aStr); 
    [aStr release]; 
    NSData* aData= [@"<xml>我喜欢你<xml>" dataUsingEncoding: NSUTF8StringEncoding]; 
    [sock writeData:aData withTimeout:-1 tag:1]; 
    [sock readDataWithTimeout:1 tag:0]; 

- (void)onSocket:(AsyncSocket *)sock didSecure:(BOOL)flag 

        NSLog(@"onSocket:%p didSecure:YES", sock); 

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err 

    NSLog(@"onSocket:%p willDisconnectWithError:%@", sock, err); 

- (void)onSocketDidDisconnect:(AsyncSocket *)sock 

    //断开连接了 
    NSLog(@"onSocketDidDisconnect:%p", sock); 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 

- (void)viewDidUnload { 
    asyncSocket=nil; 

- (void)dealloc { 
    [asyncSocket release]; 
    [super dealloc]; 

@end

这里只实现了简单的客户端,关于服务器的实现,是采用pathy写的。在源代码中有。

编译运行结果:

服务器端:

bogon:iosworkspace vsp$ ./Servers.py 
客户端的IP是: (’192.168.0.169′, 54851) 
<xml>我喜欢你<xml> 
————– 
后来发的数据——-

客户端:

2010-12-27 19:14:47.723 iphone.socket[3186:307] WB:Notice: WinterBoard 
2010-12-27 19:14:48.892 iphone.socket[3186:307] onSocket:0x16bd00 didConnectToHost:192.168.0.113 port:25001 
2010-12-27 19:14:48.897 iphone.socket[3186:307] ===我是服务器端的数据 
2010-12-27 19:14:48.911 iphone.socket[3186:307] ===我不喜欢你 
2010-12-27 19:14:48.918 iphone.socket[3186:307] onSocket:0x16bd00 willDisconnectWithError:(null) 
2010-12-27 19:14:48.928 iphone.socket[3186:307] onSocketDidDisconnect:0x16bd00

源代码:http://easymorse-iphone.googlecode.com/svn/trunk/iphone.socket/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以参考如下代码实现: ```cpp #include <boost/asio.hpp> #include <thread> #include <iostream> using namespace boost::asio; using namespace boost::system; using namespace std::chrono_literals; class TcpServer { public: TcpServer(io_service& ios, short port) : acceptor_(ios, ip::tcp::endpoint(ip::tcp::v4(), port)) {} void start() { std::thread t([&]() { while (true) { try { ip::tcp::socket sock(acceptor_.get_io_service()); acceptor_.accept(sock); std::cout << "New connection from: " << sock.remote_endpoint() << std::endl; std::thread([&]() { try { while (true) { char buf[1024]; size_t len = sock.read_some(buffer(buf)); write(sock, buffer(buf, len)); } } catch (const std::exception& e) { std::cerr << e.what() << std::endl; } }).detach(); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; std::this_thread::sleep_for(1s); } } }); t.detach(); } private: ip::tcp::acceptor acceptor_; }; int main() { try { io_service ios; TcpServer server(ios, 9999); server.start(); ios.run(); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } ``` 这里使用了 Boost.Asio 库,创建了一个 `TcpServer` 类,其中 `start()` 方法会在新线程中循环监听客户端连接,处理连接请求。监听到连接请求后,会创建一个新线程处理与该客户端的通信,每次收到消息后直接将其回复。具体实现中,使用了 `ip::tcp::acceptor` 和 `ip::tcp::socket` 类进行监听和数据传输。 在 `main()` 函数中,创建了一个 `io_service` 对象并运行,同时启动了 `TcpServer` 对象的 `start()` 方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值