㈠ java http可以websocket不行
解決方案如下:
因為HTTPS是基於SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密,所以在HTTPS站點調用某些非SSL驗證的資源時瀏覽器可能會阻止。
方案一:假設HTTPS站點使用Nginx伺服器,其他伺服器也是類似的思路,可以用伺服器代理ws服務,可以用nginx的WebSocket proxying。
這樣客戶端請求的是wss://伺服器,通過nginx的WebSocket proxying代理到實際不支持ssl的websocket伺服器。
方案二:直接為WebSocket伺服器增加ssl證書,這樣就可以直接通過wss://來請求伺服器了,以swoole為例,其他伺服器也是類似的思路。
㈡ java websocket web網頁聊天怎麼實現
websocket 是反向推送的一種類型
聊天需要實時性高,在A第一次發送信息給B的時候需要建立websocket的連接,A向B發送信息就通過websocket完成。
A如果關閉窗口則websocket斷開連接
㈢ html5 java js websocket相關問題
第一種伺服器的推送:
首先你要了解 websocket的 握手動作,跟後台建立握手
然後因為你的後台要無數次的推送數據,所以你要了解後台的 task自動任務
自動任務有很多,已知的:springMVC(3.0以上)自帶task(網路可知道)
其次重型點的框架:quartz 無縫兼容spring。
然後 設置定時任務,不斷的向你的握手頁面推送數據
websokcet 頁面接受 over!!!!
第二種客戶端的輪詢:
客戶端前台js 有個settimeout函數,跟java的timer函數一樣 在裡面嵌套一個ajax 不斷的輪詢發送請求,然後獲取數據,在回調函數裡面處理!(壞處:損耗伺服器性能,並發量高。)
㈣ 怎樣用java web和websocket實現網頁即時通訊
使用7z格式壓縮上傳
下載1: http://vdisk.weibo.com/s/D7LHb/1369631064
下載2: att.newsmth.net/att.php?p.75.25665.766.7z
Java版源代碼下載:http://vdisk.weibo.com/s/I26Jq
(有些網友對C++如何實現感興趣,推薦一下Poco帶的WebSocket功能,把Java源代碼翻譯成C++就行了)
1. 說明:
utf8版本,支持各種語言版本的windows系統
程序內嵌資料庫
用戶帳號非明文存儲
在Firefox/Chrome瀏覽器測試通過,建議使用Chrome,Firefox不支持mp3的消息提示音
2. 現有功能
注冊/登錄/搜索/添加好友(需要雙方互相添加對方為好友,才能互相聊天)
抖動窗口
兩種狀態,登錄/離線
3.可擴展的功能
使用Windows域用戶帳號,無需注冊
收發離線信息
查看歷史信息
新消息提示
群聊
共享文件
4. (可能)存在的問題
並發性未作充分測試
添加好友的確認
5. 適用的場景
學校
小公司
6.使用
解壓後雙擊執行start.bat,將自動進入初始界面,如下圖
默認使用80埠,若80埠已被佔用,修改start.bat中的setserver_port=80
雙擊左上角圖標,彈出對話框,可以選擇注冊
注冊成功
登錄
搜索好友,如不提供搜索條件,則返回所有已注冊用戶
添加好友
添加好友提示
聊天
㈤ 怎樣用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";
}
}
㈥ JavaWeb裡面裝Socket
這種業務場景,我建議前後端都可以直接使用websocket來做實現啊。用websocket 不僅實時性高,而且還不費伺服器資源的。
你可以參考網上的教程自己寫websocket客戶端,也可以採用第三方的websocket推送框架。我們項目目前就用的是【GoEasy】的websocket推送服務,前後端都在用,還是比較方便,集成起來挺快的,穩定性也不錯的。
㈦ 怎樣用java web和websocket實現網頁即時通訊
服務穩定的推送服務,前段時間研究了一下goeasy,後台推送只需要兩行代碼, js前端推送也只需要3,4行,而且文檔齊全,還提供了後台查詢信息收發情況,所以我覺得GoEasy推送服務是個不錯的選擇。
快速入門:https://goeasy.io/www/started
GoEasy web實時推送官網:https://goeasy.io
1. 引入goeasy.js
2. 客戶端訂閱,
Var goeasy = new GoEasy({appkey:』your appkey』});
goeasy.subscribe(channel:」your channel」, onMessage:function(message){alert(『received message』+ message.content)})
3. 三種推送方式
Javascript: goeasy.publish({channel:』your channel』, message:』your publish msg』});
Java SDK: GoEasy goeasy = new GoEasy(「appkey」); goeasy.publish(「your channel」,」your msg」);
RestAPI: https://goeasy.io/goeasy/publish
三步輕松實現web推送及接收
㈧ 怎樣用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
我不知道你想用websocket實現什麼樣的功能,一般配合HTML5的話websocket可以解決服務端和客戶端消息實時傳遞的問題,如消息推送(webQQ這種)。它的初始連接是http轉成websocket連接。
實現的話要做兩件事,一端是在伺服器實現service,這個有點像tcplistener一樣;
另一個是客戶端(瀏覽器)開發,可以用JS實現:
<html>
<head>
<meta
charset="utf-8"
/>
<script
type="text/javascript">
var
host
=
'127.0.0.1';
var
port
=
8080;
var
url
=
'ws://'+host+':'+port+'/';
var
w
=
new
WebSocket(url);
//構建於伺服器之間的連接通信
<!--var
audioElement
=
document.createElement('audio');
-->
<!--audioElement.setAttribute('src',
'qqmsg.mp3');-->
w.onopen
=
function()//通過onopen事件句柄來監聽socket的打開事件
{
$('chat-box').innerHTML
=
'已連接到伺服器......<br/>';
}
w.onmessage
=
function(e)//用onmessage事件句柄接受伺服器傳過來的數據
{
var
msg
=
e.data;
var
chatBox
=
$('chat-box');
//
audioElement.play();
chatBox.innerHTML
=
chatBox.innerHTML+msg+'<br/>';
}
function
send()//使用send方法向伺服器發送數據
{
var
talk
=
$('talk');
var
nike
=
$('nike');
w.send('<strong
style="color:red">'+nike.value+':</strong>'+talk.value);
}
function
$(id)
{
return
document.getElementById(id);
}
</script>
</head>
<body>
<div
id="chat-box"
style="border:1px
solid
#cccccc;
width:400px;
height:400px;
overflow:scroll;"></div>
昵稱:
<input
type="text"
id="nike"/>
<br/>
內容:
<input
type="text"
id="talk"/>
<input
type="button"
id="send"
onClick="send();"
value="發送"/>
</body>
可參考IBM社區
http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/
</html>