Я новичок в программировании сокетов (особенно в asyncsockets).
Я использовал этот учебник http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class для получения AsynSocketserver
(мой клиент использует синхронные сокеты)
В основном это работает. Клиент может подключиться к серверу, отправить некоторые данные и вернуть их обратно.
У меня есть этот код (в классе SocketListener
) для приема данных (без эха):
private void ProcessReceive(SocketAsyncEventArgs e) {
//check if remote host closed the connection
if (e.BytesTransferred > 0) {
if (e.SocketError == SocketError.Success) {
Token token = e.UserToken as Token;
token.SetData(e);
Socket s = token.Connection;
if (s.Available == 0) {
token.ProcessData(e);
}
bool IOPending = s.ReceiveAsync(e);
if (!IOPending) {
ProcessReceive(e);
}
//echo back
/* if (s.Available == 0) {
//set return buffer
token.ProcessData(e);
if (!s.SendAsync(e)) {
this.ProcessSend(e);
}
} else if (!s.ReceiveAsync(e)) {
this.ProcessReceive(e);
}*/
} else {
this.ProcessError(e);
}
} else {
this.CloseClientSocket(e);
}
}
private void ProcessSend(SocketAsyncEventArgs e) {
if(e.SocketError == SocketError.Success){
Token token = e.UserToken as Token;
if(!token.Connection.ReceiveAsync(e)){
this.ProcessReceive(e);
}
} else {
this.ProcessError(e);
}
}
Теперь я хочу, чтобы клиент мог подключиться к серверу (возможно, отправить некоторые данные на сервер, но не обязательно, чтобы клиент сначала отправил на сервер некоторые данные, ему нужно только подключиться к серверу) и что клиент могут получать некоторые данные с сервера.
Проблема: я понятия не имею, где и как использовать socketEventArgs.senAsync() -method, не получая данные раньше.
В настоящее время я использую send() -method в Token-Class, который создает новый объект AsyncEventArgs и использует (в токене) сохраненное соединение для отправки данных:
public void send() {
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.UserToken = this;
args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
connection.SendAsync(args);
}
он работает, но это, кажется, неправильный подход.
Итак, как я могу отправить данные клиенту с открытым соединением, не получая сначала данные от клиента?
Для меня единственное, что "неправильно" в том, что вы не проверяете возвращаемое значение SendAsync
(он мог бы вернуться синхронно, особенно в случае сбоя), - и у вас нет подписки на событие Completed
, поэтому при синхронном или асинхронном вы не сможете обнаружить сбой. Кроме того, возможно, возможно (и, конечно же, желательно) повторно использовать экземпляр SocketAsyncEventArgs
, а не новый для каждой отправки.
Но принципиально: отлично. На самом деле вы можете отправить сообщение в любой момент.