Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Saulo

WebSocket

Mensagens Recomendadas

Saulo

Ola a todos.

Estou a ter algumas dificuldades num projecto e gostava de saber se alguém me consegue iluminar quanto ao assunto com alguma solução/conselho.

A situação é a seguinte:

Tenho um Socket local a funcionar para fazer gestão de ficheiros e outros (vamos chamar-lhe LocalSocket). Apresento a seguir o protótipo. O código está limpo, com o objectivo apenas de conseguir enviar e receber (de forma assíncrona) alguns conjuntos de dados (bytes).

Draft do LocalSocket:

#include "stdafx.h"

using namespace System;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Threading;
using namespace System::Text;

ref class TcpServer
{
public:
void ProcessThread(Object ^clientObj);
void SenderThread(Object ^clientObj);
};

//Receiver
void TcpServer::ProcessThread(Object ^clientObj)
{
Socket^ client = (Socket^)clientObj;
IPEndPoint^ clientEP = (IPEndPoint^)client->RemoteEndPoint;
Console::WriteLine("Connected on IP: {0} Port: {1}", clientEP->Address, clientEP->Port);

array<unsigned char>^ msg = Encoding::ASCII->GetBytes(
	String::Format("Successful connection to the server on port {0} :: Receiver Service",
										clientEP->Port));
client->Send(msg);

//**____**//
//**____**//

int rcv;
while (true)
{
	msg = gcnew array<unsigned char>(548);

/*HERE*/			if ((rcv = client->Receive(msg)) == 0)
		{	break;	}

		Console::WriteLine("Port[{0}] {1}",
							clientEP->Port, 
							Encoding::ASCII->GetString(msg, 0, rcv));
	try{	}
	catch(Exception ^e)
	{Console::WriteLine("erro: {0}",e->Message->ToString());}
/*		client->Send(msg, rcv, SocketFlags::None);*/
}

client->Close();

Console::WriteLine("Connection to IP: {0} Port {1} closed.",
					clientEP->Address, 
					clientEP->Port);
}

//Sender
void TcpServer::SenderThread(Object ^clientObj)
{
Socket^ client = (Socket^)clientObj;
IPEndPoint^ clientEP = (IPEndPoint^)client->RemoteEndPoint;
//Console::WriteLine("Connected on IP: {0} Port: {1}", clientEP->Address, clientEP->Port);

array<unsigned char>^ msg = Encoding::ASCII->GetBytes(
			String::Format("Successful connection to the server on port {0} :: Sender Service",
			clientEP->Port));
client->Send(msg);

while (true)
{
	String^ input = Console::ReadLine();
	msg = Encoding::ASCII->GetBytes(input);
	client->Send(msg, msg->Length, SocketFlags::None);
	//Console::WriteLine(Encoding::ASCII->GetString(msg, 0, rcv));
}
}

//MAIN
void main( void)
{
TcpServer^ server = gcnew TcpServer();
Socket^ tcpListener = gcnew Socket( AddressFamily::InterNetwork,
									SocketType::Stream, 
									ProtocolType::Tcp);

IPEndPoint^ iped = gcnew IPEndPoint(IPAddress::Any, 50001);
tcpListener->Bind(iped);
tcpListener->Listen((int)SocketOptionName::MaxConnections);

while(true)
{
	Console::WriteLine("Waiting for client connection.");
	Socket^ client = tcpListener->Accept();

	Thread ^receiver = gcnew Thread( gcnew ParameterizedThreadStart(server, &TcpServer::ProcessThread ));
	receiver->Start(client);

	Thread ^sender = gcnew Thread( gcnew ParameterizedThreadStart(server, &TcpServer::SenderThread ));
	sender->Start(client);
}
}

Tendo isto feito, o meu problema está em criar uma página com um WebSocket que consiga comunicar com o exemplo anterior. Tenho tentado fazer esse socket com Javascript/Jquery... parece-me o mais razoável, mas não tem funcionado muito bem. Primeiro porque as API nativas de WebSocket só estão desbloqueadas no Google Chrome (era preferencial que funcionasse em todos ou, no mínimo, em firefox). Depois porque apesar de conseguir ligar o WebSocket ao LocalSocket segue-se um encerramento da sessão (não compreendo porquê) ou um erro no LocalSocket quando recebe pacotes, dependendo da condição da linha 38 estar comentado ou não (ver: /*HERE*/ do código; código descomentado provoca erro).

Se alguém já tiver trabalhado antes com WebSockets ou conhecer uma forma alternativa de estabelecer a comunicação (seja de forma síncrona ou assíncrona) eu ficaria muito agradecido se partilhassem a solução.

Desde já agradeço toda a ajuda

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não confundas sockets com webservices ou xmlHttpRequests ....

sockets como disseste bem serve para criar ligações e enviar dados, mas o que consegues criar com o javascript é um xmlHttpRequest que requer uma comunicação sobre o protocolo Http

em vez de criar um socket no teu código c#, cria sim um webservice


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Saulo

hmm certo. tou a aprender :D

Mas quanto ao socket, preciso mesmo que seja socket e de usar C nativo por causa de algumas bibliotecas que terei que usar mais tarde (daí estar em C++CLI o socket).

Quais alternativas tenho para resolver? Web nao é muito o meu ambiente, nao conheço bem as possíveis soluções.

------------------------------------------

EDIT:

Obrigado a quem respondeu. Tenho também a informar que, sim, WebSockets podem ser ligados directamente a sockets (sendo necessário para isso implementar o protocolo manualmente, salvo APIs que se possam encontrar).

Para o caso de haver interessados podem consultar as seguintes páginas:

- Protocolo, https://tools.ietf.org/html/rfc6455#section-10.8

- Apresentação da Kaazing, https://docs.google.com/viewer?url=http://kaazingcorp.cachefly.net/com/file/Kaazing-WP-WebSocket-Security-Oct-2011.pdf

- Artigo da WebSockets.org, http://websocket.org/quantum.html

Devo dizer que o trabalho que dá a implementar é compensado pelas características que este tipo de comunicação apresenta.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DanielAmorim

Os Websockets é o que está na berra em termos de desenvolvimento web.

A Kaazing é uma das pioneiras na área, mas neste momento o maior player nessa área penso que é uma empresa portuguesa, a IBT. Dá uma vista de olhos aos sites http://www.realtime.co e http://www.xrtml.org/ :(


Daniel Amorim

VP for xRTML

http://www.xrtml.org http://www.realtime.co

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Saulo

Boas.

Daniel obrigado pelos links, não conhecia e está muito interessante de facto :(.

Para os menos crentes, fica aí uma amostra do q com meia dúzia de linhas de código (do lado da página web como cliente) e umas 2 dúzias delas do lado servidor é possível por um socket regular a falar com um WebSocket.

websocketchatconcepttes.png

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Saulo

eu e um colega demos uma vista de olhos nelas por alto, mas não me pareceram ser compatíveis com c++cli, são?

a aplicação que tenho que implementar precisa mesmo de código nativo unmanaged, o mais alto que consigo chegar sem criar conflitos é o c++cli... o servidor não corre sobre a web :S.

Mas obrigado pelas sugestões, vou voltar a passar os olhos nelas, um pouco melhor ;).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Saulo

pois, foi o que pareceu então.

O cgi... estamos a considerar essa hipótese, mas a construção da interface do servidor "caseira" em c++ está a correr bem. Além do mais não tenho prática nem grandes conhecimentos em cgi... por isso, só se for mesmo necessário é que vou meter-me a estudar disso. xD

já agora, conheces mais alguma iniciativa que apresente APIs livres? há umas APIs interessantes que encontras facilmente na net, mas o mais próximo de c++ que encontrei foi a criada para o Arduino (uC).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.