Socket(一)笔记 C实现

2017-01-21  本文已影响67人  952625a28d0d

引入C头文件

#import <sys/types.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>```


- 初始化Socket并连接服务器

pragma mark -- 初始化Socket方法

static int CreateClinetSocket()
{
int ClinetSocket = 0;
//创建一个socket,返回值为Int。(注scoket其实就是Int类型)
//第一个参数addressFamily IPv4(AF_INET) 或 IPv6(AF_INET6)。
//第二个参数 type 表示 socket 的类型,通常是流stream(SOCK_STREAM) 或数据报文datagram(SOCK_DGRAM)
//第三个参数 protocol 参数通常设置为0,以便让系统自动为选择我们合适的协议,对于 stream socket 来说会是 TCP 协议(IPPROTO_TCP),而对于 datagram来说会是 UDP 协议(IPPROTO_UDP)。
ClinetSocket = socket(AF_INET, SOCK_STREAM, 0);
return ClinetSocket;
}


- 连接服务器

pragma mark -- 连接到服务器

static int ConnectionToServer(int client_socket,const char * server_ip,unsigned short port)
{
//生成一个sockaddr_in类型结构体
struct sockaddr_in sAddr={0};
sAddr.sin_len=sizeof(sAddr);

//设置IPv4
sAddr.sin_family=AF_INET;

//inet_aton是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址
//如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。
inet_aton(server_ip, &sAddr.sin_addr);

//htons是将整型变量从主机字节顺序转变成网络字节顺序,赋值端口号
sAddr.sin_port=htons(port);

//用scoket和服务端地址,发起连接。
//客户端向特定网络地址的服务器发送连接请求,连接成功返回0,失败返回 -1。
//注意:该接口调用会阻塞当前线程,直到服务器返回。
if (connect(client_socket, (struct sockaddr *)&sAddr, sizeof(sAddr))==0) {
    return client_socket;
}
return 0;

}



- 往服务器发消息

pragma mark -- 发送消息


- 开辟一个常驻线程 调用一个死循环来一直监听并接受服务器发来的消息

pragma mark -- 收到消息


- 断开连接

pragma mark -- 断开连接



###服务器

使用node服务器实现 

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 6969;

// 创建一个TCP服务器实例,调用listen函数开始监听指定端口
// 传入net.createServer()的回调函数将作为”connection“事件的处理函数
// 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的
net.createServer(function(sock) {

// 我们获得一个连接 - 该连接自动关联一个socket对象  
console.log('CONNECTED: ' +  
    sock.remoteAddress + ':' + sock.remotePort);  
    sock.write('服务端发出:连接成功');  

// 为这个socket实例添加一个"data"事件处理函数  
sock.on('data', function(data) {  
    console.log('DATA ' + sock.remoteAddress + ': ' + data);  
    // 回发该数据,客户端将收到来自服务端的数据  
    sock.write('You said "' + data + '"');  
});  

// 为这个socket实例添加一个"close"事件处理函数  
sock.on('close', function(data) {  
    console.log('CLOSED: ' +  
    sock.remoteAddress + ' ' + sock.remotePort);  
});  

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT); ```

if (self.delegate && [self.delegate respondsToSelector:@selector(receiveMessage:)]) {
            [self.delegate receiveMessage:[NSString stringWithFormat:@"%s",recv_Message]];
        }
- (void)receiveMessage:(NSString *)message{
    NSLog(@"收到的消息为%@",message);
    dispatch_async(dispatch_get_main_queue(), ^{
        self.receiveMessageTF.text = message;
    });
}

搭建一个简单的界面测试一下

node Server.js```

发送消息

![Socket.gif](https://img.haomeiwen.com/i189984/d2e88721e3319df1.gif?imageMogr2/auto-orient/strip)


上一篇 下一篇

猜你喜欢

热点阅读