導航:首頁 > IDC知識 > netty伺服器

netty伺服器

發布時間:2020-08-14 15:05:16

1、如何使用Netty開發實現高性能的RPC伺服器

方法: 1。 改表法。可能是你的帳號不允許從遠程登陸,只能在localhost。這個時候只要在localhost的那台電腦,登入mysql後,更改 "mysql" 資料庫里的 "user" 表裡的 "host" 項,從"localhost"改稱"%" mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = '%' where user = 'root';mysql>select host, user from user; 2. 授權法。例如,你想myuser使用mypassword從任何主機連接到mysql伺服器的話。

2、netty伺服器在接收消息後,怎麼向另一台伺服器傳遞消息

第一種,netty伺服器接收到消息後,在channelRead方法里可以在起一個客戶端,通過這個客戶端向另一台伺服器傳遞消息。第二種,創建一個消息中轉的類,這個類可以接收消息,然後創建一個netty客戶端再將消息中轉類的消息傳遞給另一台伺服器。兩種都可以,只是第一種是內置客戶端,個人覺得第二種更靈活,不過我在做的時候採用的是第一種方法。

3、基於Netty開發的游戲伺服器,是如何做到分布式管理呢?

看你是什麼游戲了,不同的游戲其伺服器分布式的實現方式也不相同。

4、netty框架做游戲伺服器怎麼樣

如果你指的是單機的話,不說Netty會怎麼樣,伺服器都有可能直接崩潰掉,你的算一下,按平均每鏈接傳輸數據1K,100W鏈接大概數據量會在1G左右,G級伺服器網卡也受不了的,我們在網路編程中對單機來講,成功解決了C10K的問題,這種M級別的鏈接,可能暫時解決不了。對於如此大的並發,一般我們都是通過負載均衡的方式進行處理,如新浪微博,同時在線100W以上,通過約100多個節點處理,每個節點也就才10000並發左右。

5、一般普通的netty伺服器能支撐多少個長連接

netty本身實現的長連接,就是一個連接一個worker。worker的數量是有限的(通常是cpucores+1),所以你的伺服器要是連接數多的話,得考慮使用「非同步」Request(netty的http沒實現這么個功能),或者說「Continuation」,當連接「無事可做」的時候,放棄線程的使用權,當要處理事務的時候,才重新拿到一個線程。當然,如果你只想實現長連接而不在意request一直佔有worker,那麼你只要不放棄連接就可以了(websocket本身也是一種長連接,netty裡面有websocket的例子)。

6、netty 實現的伺服器 怎麼和c++客戶端進行通訊

C++通過socket編程實現服務端與客戶端的通訊,代碼如下(個人環境下測試正常,如果遇到運行send發送報錯,請檢查伺服器埠是否被佔用,調試的時候請先運行服務端程序在運行客服端,一定要載入庫函數ws2_32.lib,發送字元時應該多加一個空字元作為結束字元):
伺服器端程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

// Server.cpp : Defines the entry point for the console application.
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
const int BUF_SIZE = 64;
WSADATA wsd; //WSADATA變數
SOCKET sServer; //伺服器套接字
SOCKET sClient; //客戶端套接字
SOCKADDR_IN addrServ;; //伺服器地址
char buf[BUF_SIZE]; //接收數據緩沖區
char sendBuf[BUF_SIZE];//返回給客戶端得數據
int retVal; //返回值
//初始化套結字動態庫
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
cout << "WSAStartup failed!" << endl;
return 1;
}

//創建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
cout << "socket failed!" << endl;
WSACleanup();//釋放套接字資源;
return -1;
}

//伺服器套接字地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(4999);
addrServ.sin_addr.s_addr = INADDR_ANY;
//綁定套接字
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
cout << "bind failed!" << endl;
closesocket(sServer); //關閉套接字
WSACleanup(); //釋放套接字資源;
return -1;
}

//開始監聽
retVal = listen(sServer, 1);
if(SOCKET_ERROR == retVal)
{
cout << "listen failed!" << endl;
closesocket(sServer); //關閉套接字
WSACleanup(); //釋放套接字資源;
return -1;
}

//接受客戶端請求
sockaddr_in addrClient;
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
if(INVALID_SOCKET == sClient)
{
cout << "accept failed!" << endl;
closesocket(sServer); //關閉套接字
WSACleanup(); //釋放套接字資源;
return -1;
}

while(true)
{
//接收客戶端數據
ZeroMemory(buf, BUF_SIZE);
retVal = recv(sClient, buf, BUF_SIZE, 0);
if (SOCKET_ERROR == retVal)
{
cout << "recv failed!" << endl;
closesocket(sServer); //關閉套接字
closesocket(sClient); //關閉套接字
WSACleanup(); //釋放套接字資源;
return -1;
}
if(buf[0] == '0')
break;
cout << "客戶端發送的數據: " << buf <<endl;

cout << "向客戶端發送數據: " ;
cin >> sendBuf;

send(sClient, sendBuf, strlen(sendBuf), 0);
}

//退出
closesocket(sServer); //關閉套接字
closesocket(sClient); //關閉套接字
WSACleanup(); //釋放套接字資源;

return 0;
}

客戶端程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

#include "winsock2.h"
#include <iostream>
#pragma comment(lib, "ws2_32.lib")

using namespace std;
BOOL RecvLine(SOCKET s, char* buf); //讀取一行數據

int main(int argc, char* argv[])
{
const int BUF_SIZE = 64;

WSADATA wsd; //WSADATA變數
SOCKET sHost; //伺服器套接字
SOCKADDR_IN servAddr; //伺服器地址
char buf[BUF_SIZE]; //接收數據緩沖區
char bufRecv[BUF_SIZE];
int retVal; //返回值
//初始化套結字動態庫
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
cout << "WSAStartup failed!" << endl;
return -1;
}
//創建套接字
sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sHost)
{
cout << "socket failed!" << endl;
WSACleanup();//釋放套接字資源
return -1;
}

//設置伺服器地址和埠
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servAddr.sin_port = htons((short)4999);
int nServAddlen = sizeof(servAddr);

//連接伺服器
retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
{
cout << "connect failed!" << endl;
closesocket(sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
while(true)
{
//向伺服器發送數據
ZeroMemory(buf, BUF_SIZE);
cout << " 向伺服器發送數據: ";
cin >> buf;
retVal = send(sHost, buf, strlen(buf), 0);
if (SOCKET_ERROR == retVal)
{
cout << "send failed!" << endl;
closesocket(sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
//RecvLine(sHost, bufRecv);
ZeroMemory(bufRecv, BUF_SIZE);
recv(sHost, bufRecv,BUF_SIZE , 0); // 接收伺服器端的數據, 只接收5個字元
cout << endl <<"從伺服器接收數據:"<< bufRecv;
cout<<"\n";
}
//退出
closesocket(sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return 0;
}

7、使用netty做伺服器佔用CPU較高,求破

最主要還是看看handler吧。當前這些還真看不出問題。

8、如何構建一個基於netty的後端伺服器

HttpRequestHandler -- HTTP請求處理類
TextWebSocketFrameHandler -- 對應Text消息的處理類
WebSocketServer -- 系統主類
WebSocketServerInitializer -- 服務主程序的初始化類
WebSocketServer 類代碼:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public final class WebSocketServer {
private int port = 0;
public WebSocketServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new WebSocketServerInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);

System.out.println("WebsocketChatServer 啟動了");
// 綁定埠,開始接收進來的連接
ChannelFuture f = b.bind(port).sync();
// 等待伺服器 socket 關閉 。在這個例子中,這不會發生,但你可以優雅地關閉你的伺服器。
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
System.out.println("WebsocketChatServer 關閉了");
}
}

9、netty 伺服器收不到數據,為什麼

很有可能,我程序編碼是utf-8,通過電腦cmd終端telnet之後發,伺服器端一直收不到請求。終端不是utf-8編碼。在同一個程序中用netty客戶端發,netty伺服器可以收到

10、使用Netty作為業務伺服器與Tomcat相比有何優勢

netty只是把實現了http協議的伺服器

與netty伺服器相關的知識