Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标c中的socket编程_Iphone_Ios_Ipad_Sockets - Fatal编程技术网

Iphone 目标c中的socket编程

Iphone 目标c中的socket编程,iphone,ios,ipad,sockets,Iphone,Ios,Ipad,Sockets,我有一个使用套接字的应用程序 在我的应用程序中,我试图建立套接字连接,在连接套接字之后,我需要向服务器发送soap请求。我在向服务器发送soap请求时遇到问题。我已附上代码。请帮我做这件事 BOOL status; CFReadStreamRef readStream; CFWriteStreamRef writeStream; urlString = @"hoegamestg.hogaming.info"; // urlString = @"247li

我有一个使用套接字的应用程序

在我的应用程序中,我试图建立套接字连接,在连接套接字之后,我需要向服务器发送soap请求。我在向服务器发送soap请求时遇到问题。我已附上代码。请帮我做这件事

 BOOL status;

    CFReadStreamRef readStream;

    CFWriteStreamRef writeStream;

    urlString = @"hoegamestg.hogaming.info";

    // urlString = @"247liveagent.hointeractive.com";



    if (![urlString isEqualToString:@""])

    {
        NSURL *website = [NSURL URLWithString:urlString];

        if (!website)
        {

            NSLog(@"%@ is not a valid URL", urlString);
            status = NO;


        }

        else

        {
            NSLog(@"URL IS VALID%@",website );



            CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef) [website host], 5654, &readStream, &writeStream);



            //  CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef) urlString, 5654, &readStream, &writeStream);


            //USE TOLL-FREE BRIDGING FOR CONVERTING CORE-FOUNDATION STREAMS TO NSSTREAMS.


            self.inputStream = (__bridge_transfer NSInputStream *)readStream;
            self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;

            //SET DELEGATES TO STREAMS.

            [self.inputStream setDelegate:self];
            [self.outputStream setDelegate:self];

            //AVOID BLOCKING OPERATIONS BY SCHEDULING THEM ON TO RUN LOOPS.

            [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

            //FINALLY OPEN THE STREAMS.

            [self.inputStream open];
            [self.outputStream open];


        }

    }......
委托方法和soap请求

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{

    // Start Logging events.
   // NSString *str = [NSString stringWithFormat:@"%d",eventCode];
   // NSMutableString *subscribeTableString;

    NSData *data;

    NSString *soapMessage = [[NSString alloc]init];



    switch (eventCode) {

        case NSStreamEventNone:
            NSLog(@"NSStreamEventNone");
            break;
        case NSStreamEventOpenCompleted:
            NSLog(@"NSStreamEventOpenCompleted");
            break;
        case NSStreamEventHasBytesAvailable:

            NSLog(@"NSStreamEventHasBytesAvailable");

            [self readDataFromStream];

            break;

        case NSStreamEventHasSpaceAvailable:


            NSLog(@"NSStreamEventHasSpaceAvailable");


            soapMessage=[soapMessage stringByAppendingString:[NSString stringWithFormat:@"<subscribe channel=\"table-bc7ire5oi4uhetfd\" ><player id=\"%@\" />",socketValue ]];

           // soapMessage=[soapMessage stringByAppendingString:[NSString stringWithFormat:@"<subscribe channel=\"table-bc7ire5oi4uhetfd\" ><player id= \"c2da1a80c52542dd\" />" ]];




            soapMessage =[soapMessage stringByAppendingString:[NSString stringWithFormat:@"<sessionid id=\"%@\"",socketname]];

            soapMessage =[soapMessage stringByAppendingString:[NSString stringWithFormat:@"></sessionid></subscribe>"]];


            NSLog(@"THE STRING IS : %@", soapMessage);


        data = [[NSData alloc] initWithData:[soapMessage dataUsingEncoding:NSASCIIStringEncoding]];


            [self.outputStream write:[data bytes] maxLength:[data length]];


            NSLog(@"THE STRING IS : %@", self.outputStream);



            [self setMWriteData:[NSData dataWithBytes:(__bridge const void*)soapMessage length:

                                 [soapMessage length]]];


            [self writeDataToStream];


         //   <subscribe channel="table-l8i2hq4jo2hjj9ca"><player id="b82fe3c52020494b" /><sessionid id="246421321cc873d080b550bcc555de0e9d9d29d8cba6f243ec56d38c5785"></sessionid></subscribe>

            break;


        case NSStreamEventErrorOccurred:


            NSLog(@"NSStreamEventErrorOccurred");
            NSLog(@"THE ERROR IS : %@", [aStream streamError]);

            break;


        case NSStreamEventEndEncountered:

            break;

        default:

            break;

    }

}
-(void)流:(NSStream*)aStream handleEvent:(NSStreamEvent)事件代码{
//开始记录事件。
//NSString*str=[NSString stringWithFormat:@“%d”,事件代码];
//NSMutableString*subscribeTableString;
NSData*数据;
NSString*soapMessage=[[NSString alloc]init];
开关(事件代码){
案例1:文通:
NSLog(@“NSTRAVENTONE”);
打破
已完成的案例:
NSLog(@“NSSTREATEVENTOPENCOMPLETED”);
打破
案例NSTRAVENTHASBYTES可用:
NSLog(@“nsstreamventhasbytesavailable”);
[自读数据流];
打破
案例NSSTREATEVENTHASSPACE可用:
NSLog(@“NSSTREATEVENTHASSPACE可用”);
soapMessage=[soapMessage stringByAppendingString:[NSString stringWithFormat:@',socketValue]];
//soapMessage=[soapMessage stringByAppendingString:[NSString stringWithFormat:@”“];
soapMessage=[soapMessage stringByAppendingString:[NSString stringWithFormat:@”“];
NSLog(@“字符串为:%@”,soapMessage);
data=[[NSData alloc]initWithData:[soapMessage dataUsingEncoding:NSASCIIStringEncoding]];
[self.outputStream write:[数据字节]maxLength:[数据长度]];
NSLog(@“字符串为:%@”,self.outputStream);
[self-setMWriteData:[NSData dataWithBytes:(uu bridge const void*)soapMessage长度:
[soapMessage长度]]];
[自写tatostream];
//   
打破
发生错误的案例:
NSLog(@“NSSTREATEVENTERROCCURED”);
NSLog(@“错误为:%@,[aStream streamError]);
打破
案件被驳回:
打破
违约:
打破
}
}

如果我没有弄错的话,SOAP是基于HTTP协议的,因此不能使用原始套接字。如果您确实需要SOAP,可以参考此问题:

但是,如果您的意思只是通过原始套接字发送XML,那么您需要告诉接收者何时停止读取

HTTP结束流的方式是将
\r\n\r\n
添加到字符串的末尾,因此您可以使用它

另一种方法是发送一个包含要发送字节数的4字节头,因此添加以下内容(未测试):

在此之前

[self.outputStream write:[data bytes] maxLength:[data length]];
服务器需要意识到这一点,并将前4个字节视为头,然后读取头中提到的字节数


我认为如果服务器遇到
\r\n\r\n

时停止读取,那么使用HTTP方法会更容易。您可以尝试使用名为SocketRocket的替代方法。这对我很有效。谢谢你的回复。我试过了,但没有得到回应。我正在努力解决如何向服务器发送soap请求……感谢您的回复。。现在我从服务器得到了以下响应
[self.outputStream write:[data bytes] maxLength:[data length]];