導航:首頁 > 編程語言 > java實現websocket

java實現websocket

發布時間:2023-05-29 04:58:26

java 有什麼比較好的websocket客戶端框架

本文是我在實踐過程中的記錄,我的目標是使用spran-websocket,netty, undertow和node.js四種框架分別實現C1000K的伺服器,看看這幾個框架實現的難以程度,性能如何。開發語言為Scala和Javascript。
當然,談起性能,我們還必須談到每秒每個連接有多少個請求,也就是RPS數,還要考慮每條消息的大小。
一般來說,我們會選取一個百分比,比如每秒20%的連接會收發消息。我的需求是伺服器只是push,客戶端不會主動發送消息。 一般每一分鍾會為這一百萬群發一條消息。
所以實現的測試工具每個client建立60000個websocket連接,一共二十個client。實際不可能使用20台機器,我使用了兩台AWS C3.2xlarge(8核16G)伺服器作為客戶端機。每台機器10個客戶端。
四個伺服器的代碼和Client測試工具代碼可以在github上下載。 (其實不止四種框架了,現在包括Netty, Undertow, Jetty, Spray-websocket, Vert.x 和 Node.js 六種框架的實現)

❷ java怎麼做websocket

package com.bpms.interfaces.communicate.paycode;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import com.unify.cc.common.CommonUtil;
public class SocketSend {
private String host = "11.1.66.193";
private int port = 2345;
private Socket client;
private SocketAddress remoteAddr;
private DataOutputStream os;
private DataInputStream is;
private int overTime = 0;
private int maxChang = 256;
private String error = ""爛賣;

/**
* 只配服務端的地址和埠
* @param host 服務備圓端IP
* @param port 服務端埠
*/
public SocketSend(String host , int port) {
this.host = host;
this.port = port;
}

/**
* 設置連接報文長度的配置
* @param host IP
* @param port 埠
* @param maxChang 指定接收飢滾逗報文長度
*/
public SocketSend(String host , int port , int maxChang) {
this.host = host;
this.port = port;
if(maxChang != 0)
this.maxChang = maxChang;
}

/**
* 設置連接連接超時的配置
* @param host IP
* @param port 埠
* @param maxChang 指定接收報文長度
* @param overTime 連接超時時間
*/
public SocketSend(String host , int port , int maxChang , int overTime) {
this.host = host;
this.port = port;
if(maxChang != 0)
this.maxChang = maxChang;
if(overTime != 0)
this.overTime = overTime;
}

/**
* 初始化參數
* @throws IOException
*/
public void init() throws IOException {
if(client == null)
client = new Socket();
remoteAddr = new InetSocketAddress(host,port); //創建客戶端連接地址
try{
if(overTime != 0) {
client.connect(remoteAddr,overTime);
}
else {
client.connect(remoteAddr);
}
} catch (ConnectException e) {
error = "SocketSend - init ConnectionServicesException";
return;
}
is = new DataInputStream(client.getInputStream()); //獲得服務端輸出流
os = new DataOutputStream(client.getOutputStream()); //獲得服務端輸入流
}

/**
* 關閉連接
* @throws IOException
*/
private void close() throws IOException{
if (os != null) {
os.close();
}
if(is != null) {
is.close();
}
if(client != null) {
client.close(); //關閉連接器
}
}

/**
* 寫入流
*/
public void writeMessage(byte[] byt){
try {
os.write(byt); //在服務端寫入報文
os.flush();
} catch (IOException e) {
CommonUtil.debug("SocketSend - writeMessage 報文寫入異常");
e.printStackTrace();
}
}
/**
* @param message 報文
* @return 返回報文
* @throws IOException , Exception
*/
public byte[] execute(byte[] byt) throws Exception{
init();
byte[] buf = null;
//連接異常不做處理
if("".equals(error)){
writeMessage(byt);
buf = new byte[maxChang];
if (is != null) {
is.read(buf);//讀入數據到緩沖區
}
close();
}else {
close();
throw new Exception(error);
}
return buf;
}
}

❸ 請教JAVA如何實現web下的長連接關鍵後台如何寫

目前web上的消息通訊方式主要有以下幾種。
輪詢,長連接,websocket
輪詢:隔一段時間訪問伺服器,伺服器不管有沒有新消息都立刻返回。
長連接:頁面向伺服器發出請求,由伺服器決定什麼時候返回。(如果有新消息則立刻返回,沒有的話就保持連接,直到有新消息才返回)
websocket:類似Java Socket,由Http請求模擬實現的socket。

要實現長連接的關鍵就是: 由伺服器端決定什麼時候返回數據。比如在servlet中。

doGet(...){
...
Thread.sleep(30000);
return ...
}
這就是一個長連接的例子,只是沒有任何意義而已。

你要做的就是在doGet中阻塞住,
while(!hasNewMsg){
sleep(500)
}
return newMsg...

當然你的ajax超時時間要設置長一點。

如果可以的話,最好可以使用websocket。

❹ WebSocket的簡單實現

WebSocket協議是基於TCP的一種新的網路協議。 瀏覽器通信通常是基於HTTP 協議,為什麼還需要另一個協議?因為http只能由客戶端發起,不能由服務端發起。

而WebSocket 瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。

WebSocket規范

WebSocket 協議本質上是一個基於 TCP 的協議。為了建立一個 WebSocket 連接,客戶端瀏覽器首先要向伺服器發起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息,附加信息如圖所示

連接過程(以js(客戶端)和java(伺服器端)為例)

js:ws.send( String msg) ps:入參可以是字元串或者json字元串java:onMessage(String message)message為客戶端傳來的信息

java:sendUser( String msg) js:ws.onmessage

4.斷開連接 onclose ( CloseReason reason)

CloseReason.CloseCode ( WebSocket關閉連接的狀態碼,類似http的404)

js部分:

java部分(javax實現):

ps: session 用來唯一標絕畢識連接對象

使用註解@ServerEndpoint

參考文獻

javax websocket:(服務端實現api文檔) https://tomcat.apache.org/tomcat-8.0-doc/websocketapi/javax/websocket/package-summary.html

js websocket:(客戶端api文檔) https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

rfc6455 (websocket協議規范)衡宏虛咐燃: https://datatracker.ietf.org/doc/rfc6455/ ** 產品介紹**

❺ 怎樣用java web和websocket實現網頁即時通訊

下面是一個java的多線程的WebServer的例子:

//import java.io.*;
import java.net.*;
//import java.util.*;

public final class WebServer {
public static void main(String argv[]) throws Exception
{
int port = 80;
// Establish the listen socket.
ServerSocket WebSocket = new ServerSocket(port);
while (true) {
// Listen for a TCP connection request.
Socket connectionSocket = WebSocket.accept();
//Construct object to process HTTP request message
HttpRequest request = new HttpRequest(connectionSocket);

Thread thread = new Thread(request); //Create new thread to process

thread.start(); //Start the thread

}
}
}

import java.io.*;
import java.net.*;
import java.util.*;

public final class HttpRequest implements Runnable {

final static String CRLF = "\r\n";//For convenience
Socket socket;

// Constructor
public HttpRequest(Socket socket) throws Exception
{
this.socket = socket;
}

// Implement the run() method of the Runnable interface.
public void run()
{
try {
processRequest();
} catch (Exception e) {
System.out.println(e);
}
}

private void processRequest() throws Exception
{
InputStream is = socket.getInputStream(); //Starts the input from client machine

DataOutputStream os = new DataOutputStream(
socket.getOutputStream());

// Set up input stream filters.

BufferedReader br = new BufferedReader(
new InputStreamReader(is));

String requestLine = br.readLine();

System.out.println(); //Echoes request line out to screen
System.out.println(requestLine);

//The following obtains the IP address of the incoming connection.

InetAddress incomingAddress = socket.getInetAddress();
String ipString= incomingAddress.getHostAddress();
System.out.println("The incoming address is: " + ipString);

//String Tokenizer is used to extract file name from this class.
StringTokenizer tokens = new StringTokenizer(requestLine);
tokens.nextToken(); // skip over the method, which should be 「GET」
String fileName = tokens.nextToken();
// Prepend a 「.」 so that file request is within the current directory.
fileName = "." + fileName;

String headerLine = null;
while ((headerLine = br.readLine()).length() != 0) { //While the header still has text, print it
System.out.println(headerLine);
}

// Open the requested file.
FileInputStream fis = null;
boolean fileExists = true;
try {
fis = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
fileExists = false;
}

//Construct the response message
String statusLine = null; //Set initial values to null
String contentTypeLine = null;
String entityBody = null;
if (fileExists) {
statusLine = "HTTP/1.1 200 OK: ";
contentTypeLine = "Content-Type: " +
contentType(fileName) + CRLF;
} else {
statusLine = "HTTP/1.1 404 Not Found: ";
contentTypeLine = "Content-Type: text/html" + CRLF;
entityBody = "<HTML>" + "<HEAD><TITLE>Not Found</TITLE></HEAD>" + "<BODY>Not Found</BODY></HTML>";
}
//End of response message construction

// Send the status line.
os.writeBytes(statusLine);

// Send the content type line.
os.writeBytes(contentTypeLine);

// Send a blank line to indicate the end of the header lines.
os.writeBytes(CRLF);

// Send the entity body.
if (fileExists) {
sendBytes(fis, os);
fis.close();
} else {
os.writeBytes(entityBody);
}

os.close(); //Close streams and socket.
br.close();
socket.close();

}

//Need this one for sendBytes function called in processRequest
private static void sendBytes(FileInputStream fis, OutputStream os)
throws Exception
{
// Construct a 1K buffer to hold bytes on their way to the socket.
byte[] buffer = new byte[1024];
int bytes = 0;

// Copy requested file into the socket』s output stream.
while((bytes = fis.read(buffer)) != -1 ) {
os.write(buffer, 0, bytes);
}
}
private static String contentType(String fileName)
{
if(fileName.endsWith(".htm") || fileName.endsWith(".html"))
return "text/html";
if(fileName.endsWith(".jpg"))
return "text/jpg";
if(fileName.endsWith(".gif"))
return "text/gif";
return "application/octet-stream";
}
}

閱讀全文

與java實現websocket相關的資料

熱點內容
伺服器端渲染的數據怎麼爬 瀏覽:163
壓縮空氣噴射器 瀏覽:488
python提高效率 瀏覽:796
華為文件管理怎麼樣輸入解壓碼 瀏覽:800
深思加密狗初始化 瀏覽:566
黃金崩潰pdf 瀏覽:309
華為特定簡訊息加密 瀏覽:375
微機原理與單片機技術李精華答案 瀏覽:816
pic12c508單片機 瀏覽:309
androidgps調用 瀏覽:226
金文編pdf 瀏覽:445
14乘87減147的簡便演算法 瀏覽:473
怎麼創建edu文件夾 瀏覽:721
演算法的基礎問題 瀏覽:256
蘋果手機怎麼選擇app支付 瀏覽:856
訪問加密伺服器失敗怎麼回事 瀏覽:439
程序員每天跑步5公里 瀏覽:789
黨員對程序員有幫助么 瀏覽:550
慢跑穿壓縮衣還是緊身衣 瀏覽:214
什麼伺服器引擎最好 瀏覽:497