網絡聊天室(socket簡單聊天)

關鍵代碼如下:
一、連接
1.socket連接
- (IBAction)socketConnect:(id)sender { //0.這里使用已經用python寫好的服務器進行測試,在終端里cd到服務器代碼的位置,然后開始啟動它 python 服務器文件名 //1.三次握手,通過ip和端口號。 //2.使用c語言編寫輸入輸出流,並分配輸入輸出流的內存空間 //3.轉換成oc的輸入輸出流。 //4.加到主運行循環中,主運行監聽網絡 //5.打開輸入輸出流 NSString *host = @"127.0.0.1"; int post = 12345; CFReadStreamRef readStream; //輸入流 CFWriteStreamRef writeStream; //輸出流 //為輸入輸出流的內存空間 CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), post, &readStream, &writeStream); _inputStream = (__bridge NSInputStream *)readStream; _outStream = (__bridge NSOutputStream *)writeStream; _inputStream.delegate = self; _outStream.delegate = self; //加到主運行循環中 [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [_outStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; //打開 [_inputStream open]; [_outStream open]; }
2.socket代理回調
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{ // NSStreamEventOpenCompleted = 1UL << 0, // NSStreamEventHasBytesAvailable = 1UL << 1, // NSStreamEventHasSpaceAvailable = 1UL << 2, // NSStreamEventErrorOccurred = 1UL << 3, // NSStreamEventEndEncountered = 1UL << 4 switch (eventCode) { case NSStreamEventOpenCompleted: NSLog(@"成功連接,形成輸入輸出流通道"); break; case NSStreamEventHasBytesAvailable: NSLog(@"有數據可讀"); [self readData]; break; case NSStreamEventHasSpaceAvailable: NSLog(@"可以發送數據"); break; case NSStreamEventErrorOccurred: NSLog(@"有錯誤發生連接失敗"); break; case NSStreamEventEndEncountered: NSLog(@"正常結束連接"); break; default: break; } }
二、登錄
//發送登錄指令,使用輸出流 //拼接登錄指令 iam:登錄信息,服務器那邊規定登錄以iam:開頭 NSString *loginStr = @"iam:zhangSan"; [self sendData:loginStr];
三、發送信息
1.發送信息
- (BOOL)textFieldShouldReturn:(UITextField *)textField{ NSString *msg = textField.text; if (msg.length) return YES; //服務器那邊規定聊天時以msg:開頭 [self sendData:[@"msg:" stringByAppendingString:msg]]; return YES; } - (void)sendData:(NSString *)sendMsg{ //unit_8 字符(char型)+ * 就是字符串 NSData *data = [sendMsg dataUsingEncoding:NSUTF8StringEncoding]; [_outStream write:data.bytes maxLength:data.length]; }
2.鍵盤處理
//監控鍵盤的彈出和隱藏 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kdWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kdWillHide:) name:UIKeyboardWillHideNotification object:nil];
#pragma mark --- keyboard handle - (void)kdWillShow:(NSNotification *)noti{ CGFloat kdHeight = [noti.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height; self.viewBottmConstraints.constant = kdHeight; } - (void)kdWillHide:(NSNotification *)noti{ self.viewBottmConstraints.constant = 0; }
- (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; }
四、讀取消息和顯示消息
//read data - (void)readData{ //創建緩沖區,比如說一個杯子可以裝多少水,規定一下 uint8_t buf[1024]; //讀取數據,len是服務器讀取的實際字節數 NSUInteger len = [_inputStream read:buf maxLength:sizeof(buf)]; //把緩沖區的實際字節數轉換成字符串 NSString *readStr = [[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding]; NSLog(@"%@",readStr); [self.msgs addObject:readStr]; [self.tableView reloadData]; }
