❶ java SOCKET傳送數據
可以這樣哈,數據結構:
|--時間(50個位元組)--||--上午數據長度(固定用8個位元組)--||--上午數據--||--中午數據長度--||--中午數據--||--下午數據長度--||--下午數據--|
然後讀取的時候先讀50個位元組的內容,然後把它轉為字元串得到的就是時間,然後讀8個位元組的內容,把讀到的內容轉為數字就是上午的數據的總長度,假如是n,則繼續讀n個位元組內容,轉為字元串就是上午數據,然後繼續讀8個位元組,轉為數字……
以上只是一種數據結構,還可以有很多,你可以根據自己的實際情況來決定各個位元組的長度。
再說寫入的情況,把所有的字元串轉化成固定長度的byte數組然後直接寫入就行了。
byte[] time=new byte[10];
String stime="2009-10-31 12:00:00";
byte[] temp=stime.getByte();
for(int i=0;i<temp.length;i++){
time[i]=temp[i];
}
然後寫入time,等到把所有數據寫入完畢統一刷新
❷ socket如何單獨推送消息
Socket又稱"套接字",應用程序通常通過"套接字"向網路發出請求或者應答網路請求。Socket的英文原義是「孔」或「插座」,作為UNIX的進程通信機制。Socket可以實現應用程序間網路通信。
消息推送:
輪詢:客戶端定時向伺服器發送Ajax請求,伺服器接到請求後馬上返回響應信息並關閉連接。
長輪詢:客戶端向伺服器發送Ajax請求,伺服器接到請求後hold住連接,直到有新消息才返回響應信息並關閉連接,客戶端處理完響應信息後再向伺服器發送新的請求。 ?優點:在無消息的情況下不會頻繁的請求,耗費資小。
長連接:在頁面里嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設為對一個長連接的請求或是採用xhr請求,伺服器端就能源源不斷地往客戶端輸入數據。
Flash Socket:在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript通過調用此Flash程序提供的Socket介面與伺服器端的Socket介面進行通信,JavaScript在收到伺服器端傳送的信息後控制頁面的顯示。 Websocket:
WebSocket是HTML5開始提供的一種瀏覽器與伺服器間進行全雙工通訊的網路技術。依靠這種技術可以實現客戶端和伺服器端的長連接,雙向實時通信。
消息推送功能可以說移動APP不可缺少的功能之一,一般簡單的推送可以使用第三方推送的SDK,比如極光推送。極光是中國領先的移動大數據服務商。本公司自2011年成立以來專注於為app開發者提供穩定高效的消息推送、統計分析、即時通訊和簡訊等開發者服務。
❸ java socket 怎麼給websocket發信息
1.InitServlet
該類主要是用來初始化構造將來存儲用戶身份信息的map倉庫,利用其初始化方法Init 初始化倉庫, 利用其靜態方法getSocketList 獲得對應的用戶身份信息。
webSocket ,我認為MessageInbound 用來識別登錄人的信息,用它來找到對應的人,推送消息。每次登錄都會產生一個MessageInbound。
這里的HashMap<String,MessageInbound> :string 存儲用戶session的登錄id,MessageInbound存儲 推送需要的身份信息。以上屬於個人口頭話理解。
packagesocket;
importjava.nio.CharBuffer;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importorg.apache.catalina.websocket.MessageInbound;
{
=-3163557381361759907L;
//privatestaticList<MessageInbound>socketList;
privatestaticHashMap<String,MessageInbound>socketList;
publicvoidinit(ServletConfigconfig)throwsServletException{
//InitServlet.socketList=newArrayList<MessageInbound>();
InitServlet.socketList=newHashMap<String,MessageInbound>();
super.init(config);
System.out.println("Serverstart============");
}
publicstaticHashMap<String,MessageInbound>getSocketList(){
returnInitServlet.socketList;
}
/*publicstaticList<MessageInbound>getSocketList(){
returnInitServlet.socketList;
}
*/}
2.MyWebSocketServlet
websocket用來建立連接的servlet,建立連接時,首先在session獲取該登錄人的userId,在調用MyMessageInbound構造函數傳入userId
packagesocket;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.nio.CharBuffer;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.catalina.websocket.StreamInbound;
importorg.apache.catalina.websocket.WebSocketServlet;
/**
*
*@ClassName:MyWebSocketServlet
*@Description:建立連接時創立
*@authormangues
*@date2015-7-19
*/
{
publicStringgetUser(HttpServletRequestrequest){
StringuserName=(String)request.getSession().getAttribute("user");
if(userName==null){
returnnull;
}
returnuserName;
//return(String)request.getAttribute("user");
}
@Override
(Stringarg0,
HttpServletRequestrequest){
System.out.println("##########");
returnnewMyMessageInbound(this.getUser(request));
}
}
3.onOpen方法調用InitServlet的map身份倉庫,
放入用戶userId 和 對應該登錄用戶的websocket身份信息MessageInbound (可以用userId來尋找到推送需要的 身份MessageInbound)
onTextMessage :用來獲取消息,並發送消息
packagesocket;
importjava.io.IOException;
importjava.nio.ByteBuffer;
importjava.nio.CharBuffer;
importjava.util.HashMap;
importorg.apache.catalina.websocket.MessageInbound;
importorg.apache.catalina.websocket.WsOutbound;
importutil.MessageUtil;
{
privateStringname;
publicMyMessageInbound(){
super();
}
publicMyMessageInbound(Stringname){
super();
this.name=name;
}
@Override
protectedvoidonBinaryMessage(ByteBufferarg0)throwsIOException{
//TODOAuto-generatedmethodstub
}
@Override
protectedvoidonTextMessage(CharBuffermsg)throwsIOException{
//用戶所發消息處理後的map
HashMap<String,String>messageMap=MessageUtil.getMessage(msg);//處理消息類
//上線用戶集合類map
HashMap<String,MessageInbound>userMsgMap=InitServlet.getSocketList();
StringfromName=messageMap.get("fromName");//消息來自人的userId
StringtoName=messageMap.get("toName");//消息發往人的userId
//獲取該用戶
MessageInboundmessageInbound=userMsgMap.get(toName);//在倉庫中取出發往人的MessageInboundif(messageInbound!=null){//如果發往人存在進行操作
WsOutboundoutbound=messageInbound.getWsOutbound();
Stringcontent=messageMap.get("content");//獲取消息內容
StringmsgContentString=fromName+""+content;//構造發送的消息
//發出去內容
CharBuffertoMsg=CharBuffer.wrap(msgContentString.toCharArray());
outbound.writeTextMessage(toMsg);//
outbound.flush();
}/*for(MessageInboundmessageInbound:InitServlet.getSocketList()){
CharBufferbuffer=CharBuffer.wrap(msg);
WsOutboundoutbound=messageInbound.getWsOutbound();
outbound.writeTextMessage(buffer);
outbound.flush();
}*/
}
@Override
protectedvoidonClose(intstatus){
InitServlet.getSocketList().remove(this);
super.onClose(status);
}
@Override
protectedvoidonOpen(WsOutboundoutbound){
super.onOpen(outbound);
//登錄的用戶注冊進去
if(name!=null){
InitServlet.getSocketList().put(name,this);
}
//InitServlet.getSocketList().add(this);
}
}
4.消息處理類,處理前端發來的消息
packageutil;
importjava.nio.CharBuffer;
importjava.util.HashMap;
/**
*
*@ClassName:MessageUtil
*@Description:消息處理類
*@authormangues
*@date2015-7-19
*/
publicclassMessageUtil{
publicstaticHashMap<String,String>getMessage(CharBuffermsg){
HashMap<String,String>map=newHashMap<String,String>();
StringmsgString=msg.toString();
Stringm[]=msgString.split(",");
map.put("fromName",m[0]);
map.put("toName",m[1]);
map.put("content",m[2]);
returnmap;
}
}
❹ 關於 java socket的消息推送問題
關於 java socket的消息推送問題,首先:開啟服務端,並暴露出埠。然後通過一個while的死循環去不停的接收來自客戶端的socket,並且通過一個ArrayList來維護。並且通過子線程去對list中的socket進行操作。❺ Java如何使用socket互相發送對象
getOutputStream(),從連接獲取輸入流對象。 這個對象可以和BufferedOutputStream,OutputStreamWriter等配合使用; 建立BufferedOutputStream對象 BufferedOutputStream br=new BufferedOutputStream(socket.getOutputStream()); 調用BufferedOutputStream對象的,write向流中寫入數據。
❻ java多用戶socket通訊,數據返回給指定用戶
我覺得你是不是要了解下nio或者netty?
應該會有所幫助…服務端綁定埠監聽,每個客戶端去連接都是一個socket,服務端使用selector分發客戶端請求並處理。
基本使用netty就好了…
❼ 安卓/java用Socket實現類似QQ消息推送,程序在後台運行如何一直保持連接伺服器端如何判斷是否斷開連
QQ消息是 UDP包。 你連接後,不關閉就算連接著,服務端沒法判斷是否斷開連接,
只有客戶端 定時發送一個UDP包,表示連接著。
❽ java socket伺服器發送信息給指定的客戶端,在線等
是tcp還是udp啊?socket連接可以指定ip和埠啊,所以服務端即使有N個socket連接都不怕,知道埠就行了
❾ 如何實現java推送消息到app
主要介紹其中的五種實現方式:短輪詢、Comet、Flash XMLSocket、Server-sent、WebSocket❿ java socket技術 客戶端實現不發送請求給服務端但是一直接收服務端發來的數據
說點潑冷水的話題
首先確認什麼是客戶端,什麼是服務端。
從用戶的角度,可見的、可操作的即是客戶端,也就是你這里說的java開發的部分。而不可見的部分就是服務端,也就是你說的C部分。
而從網路開發的角度,發起請求的是客戶端,而接收請求的是服務端。這與用戶感受有很大區別。
當從java請求C的時候,java是客戶端,C 是服務端。而當C主動請求時,則C就變成了客戶端,而java 變成了服務端。
所以,從網路開發的角度,java想成為此次通信的服務端,必須長期維護一個埠可用,而C 要訪問這個埠。
而java為了能夠長期維護一個埠,一般採用socket 方式(其他方式也基本上都是基於socket的),由於java已經封裝的很好了,只要new Socket(IP,port) 就可以 獲得,同時,由於原來C 是伺服器,而如果沒有多個伺服器同時向java端發送請求的話,基本連線程處理都不需要做的。