netty伺服器搭建
❶ 怎麼用netty搭建一個websocket的java客戶端
我不知道你想用websocket實現什麼樣的功能,一般配合HTML5的話websocket可以解決服務端和客戶端消息實時傳遞的問題,如消息推送(web這種)。它的初始連接是http轉成websocket連接。 實現的話要做兩件事,一端是在伺服器實現service
❷ 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;
}
❸ 怎麼搭建netty業務應用場景
下面將分析手頭上一個項目,運用的技術很全,值得學習,先做一個簡單介紹,當然業務部分代碼就不講了。
整個工程採用maven來管理,主要的技術是spring+jedis+netty+disruptor.看這個組合,這個伺服器端性能應該很不錯。
這個工程又引發我對技術無限熱愛 ,哈哈。
這
個工程,目前主要是針對一些基於json/xml/text格式的請求,同時也是支持標准手機請求的,當然,可以自定義一些其他格式或者pc端的請求,而
且針對不同URI,後面掛了不同的handler,這些可能都是一些web處理的基本思想,只是脫離了常規的web容器或者應用伺服器。
xml工具採用xstram來處理,兩個字,方便。
json工具採用jackson\不知道和業界出名的fastjson\gson\sf.json有何區別,待鑒定。
客
戶端的請求,統一繼承ClientRequestModel,經過編碼統一轉化為domainMessage,交由disruptor來處理,其實oop
里什麼繼承,實現,封裝思想,大部分都在圍繞一個東西在走,一句話,把看似各有稜角的東西如何轉化為共同的東西,求同存異啊(比如,水,石頭,空氣等,如
果在這一層,我們沒法統一用一個特徵來表示,我們可以先把它轉化為分子,那是不是可以用同一個東西來表示呢看如何高度抽象封裝,這真是一門藝術)。
❹ 一般普通的netty伺服器能支撐多少個長連接
netty本身實現的長連接,就是一個連接一個worker。worker的數量是有限的(通常是cpu cores+1),所以你的伺服器要是連接數多的話,得考慮使用「非同步」Request(netty的http沒實現這么個功能),或者說「Continuation」,當連接「無事可做」的時候,放棄線程的使用權,當要處理事務的時候,才重新拿到一個線程。
當然,如果你只想實現長連接而不在意request 一直佔有worker,那麼你只要不放棄連接就可以了(websocket本身也是一種長連接,netty裡面有websocket的例子)。
❺ 使用netty作為業務伺服器與tomcat相比有何優勢
可以參考各種使用了netty的開源產品,如bbo hadoop。所以能實現更少的資源佔用(CPU, Memory)和單個業務伺服器更高的並發。
❻ 如何構建一個基於netty的後端伺服器
Netty服務端創建
當我們直接使用JDK NIO的類庫開發基於NIO的非同步服務端時,需要使用到多路復用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey等等,相比於傳統的BIO開發,NIO的開發要復雜很多,開發出穩定、高性能的非同步通信框架,一直是個難題。
Netty為了向使用者屏蔽NIO通信的底層細節,在和用戶交互的邊界做了封裝,目的就是為了減少用戶開發工作量,降低開發難度。ServerBootstrap是Socket服務端的啟動輔助類,用戶通過ServerBootstrap可以方便的創建Netty的服務端。
❼ netty4 伺服器 創建後,使用埠 和ip進行 檢測
1:請檢查伺服器是否開啟了並且內網電腦能成功訪問
2:檢查路由器的埠映射的配置是否正確
3:查看自己電腦對應的服務和埠有沒甫紶顛咳郯糾奠穴訂膜有打開!
4:請檢查您是否映射了伺服器所需的所有埠,有可能沒有完全設置訪問伺服器所需的埠,導致訪問失敗。您可以通過開啟「DMZ主機」來檢測一下,是否埠沒有映射完全。若開啟DMZ主機後,能正常訪問伺服器,則可能是埠添加不完全。
5:檢查內網伺服器埠是否和遠程管理的埠沖突
6:服務商可能將相應埠屏蔽導致虛擬伺服器無法訪問,嘗試修改服務埠!
❽ 基於Netty開發的游戲伺服器,是如何做到分布式管理呢
看你是什麼游戲了,不同的游戲其伺服器分布式的實現方式也不相同。
❾ netty框架做游戲伺服器怎麼樣
如果你指的是單機的話,不說Netty會怎麼樣,伺服器都有可能直接崩潰掉,你的算一下,按平均每鏈接傳輸數據1K,100W鏈接大概數據量會在1G左右,G級伺服器網卡也受不了的,我們在網路編程中對單機來講,成功解決了C10K的問題,這種M級別的鏈接,可能暫時解決不了。對於如此大的並發,一般我們都是通過負載均衡的方式進行處理,如新浪微博,同時在線100W以上,通過約100多個節點處理,每個節點也就才10000並發左右。
❿ netty 伺服器收不到數據,為什麼
很有可能,我程序編碼是utf-8,通過電腦cmd終端telnet之後發,伺服器端一直收不到請求。終端不是utf-8編碼。在同一個程序中用netty客戶端發,netty伺服器可以收到