Сенсорная какао платформа для разговора с сокетом TCP? [закрытый]

Между тем я нашел более или менее случайное решение, поэтому я дам его здесь, если кому-то еще может быть интересно: В SelectCommd я использую «@ column1» в качестве параметра. В секции SelectParamter имя параметра должно быть «column1» (без @):

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:myConnectionString %>"
ProviderName="Npgsql"
SelectCommand="SELECT column2 from myTable where column1 = @column1)">
 <SelectParameters>
  <asp:Parameter Name="column1" Type="String"/>
 </SelectParameters>
</asp:SqlDataSource>

Его по-прежнему невозможно выполнить «схему обновления» с компонентом sqldatasource (все еще получая ошибку), но теперь оператор select отлично работает во время выполнения, т. е. представление сетки на основе sqldatasource отображает выбранные данные по мере необходимости.

9
задан Coocoo4Cocoa 11 April 2009 в 15:02
поделиться

6 ответов

http://code.google.com/p/cocoaasyncsocket/

Это то, что вы хотите.

15
ответ дан 4 December 2019 в 06:30
поделиться

Грубо говоря, поднимаясь вверх по стеку, вы получаете:

  • сокеты BSD
  • CFSocket
  • CFReadStream / CFWriteStream / NSInputStream / NSOutputStream
  • CFHTTPStream
  • NSURLConnection

Звучит так, как будто вы хотите CFSocket или, возможно, CFStream.

6
ответ дан 4 December 2019 в 06:30
поделиться

Вы проверили разъемы BSD в сетевом руководстве Cocoa-Touch ?

2
ответ дан 4 December 2019 в 06:30
поделиться

Вот пример кода из ранее упомянутого кода AsyncSocket , который я преобразовал в класс под названием SocketCommunicationManager.

Несколько замечаний:

  • Наши сообщения разделяются символами новой строки (\ n), поэтому при чтении данных из сокета я должен был убедиться, что использовал правильную константу из класса AsyncSocket (LFData в нашем случае ). AsyncSocket также предоставляет CRLFData, CRData и ZeroData в качестве предопределенных разделителей сообщений.
  • Я настроил SocketCommunicationManager так, чтобы он всегда ждал входящего сообщения после того, как я получил и обработал предыдущее. Для этого я использовал (void) readDataToData: (NSData *) data withTimeout: (NSTimeInterval) timeout tag: (long) tag метод.Этот метод будет ждать, пока данные не будут записаны в сокет, прочитает до указанного разделителя, а затем вызовет метод делегата (void) onSocket: (AsyncSocket *) sock didReadData: (NSData *) data withTag: (long) tag;
  • SocketCommunicationManager использует NSNotificationCenter для публикации любых сообщений, полученных от сокета. Эти сообщения называются kNotification, и сообщение помещается в словарь userInfo с помощью ключа kNotificationMessage.
  • Все, что читается из сокета, упаковывается в объект NSData, поэтому вам придется декодировать эти данные после их получения.

Вот код:

#import <Foundation/Foundation.h>

extern NSString * const kNotification;
extern NSString * const kNotificationMessage;

@class AsyncSocket;

@interface SocketCommunicationManager : NSObject {
    AsyncSocket *socket;
    BOOL isRunning;
    NSNotificationCenter* notificationCenter;
}

@property (readwrite, assign) BOOL isRunning;

- (void)connectToHost:(NSString *)hostName onPort:(int)port;
- (void)sendMessage:(NSString *)message;
- (void)disconnect;

@end


#import "SocketCommunicationManager.h"
#import "AsyncSocket.h"

NSString * const kNotification = @"kNotification";
NSString * const kNotificationMessage = @"kNotificationMessage";

@implementation SocketCommunicationManager

@synthesize isRunning;

- (id) init {
    if (!(self = [super init]))
        return nil;

    socket = [[AsyncSocket alloc] initWithDelegate:self];
    [self setIsRunning:NO];
    notificationCenter = [NSNotificationCenter defaultCenter];

    return self;
}

- (void)connectToHost:(NSString *)hostName onPort:(int)port {
    if (![self isRunning]) {
        if (port < 0 || port > 65535)
            port = 0;

        NSError *error = nil;
        if (![socket connectToHost:hostName onPort:port error:&error]) {
            NSLog(@"Error connecting to server: %@", error);
            return;
        }

        [self setIsRunning:YES];
    } else {
        [socket disconnect];
        [self setIsRunning:false];
    }
}

- (void)disconnect {
    [socket disconnect];
}

- (void)dealloc {
    [super dealloc];
    [socket disconnect];
    [socket dealloc];
}

- (void)sendMessage:(NSString *)message {
    NSString *terminatedMessage = [message stringByAppendingString:@"\r\n"];
    NSData *terminatedMessageData = [terminatedMessage dataUsingEncoding:NSASCIIStringEncoding];
    [socket writeData:terminatedMessageData withTimeout:-1 tag:0];
}

#pragma mark AsyncSocket Delegate

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
    NSLog(@"Connected to server %@:%hu", host, port);
    [sock readDataToData:[AsyncSocket LFData] withTimeout:-1 tag:0];
}

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    NSData *truncatedData = [data subdataWithRange:NSMakeRange(0, [data length] - 1)];
    NSString *message = [[[NSString alloc] initWithData:truncatedData encoding:NSASCIIStringEncoding] autorelease];

    if (message)
        NSLog(@"%@", message);
    else
        NSLog(@"Error converting received data into UTF-8 String");

    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:message forKey:kNotificationMessage];
    [notificationCenter postNotificationName:kNotification object:self userInfo:userInfo];

    [sock readDataToData:[AsyncSocket LFData] withTimeout:-1 tag:0];
}

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {
    [sock readDataToData:[AsyncSocket LFData] withTimeout:-1 tag:0];
}

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err {
    NSLog(@"Client Disconnected: %@:%hu", [sock connectedHost], [sock connectedPort]);
}


@end
13
ответ дан 4 December 2019 в 06:30
поделиться

Как указывает Дженерич вне, Cocoa Async Socket Framework это путь. Это было вокруг некоторое время и видел много пользы. http://code.google.com/p/cocoaasyncsocket/

1
ответ дан 4 December 2019 в 06:30
поделиться

Как указал Genericrich, класс AsyncSocket просто замечательно подходит для работы с сокетами. http://code.google.com/p/cocoaasyncsocket/

0
ответ дан 4 December 2019 в 06:30
поделиться