Soup.Websocket 是誓言
Soup.Websocket on Vala
我写了一个客户端和服务器来测试。客户:
static Soup.WebsocketConnection websocket;
int main (string[] args)
{
var ws_session = new Soup.Session();
var ws_message = new Soup.Message("GET", "http://127.0.0.1:8088/");
string[] protocols = {"chat"};
var ws_loop = new MainLoop();
ws_session.websocket_connect_async.begin(ws_message, "localhost", protocols, null, (obj, res) => {
websocket = ws_session.websocket_connect_async.end(res);
websocket.message.connect(rec_message);
});
ws_loop.run();
stdout.printf("Program end. Press ENTER"); // the program does not reach this point
stdin.read_line();
websocket.close(0, null);
return 0;
}
void rec_message(int type, Bytes message){
stdout.printf("WebSock receive:\n");
stdout.printf("%s\n".printf((string)message.get_data()));
websocket.send_text("test_message2"); // client does not send message
}
和服务器:
public class WSServer : Soup.Server {
private int access_counter = 0;
public WSServer(){
assert (this != null);
string[] protocols = {"chat"};
this.add_websocket_handler(null,"localhost", protocols, get_ws);
}
void get_ws(Soup.Server server, Soup.WebsocketConnection connection, string path, Soup.ClientContext client){
connection.message.connect(ws_message);
string host = client.get_host();
info (@"Client connected! Host: $host");
string msg = """test_message1""";
info (@"Sending to client message: $msg");
connection.send_text(msg);
}
void ws_message(int id, Bytes msg){
string message = (string)msg.get_data();
info(@"Message received! ID: $id Message:\n$message\n");
}
}
int main (string[] args)
{
try {
int port = 8088;
MainLoop loop = new MainLoop ();
WSServer server = new WSServer ();
server.listen_local (port, 0);
loop.run ();
} catch (Error e) {
error ("Error: %s\n", e.message);
}
stdout.printf("Programm end. Press ENTER");
stdin.read_line ();
return 0;
}
启动服务器和客户端后,发生第一个消息的连接和交换test_message1
,之后服务器关闭连接,不再接收消息。客户端尝试发送消息 test_message2
然后关闭连接,代码和错误消息:WS Error 44: Error receiving data: Connection reset by peer
总的来说,我的问题的解决方案如下:
- 通过删除
ws_loop.quit();
: 解决了第一个问题
var ws_loop = new MainLoop();
ws_session.websocket_connect_async.begin(ws_message, "localhost", protocols, null, (obj, res) => {
websocket = ws_session.websocket_connect_async.end(res);
websocket.message.connect(rec_message);
//ws_loop.quit(); // this error
});
ws_loop.run();
- 连接被服务器关闭,因为实例
WebsocketConnection
在退出函数 void get_ws(Soup.Server server, Soup.WebsocketConnection connection, string path, Soup.ClientContext client)
时被销毁
我写了一个客户端和服务器来测试。客户:
static Soup.WebsocketConnection websocket;
int main (string[] args)
{
var ws_session = new Soup.Session();
var ws_message = new Soup.Message("GET", "http://127.0.0.1:8088/");
string[] protocols = {"chat"};
var ws_loop = new MainLoop();
ws_session.websocket_connect_async.begin(ws_message, "localhost", protocols, null, (obj, res) => {
websocket = ws_session.websocket_connect_async.end(res);
websocket.message.connect(rec_message);
});
ws_loop.run();
stdout.printf("Program end. Press ENTER"); // the program does not reach this point
stdin.read_line();
websocket.close(0, null);
return 0;
}
void rec_message(int type, Bytes message){
stdout.printf("WebSock receive:\n");
stdout.printf("%s\n".printf((string)message.get_data()));
websocket.send_text("test_message2"); // client does not send message
}
和服务器:
public class WSServer : Soup.Server {
private int access_counter = 0;
public WSServer(){
assert (this != null);
string[] protocols = {"chat"};
this.add_websocket_handler(null,"localhost", protocols, get_ws);
}
void get_ws(Soup.Server server, Soup.WebsocketConnection connection, string path, Soup.ClientContext client){
connection.message.connect(ws_message);
string host = client.get_host();
info (@"Client connected! Host: $host");
string msg = """test_message1""";
info (@"Sending to client message: $msg");
connection.send_text(msg);
}
void ws_message(int id, Bytes msg){
string message = (string)msg.get_data();
info(@"Message received! ID: $id Message:\n$message\n");
}
}
int main (string[] args)
{
try {
int port = 8088;
MainLoop loop = new MainLoop ();
WSServer server = new WSServer ();
server.listen_local (port, 0);
loop.run ();
} catch (Error e) {
error ("Error: %s\n", e.message);
}
stdout.printf("Programm end. Press ENTER");
stdin.read_line ();
return 0;
}
启动服务器和客户端后,发生第一个消息的连接和交换test_message1
,之后服务器关闭连接,不再接收消息。客户端尝试发送消息 test_message2
然后关闭连接,代码和错误消息:WS Error 44: Error receiving data: Connection reset by peer
总的来说,我的问题的解决方案如下:
- 通过删除
ws_loop.quit();
: 解决了第一个问题
var ws_loop = new MainLoop();
ws_session.websocket_connect_async.begin(ws_message, "localhost", protocols, null, (obj, res) => {
websocket = ws_session.websocket_connect_async.end(res);
websocket.message.connect(rec_message);
//ws_loop.quit(); // this error
});
ws_loop.run();
- 连接被服务器关闭,因为实例
WebsocketConnection
在退出函数void get_ws(Soup.Server server, Soup.WebsocketConnection connection, string path, Soup.ClientContext client)
时被销毁