Socket的简单使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket的简单使用相关的知识,希望对你有一定的参考价值。

注意;这里是封装出来一个工具类 创建类方法来实现客户端和服务端的socket的创建 和 分别的一些必须实现的方法

  socket 通信需要一个客户端和一个服务端

客户端和服务端都得有一个socket (类似于用于通信的手机)int socket的方法

服务器端要做的操作有: 1.创建socket 2.绑定一个众所周知的地址(bind)3.处于监听状态 (listen) 4.随时处于接受请求,作出响应,accept 5.接受信息 recv

客户端要做的操作的有;1.创建socket 2.实现链接(connect)3.发送信息 send

 

使用socket时 要导入头文件

#import <netdb.h>

#import <arpa/inet.h>

 

 

#import "Socket.h"

 

@implementation Socket

 

//封装出类方法 创建服务端

+(void)serviceWithport:(int)port with:(Myblock)block{

    

    dispatch_queue_t globel = dispatch_get_global_queue(0, 0);

    dispatch_async(globel, ^{

//        1.创建服务端的socket

    

        int  serviceId =  socket(AF_INET, SOCK_STREAM, 0);

        if (!serviceId) {

            NSLog(@"socket error");

            return;

        }

//    2.进行绑定地址

//        2.1创建地址的结构体

        struct sockaddr_in addr;

//        2.1.1初始化创建的结构体

        memset(&addr, 0, sizeof(addr));

//        2.1.2设置ip地址参数

        addr.sin_family = AF_INET;

//        2.1.3设置ip端口

        addr.sin_port = port ;

        addr.sin_addr.s_addr = htonl(INADDR_ANY);

        

    int blindId = bind(serviceId, (struct sockaddr*)&addr, sizeof(addr));

        if (blindId == -1) {

            NSLog(@"bind error");

            return;

        }

        

//    3.实现监听

        int listenId = listen(serviceId, 10);

        if (listenId == -1) {

            NSLog(@"监听失败");

            return;

        }

//        4.实现响应  //创建一个while 可以多次接受客户端的访问

        while (1) {

            int acceptid =  accept(serviceId, NULL, NULL);

            //        5.接收信息

            //        5.1创建一个字符串数组

            char str[1000];

            long recvId =  recv(acceptid, &str, 1000, 0);

            if (recvId) {

                block(str);

            }

            NSLog(@"str = %s",str);

 

        }

        

    });

}

+(void)clientWithPort:(int)port address:(NSString *)address msg:(NSString *)msg{

    

    dispatch_queue_t globel = dispatch_get_global_queue(0, 0);

    dispatch_async(globel, ^{

        //    1.创建socket

        int clientId = socket(AF_INET, SOCK_STREAM, 0);

        if (!clientId ) {

            NSLog(@"socket error");

            return ;

        }

//   2.进行连接

        struct sockaddr_in addr;

        memset(&addr, 0, sizeof(addr));

        addr.sin_port = port ;

        addr.sin_family = AF_INET;

//      将oc字符串地址转换成字符串

        const char *str = [address UTF8String];

        inet_pton(AF_INET, str, &addr.sin_addr);

//        连接connect

       int connectId = connect(clientId,(struct sockaddr*) &addr, sizeof(addr));

        if (connectId == -1) {

            NSLog(@"connect error");

            return;

        }

//        将oc 字符串信息转换成C字符

        const char *str2 = [msg UTF8String];

//        发送信息

        send(clientId, str2, sizeof(str2), 0);

        close(clientId);

    });

    

    

    

    

}

 

@end

 

以上是关于Socket的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

Hexo页面优化和音乐的心得

外贸建站优化推广心得之TAG标签的正确使用方法

服务器编程心得—— 如何将socket设置为非阻塞模式

关于时间和空间复杂度的优化心得分享(C# )

服务器编程心得—— 如何将socket设置为非阻塞模式

关于java中BufferedReader的read()及readLine()方法的使用心得