① 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有哪些可以練手的項目
1.各種管理系統
源碼下載(實例一):
jsp開發完整的博研圖書館後台管理系統,不使用框架開發的,太完美了
源碼下載(實例二):
javaWeb圖書館管理系統源碼mysql版本
源碼下載(實例三)
GitHub - uboger/LibraryManager: JAVA GUI 圖書館管理系統
源碼下載(實例四):
java swing開發企業人事管理系統源代碼下載
2.簡易的聊天系統
源碼下載(實例一):
java swing開發網路聊天室群聊系統,基於java多線程socket編程
源碼下載(實例二):
java swing開發大貓聊天室源碼,簡單易懂,適合java swing初學者
源碼下載(實例三):
java websocket開發簡單聊天室系統,實現群聊與一對一單人聊天案例
源碼下載(實例四):
jsp開發簡單聊天室demo-分享
3.實現通訊錄
java通訊錄實現了添加刪除和查找功能
源碼下載(二):
JAVA版通訊錄管理系統課程設計源碼
源碼下載(三):
Java Swing界面.完美設計通訊錄..有需要的下
4.坦克大戰
源碼下載(一):
俄羅斯方塊 JAVA版
源碼下載(二):
GitHub - FieldSoft-HelloClyde/Tetris-Swing: Swing編寫的俄羅斯方塊
源碼下載(三):
java swing開發的俄羅斯方塊游戲,包含完整代碼+詳細注釋
5.五子棋
源碼下載(一):
Java實踐(十一)——五子棋
源碼下載(二):
java swing開發的五子棋小游戲源碼
源碼下載(三):
java swing開發單機版五子棋源代碼下載
源碼下載(四):
Java五子棋演算法和代碼
6.中國象棋
源碼下載(一):Java實踐(十二)——中國象棋
7.貪吃蛇
java貪吃蛇源代碼 、 java貪吃蛇源代碼
以上是總結出來的簡單的練手項目,希望對你有幫助
③ 瀏覽器不支持websocket怎麼辦
1、新建web project。找到tomcat 7.0 lib 下的謹笑梁catalina.jar,tomcat-coyote.jar添加到項目中如下是我的目錄結構。
④ java 實現長連接接受信息,發送信息
對於你這個需求,可以用當前比較熱門的websocket來解決。
websocket可以實現服務端和客戶端全雙工通信,實時性非常好。
你可以自己搭建websocket服務,也可以使用第三方的websocket推送框架,比如【GoEasy】。
【GoEasy】目前支持java、php、python等服務端語言,同時也支持小程序、vue、uniapp等前端技術,使用起來還是非常方便的。
⑤ 實戰spring-boot-starter-websocket之斷網心跳續期實踐
業務中需要應用到Websocket長連接進行數據傳輸,由於服務使用的是Zuul1.0版本,對ws協議支持較弱,後續嘗試使用了 spring-boot-starter-websocket 來完成的。關於怎麼集成的話網上有非常多的文章了,我就不多費口舌了。
我們目前實現的功能是可以通過WebSocket調用介面發送埋點,另外還需要監聽用戶離開的事件為這個埋點畫上一個終止訪問時間。目前測試下場景有:
前4點觸發了任意操作,服務端都會監聽到 DISCONNECT 離開事件。但是第5點直接斷網, 服務端竟然是無感知的,這個時候產生的問題就是客戶斷網了,服務端是認為在線的,如果不重新聯網登錄的話,那麼這個用戶將會一直一直在線,埋點會一直計算。完了個蛋~
至於為什麼斷網之後,ws會認為他是在線的, 可能管道打開了之後由於斷網導致斷開時間發送不出去吧。
我目前能夠想到比較簡單的辦法就是: 心跳續約
捋清了思路,大概就知道如何做了。
然後特意看了下 spring-boot-starter-websocket 的源碼,發現其實他有提供此功能。
先說下如何實現:
我們是在在謹梁實現了 的配置衡頌類中重寫 configureMessageBroker 方法。
比較關鍵就是 setTaskScheler 和 setHeartbeatValue 一個負責調度、一個負責配置間隔。
這倆要麼都填要麼都不填。
配置了這倆參數之後,服務啟動的時候會觸發一個 HeartbeatTask 線程來專門維持心跳。
我們可以看看他的流程是如何運轉的。
核心任務調度類: org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler.HeartbeatTask
服務端在啟動的時候 SimpleBrokerMessageHandler 在初始化完成之後會回調 start 的方法,然而他會觸發一個 startInternal 開始調度任務,判斷依據就是有沒有配置 TaskScheler ( 對應的就是配置類中的setTaskScheler ),一旦啟動之後,會根據你給的心跳數組 serverHeartbeat ,來選擇調度時間。
org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler
檢測心跳、超過間隔則剔除祥攔運、並且定期回寫心跳給客戶端。
還有一點需要注意的是讀的間隔時間:
假設用戶網路不好,心跳漏發了一次,這個時候如果按照本次的邏輯而言,該用戶的最後心跳時間肯定會超時。而它的做法是, 將設定的讀超時時間 3 ,就相當於有3次機會*。
這個在創建session的時候 SessionInfo 裡面就已經做好了處理:
org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler.SessionInfo#SessionInfo
所以這個時候,你可能需要根據業務能夠接受的時長去配置,也別忘了這個事。
還有很關鍵的一點就是讓客戶端的心跳發送間隔和服務端盡可能保持一致,不然有可能出現莫名其妙的下線情況,盡可能還是在這種地方加好日誌。
好了,希望在遇到斷網問題的時候,能夠幫助到你。
如果有疑問請留言,我會盡快答復。
⑥ 怎樣用java web和websocket實現網頁即時通訊
原理
WebSocket protocol 。
現很多網站為了實現即時通訊,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的數據給客戶端的瀏覽器。這種傳統的HTTP request 的模式帶來很明顯的缺點 – 瀏覽器需要不斷的向伺服器發出請求,然而HTTP request 的header是非常長的,裡麵包含的有用數據可能只是一個很小的值,這樣會佔用很多的帶寬。
而比較新的技術去做輪詢的效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工通信,但依然需要發出請求。
在 WebSocket API,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。在此WebSocket 協議中,為我們實現即時服務帶來了兩大好處:
1. Header
互相溝通的Header是很小的-大概只有 2 Bytes
2. Server Push
伺服器的推送,伺服器不再被動的接收到瀏覽器的request之後才返回數據,而是在有新數據時就主動推送給瀏覽器。
一、項目簡介
WebSocket是HTML5一種新的協議,它實現了瀏覽器與伺服器全雙工通信,這里就將使用WebSocket來開發網頁聊天室,前端框架會使用AmazeUI,後台使用Java,編輯器使用UMEditor。
二、涉及知識點
網頁前端(HTML+CSS+JS)和Java
三、軟體環境 Tomcat 7 JDK 7 Eclipse JavaEE 現代瀏覽器
四、效果截圖
效果1
3. 編寫後台代碼
新建一個com.shiyanlou.chat的包,在包中創建一個名為ChatServer的類,從JavaEE 7開始就統一了WebSocket的API,因此無論是什麼伺服器,用Java寫的代碼都是一樣的,代碼如下:
?
041424344454647484950 package com.shiyanlou.chat;import java.text.SimpleDateFormat;import java.util.Date;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import net.sf.json.JSONObject;/*** 聊天伺服器類* @author shiyanlou**/@ServerEndpoint("/websocket")public class ChatServer {private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 日期格式化@OnOpenpublic void open(Session session) {// 添加初始化操作}/*** 接受客戶端的消息,並把消息發送給所有連接的會話* @param message 客戶端發來的消息* @param session 客戶端的會話*/@OnMessagepublic void getMessage(String message, Session session) {// 把客戶端的消息解析為JSON對象JSONObject jsonObject = JSONObject.fromObject(message);// 在消息中添加發送日期jsonObject.put("date", DATE_FORMAT.format(new Date()));// 把消息發送給所有連接的會話for (Session openSession : session.getOpenSessions()) {// 添加本條消息是否為當前會話本身發的標志jsonObject.put("isSelf", openSession.equals(session));// 發送JSON格式的消息openSession.getAsyncRemote().sendText(jsonObject.toString());}}@OnClosepublic void close() {// 添加關閉會話時的操作}@OnErrorpublic void error(Throwable t) {// 添加處理錯誤的操作}}
4. 前後台交互
後台寫完了,前台要用WebSocket連接後台,需要新建一個WebSocket對象,然後就可以和伺服器端進行交互,從瀏覽器發送消息給伺服器端,同時要驗證輸入框的內容是否為空,然後接受服務端發送的消息,把它們動態地添加到聊天內容框中,在
?
04142434445464748495051525354 var um = UM.getEditor('myEditor');$('#nickname')[0].focus();// 新建WebSocket對象,最後的/websocket對應伺服器端的@ServerEndpoint("/websocket")var socket = new WebSocket('ws://${pageContext.request.getServerName()}:${pageContext.request.getServerPort()}${pageContext.request.contextPath}/websocket');// 處理伺服器端發送的數據socket.onmessage = function(event) {addMessage(event.data);};// 點擊Send按鈕時的操作$('#send').on('click', function() {var nickname = $('#nickname').val();if (!um.hasContents()) { // 判斷消息輸入框是否為空// 消息輸入框獲取焦點um.focus();// 添加抖動效果$('.ei-container').addClass('am-animation-shake');setTimeout("$('.ei-container').removeClass('am-animation-shake')", 1000);} else if (nickname == '') { // 判斷昵稱框是否為空//昵稱框獲取焦點$('#nickname')[0].focus();// 添加抖動效果$('#message-input-nickname').addClass('am-animation-shake');setTimeout("$('#message-input-nickname').removeClass('am-animation-shake')", 1000);} else {// 發送消息socket.send(JSON.stringify({content : um.getContent(),nickname : nickname}));// 清空消息輸入框um.setContent('');// 消息輸入框獲取焦點um.focus();}});// 把消息添加到聊天內容中function addMessage(message) {message = JSON.parse(message);var messageItem = '<li class="am-comment '+ (message.isSelf ? 'am-comment-flip' : 'am-comment')+ '">'+ '<a href="javascript:void(0)" ><img src="assets/images/'+ (message.isSelf ? 'self.png' : 'others.jpg')+ '" alt="" width="48" height="48"/></a>'+ '<div><header><div>'+ '<a href="javascript:void(0)">'+ message.nickname + '</a> <time>' + message.date+ '</time></div></header>'+ '<div>' + message.content+ '</div></div></li>';$(messageItem).appendTo('#message-list');// 把滾動條滾動到底部$(".chat-content-container").scrollTop($(".chat-content-container")[0].scrollHeight);}
到這步,簡單的網頁聊天室就完成了,你可以多開幾個窗口或在區域網中邀請小夥伴們來一起測試。
六、小結
本次項目課使用WebSocket實現了簡單的網頁聊天室,其實WebSocket不僅可以應用於瀏覽器,也可以應用於桌面客戶端。
⑦ java消息推送websocket怎麼實現
java消息推送websocket實現原理:在實現websocket連線過程中,需要通過瀏覽器發出websocket連線請求,然後伺服器發出回應,這個過程通常稱為「握手」 。在 WebSocket API,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。⑧ 如何用java實現websocket
伺服器端實現(Tomcat)
客戶端實現(Java-WebSocket)
客戶端實現(Javascript原生API)