網絡聊天室一 --- socket的簡單使用用C語言編寫(實現客戶端與服務器簡單通信)


網絡聊天室(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];
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM