c++ - Angular 8 上的 Websocket 客户端和 C++ 控制台中的服务器
问题描述
我正在尝试使用 websockets 将我的 Angular 应用程序连接到 c++ 控制台应用程序。
我制作了一个 websocket 服务器作为 c++ 控制台应用程序。代码如下:
#include <future>
#include <iostream>
#include "demo.h"
using namespace std;
int main()
{
WSADATA wsa_data;
SOCKADDR_IN server_addr, client_addr;
WSAStartup(MAKEWORD(2, 2), &wsa_data);
const auto server = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5555);
::bind(server, reinterpret_cast<SOCKADDR*>(&server_addr), sizeof(server_addr));
listen(server, 0);
cout << "Listening for incoming connections..." << endl;
int client_addr_size = sizeof(client_addr);
for (;;)
{
SOCKET client;
if ((client = accept(server, reinterpret_cast<SOCKADDR*>(&client_addr), &client_addr_size)) != INVALID_SOCKET)
{
auto fut = async(launch::async, on_client_connect, client);
}
const auto last_error = WSAGetLastError();
if (last_error > 0)
{
cout << "Error: " << last_error << endl;
}
}
}
void on_client_connect(SOCKET client)
{
char buffer[1024];
cout << "Client connected!" << endl;
recv(client, buffer, sizeof(buffer), 0);
cout << "Client says: " << buffer << endl;
memset(buffer, 0, sizeof(buffer));
closesocket(client);
cout << "Client disconnected." << endl;
}
然后我使用了这里的教程https://tutorialedge.net/typescript/angular/angular-websockets-tutorial/#:~:text=WebSockets%20in%20Angular,perfect%20for%20working%20with%20WebSockets。并制作了一个 WebsocketService 来连接我的 c++ 应用程序。代码如下:
import { Injectable } from "@angular/core";
import * as Rx from "rxjs/Rx";
@Injectable()
export class WebsocketService {
constructor() {}
private subject: Rx.Subject<MessageEvent>;
public connect(url): Rx.Subject<MessageEvent> {
if (!this.subject) {
this.subject = this.create(url);
console.log("Successfully connected: " + url);
}
return this.subject;
}
private create(url): Rx.Subject<MessageEvent> {
let ws = new WebSocket(url);
let observable = Rx.Observable.create((obs: Rx.Observer<MessageEvent>) => {
ws.onmessage = obs.next.bind(obs);
ws.onerror = obs.error.bind(obs);
ws.onclose = obs.complete.bind(obs);
return ws.close.bind(ws);
});
let observer = {
next: (data: Object) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(data));
}
}
};
return Rx.Subject.create(observer, observable);
}
}
import { Injectable } from "@angular/core";
import { Observable, Subject } from "rxjs/Rx";
import { WebsocketService } from "./websocket.service";
const CHAT_URL = "ws://localhost:5555/";
export interface Message {
author: string;
message: string;
}
@Injectable()
export class ChatService {
public messages: Subject<Message>;
constructor(wsService: WebsocketService) {
this.messages = <Subject<Message>>wsService.connect(CHAT_URL).map(
(response: MessageEvent): Message => {
let data = JSON.parse(response.data);
return {
author: data.author,
message: data.message
};
}
);
}
}
我在这里的一个组件中使用它:
import { Component, OnInit, ViewChild, ElementRef, OnDestroy } from '@angular/core';
import { ChatService } from 'src/app/chat.service';
import { WebsocketService } from "src/app/websocket.service";
@Component({
selector: 'app-translations',
templateUrl: './translations.component.html',
styleUrls: ['./translations.component.scss'],
providers: [WebsocketService, ChatService]
})
export class TranslationsComponent implements OnInit {
constructor(private chatService: ChatService) {
chatService.messages.subscribe(msg => {
console.log("Response from websocket: " + msg);
});
}
private message = {
author: "",
message: "this is a test message"
};
sendMsg() {
console.log("new message from client to websocket: ", this.message);
this.chatService.messages.next(this.message);
this.message.message = "";
}
ngOnInit(){}
}
在我发送任何内容之前,我的客户端已断开连接,并且在控制台中我得到了这个:
有人在 C++ 控制台应用程序和 Angular 之间做过 websockets 吗?你能帮我解决这个话题吗?
谢谢
解决方案
推荐阅读
- rundeck - Rundeck Oracle 集成:ORA-00904:“TRUE”:标识符无效
- node.js - Dialogflow:在 Dialogflow 中使用实现库 (node.js) 设置多个上下文
- python - Pandas:根据随机采样后列表中存在的值附加所有行值
- python - 是否可以使用 pytesseract 从图像的特定部分提取文本
- c# - Fiddler 显示 404 但网站正在加载
- vue.js - vue中如何使用脚本
- python - 用户选择选项后,有什么方法可以将其链接回菜单
- reactjs - 使用@testing-library/user-event 进行测试以选择多个选项不会在“onChange”回调中发送正确的值?
- ignite - 工作窃取配置在 Apache Ignite 中不起作用
- machine-learning - 困惑的学生 ft. 机器学习