談到socket編程畦戒,業(yè)內(nèi)已經(jīng)有了很多socket第三方很好用的框架 CocoaSyncSocket 檩赢,socketIO搬卒, 如果要了解socket的原理瑟俭,還是從用c語言建立一個簡單socket開始
1.建立鏈接
//SOCK_STREAM 代表用TCP 連接
//AF_INET 代表是ipv4網(wǎng)絡(luò)
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
NSLog(@"創(chuàng)建失敗");
}else{
//綁定地址和端口
int port = 1234;
NSString *serverIP = @"127.0.0.1";
struct sockaddr_in server_addr;
server_addr.sin_len = sizeof(struct sockaddr_in);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(serverIP.UTF8String);
bzero(&(server_addr.sin_zero), 8);
//創(chuàng)建新的socket
int aResult = connect(server_socket, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));
if (aResult == -1) {
NSLog(@"鏈接失敗");
}else{
self.server_socket = server_socket;
if(self.sockectThread == nil) {
// 異步線程接受客戶端的鏈接
self.sockectThread = [[NSThread alloc] initWithTarget:self selector:@selector(acceptFromServer) object:nil];
}
}
}
2.發(fā)送數(shù)據(jù)
-(void)sendMsg:(NSString*)msg {
/*send 方法參數(shù)
參數(shù)1:客戶端的socket
參數(shù)2: 要發(fā)送的內(nèi)容
參數(shù)3: 要發(fā)送內(nèi)容的長度,字節(jié)
發(fā)送標(biāo)示位 傳0即可
*/
char *buf[1024] = {0};
const char *p1 = (char*)buf;
p1 = [msg cStringUsingEncoding:NSUTF8StringEncoding];
send(self.server_socket, p1, 1024, 0);
}
3.接收數(shù)據(jù)
- (void)acceptFromServer{
//死循環(huán)接收數(shù)據(jù)
while (1) {
@autoreleasepool {
//接受服務(wù)器傳來的數(shù)據(jù)
char buf[1024];
long iReturn = recv(self.server_socket, buf, 1024, 0);
if (iReturn>0) {
NSString *str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
//通知代理處理事情
}else if (iReturn == -1){
NSLog(@"接受失敗-1");
break;
}
}
}
}
這就是ios 客戶端如果要用源碼實(shí)現(xiàn)一個最簡單的socket需要的代碼契邀,其中有好多問題摆寄,發(fā)送數(shù)據(jù)的時候如果數(shù)據(jù)超過了1024個字節(jié),就會產(chǎn)生丟失。接收socket數(shù)據(jù)的時候沒有處理微饥,安全性問題等等逗扒。
通過Socket編程更深刻了解Socket原理,用CocoaSyncSocket欠橘,寫了一個Socket 心跳連接矩肩,斷包,黏包肃续,斷線重連的demo https://github.com/maoemao/socketDemo