Проблема связи с сокетом TCP - PullRequest
1 голос
/ 06 марта 2012

Я новичок в программировании на iOS - и мне нужна небольшая помощь в решении моей проблемы ... Я потратил много часов, пытаясь найти решение этой проблемы, но безуспешно ...

Я пишу очень простое приложение (на iPad), которое будет отправлять несколько команд TCP на мой сервер. Сервер уже настроен и работает правильно. Я могу подключиться к нему с помощью pTerm на своем iPad, и после успешного подключения через RAW TCP или telnet я могу отправить запрос на свой сервер в следующем виде:

#100 введите

и это работает ..

Но когда я пытаюсь сделать это в своем приложении - это не работает, кажется, это проблема с информацией о конце строки для сервера (обычно это делается нажатием клавиши enter ). Сервер настроен на 192.168.1.220, порт 2000.

После нажатия кнопки сброса он должен отправить команду на сервер - но я ничего не вижу на стороне сервера ...

Мой .h файл выглядит так:

#import <UIKit/UIKit.h>

NSInputStream *inputStream;
NSOutputStream *outputStream;

@interface ViewController : UIViewController <NSStreamDelegate>

@property (weak, nonatomic) IBOutlet UIButton *resetbutton;
@property (strong, nonatomic) IBOutlet UIView *viewController;
- (IBAction)resetbuttonclick:(id)sender;

@end

мой .m файл:

#import "ViewController.h"
@interface ViewController ()
@end


@implementation ViewController
@synthesize resetbutton;
@synthesize viewController;

- (void) viewDidLoad
{
    [self initNetworkCommunication];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void) viewDidUnload
{
    [self setViewController:nil];
    [self setResetbutton:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
   return YES;
}

- (void)initNetworkCommunication
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.1.220", 2000, &readStream, &writeStream);
    inputStream = objc_unretainedObject(readStream);
    outputStream = objc_unretainedObject(writeStream);
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];
}

- (void)sendMessage
{
    NSString *response  = [NSString stringWithFormat:@"#100\n"];
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
    [outputStream write:[data bytes] maxLength:[data length]];
}

- (IBAction)resetbuttonclick:(id)sender
{
    [self initNetworkCommunication];
    [self sendMessage];
}

@end

Большое спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Вы инициируете соединение два раза, удалите строку [self initNetworkCommunication]; из метода resetbutonclick.

0 голосов
/ 02 января 2013

Может быть, вы можете избежать таких проблем, используя дополнительную библиотеку? (абстракция сверху) Я использую CocoaAsyncSocket . Это очень просто и комфортно.

0 голосов
/ 06 марта 2012

Одна вещь, которую сразу замечаешь, это то, что у тебя нет потоковых хедлеров - что странно.Откуда вы знаете, что соединение установлено?

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

Код в Сетевое программирование iPhone протестировано и работает, если вы хотите прочитать черезстатьи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...