1、連接服務(wù)器
2、監(jiān)聽狀態(tài)
3、發(fā)送
4、當(dāng)Stream 的狀態(tài)為NSStreamEventHasBytesAvailable 時(shí) 接收消息
注意:
我是使用 chatsetver.py來測試的
#所以端口號是12345 而且消息的指令是msg 登錄指令是iam
連接服務(wù)器
// 1.連接服務(wù)器
/*
1.端口號
2.主機(jī)
3.輸入輸出流(用的是C語言的輸入輸出流)
4.連接 CFStreamCreatePairWithSocketToHost(...)
5.將輸入輸出流轉(zhuǎn)成OC
6.設(shè)置代理
7.放入運(yùn)行循環(huán)
8.打開輸入輸出流
*/
// 2.監(jiān)聽狀態(tài)
// 3.登錄
/*
NSString 轉(zhuǎn)成 NSData 類型
在通過 NSOutputStream 的類方法 write(data.bytes,data.length)
*/
// 4.發(fā)送消息
/*
NSString 轉(zhuǎn)成 NSData 類型
在通過 NSOutputStream 的類方法 write(data.bytes,data.length)
*/
// 5.接收消息
/*
建立一個(gè)緩沖區(qū) uint8_t buf[1024];
返回實(shí)際裝的字節(jié)數(shù)
把字節(jié)數(shù)組轉(zhuǎn)換成NSData
將data轉(zhuǎn)化成字符串
*/
代碼
#連接
-(void)connect{
//主機(jī)
NSString *host = @"127.0.0.1";
//端口號
int port = 12345;
//輸入輸出流(用的是C語言的輸入輸出流)
CFReadStreamRef read;
CFWriteStreamRef write;
//連接
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, &read, &write);
//將輸入輸出流轉(zhuǎn)成OC
inputStream = (__bridge NSInputStream *)(read);
outputStream = (__bridge NSOutputStream *)(write);
//設(shè)置代理
inputStream.delegate = self;
outputStream.delegate = self;
//放入運(yùn)行循環(huán)
[inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
//打開輸入輸出流
[inputStream open];
[outputStream open];
}
#代理方法 - 狀態(tài)監(jiān)聽
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"輸入輸出流打開完成");
break;
case NSStreamEventHasBytesAvailable:
NSLog(@"有字節(jié)可讀");
[self recevisMessage];
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"可以發(fā)送字節(jié)");
break;
case NSStreamEventErrorOccurred:
NSLog(@" 連接出現(xiàn)錯(cuò)誤");
break;
case NSStreamEventEndEncountered:
NSLog(@"連接結(jié)束");
// 關(guān)閉輸入輸出流
[inputStream close];
[outputStream close];
// 從主運(yùn)行循環(huán)移除
[inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
break;
}
}
#登錄
-(void)login{
// 在服務(wù)器chatserver.py中 以iam為登錄指令, mag 是消息指令 通過 iam 指令 進(jìn)行登錄
NSString *login = @"iam:Cancer";
NSData *data = [login dataUsingEncoding:NSUTF8StringEncoding];
[outputStream write:data.bytes maxLength:data.length];
}
#發(fā)送消息
-(void)sendMessage{
NSString *msg = @"msg:hello!";
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[outputStream write:data.bytes maxLength:data.length];
}
#接收消息
-(void)recevisMessage{
// 建立一個(gè)緩沖區(qū) uint8_t buf[1024];
uint8_t buf[1024];
// 返回實(shí)際裝的字節(jié)數(shù)
NSInteger len = [inputStream read:buf maxLength:sizeof(buf)];
// 把字節(jié)數(shù)組轉(zhuǎn)換成NSData
NSData *data = [NSData dataWithBytes:buf length:len];
// 將data轉(zhuǎn)化成字符串
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}