導航:首頁 > 編程語言 > java自定義協議

java自定義協議

發布時間:2022-10-05 11:37:17

A. java 方法中如何在返回類型使用泛型

主要是一個編譯期的檢查,也避免了我們代碼中的強制轉換,比較經典的用法有泛型DAO,泛型Page的DTO。

現在我要說的是一個挺有趣但是貌似還不是太多的人在代碼中使用的方法,前段時間用guava和op4j的時候發現這樣的用法,看看了源碼,也是很簡單的。

比如guava中創建集合的方法 List<xx> list = Lists.newArrayList(),這個代替了我們傳統的 new ArrayList<xx>,為什麼在=的右邊不需要泛型了呢,我們看看源碼。

[java] view plain
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
返回類型中帶有泛型E,並且這個泛型的來源在 static和 ArrayList之間的位置,我自己的理解是這個就和=左邊的一致,可能說的不夠專業但是意思應該就這樣。

於是我就依樣畫葫蘆在自己的代碼中也用了起來。

我要做的是一個仿httpsession機制的自定義協議是session。在httpsession.getAttribute方法返回的是一個
Object,然後我們再類型轉換。現在我用返回類型泛型來優化這個代碼,以下是我自定義協議session的getAttribute的代碼。
[java] view plain
@SuppressWarnings("unchecked")
public <E> E getAttribute(String key) {
return (E) map.get(key);
}
調用代碼
[java] view plain
Boolean isFirst = session.getAttribute("first");
在httpsession中我們則要這么寫
[java] view plain
Boolean isFirst = (Boolean)session.getAttribute("first");

泛型的用法還有很多,有新的心得再補充更新

B. java如何編寫通信協議給小例子

通信協議說實在的,簡單的理解就是雙方約定好的一種接頭口號,一般是伺服器短接受到他認可的頭部head,才開始已個會話。當然,這個過程確實是用socket實現的,如果你要了解更加底層,可以去看看鏈路協議等。

C. JAVA語言支持哪些協議 各協議對JAVA具體的用途

協議最主要用於通信,通信雙方必須遵守協議才能進行正常通信。
可以用生活中的寄信來類比。寄信方必須寫明收信方的地址及收信人姓名,並且把信件放到信封中貼上郵票投遞到郵箱中,收信人才能收到此信件。收信方必須到郵箱中才能收取信件。這種對通信雙方的約束規則,便是協議!

例如Http協議,它規定了瀏覽器應該以什麼樣的格式且怎樣發送請求和接受響應,同時也規定了伺服器應該怎麼樣解析瀏覽器發來的請求並且作出響應。在Http協議的約束下,不同的瀏覽器才能和不同的伺服器實現正常通信!

D. Java中怎麼注冊協議

注冊協議
URL的static URLStreamHandler getURLStreamHandler(String protocol) 方法用於獲取獲取協議處理類
URL提供了兩種注冊協議的途徑。
1)設置URLStreamHandlerFactory,2)設置jvm啟動參數java.protocol.handler.pkgs。
兩者可以同時使用。
設置URLStreamHandlerFactory
URL的方法
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) {
synchronized (streamHandlerLock) {
if (factory != null) {
throw new Error("factory already defined");
}
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkSetFactory();
}
handlers.clear();
factory = fac;
}
}
public interface URLStreamHandlerFactory {
URLStreamHandler createURLStreamHandler(String protocol);
}
整個jvm只能設置一次,再次設置不起作用。調用URL.setURLStreamHandlerFactory(fac)。
一般是在伺服器的代碼中設置,比如tomcat,jboss ,was等,用於注冊伺服器自己的協議,應用級沒法設置,因為伺服器已經設置過了,應用即使設置了也不起作用。
啟動參數-Djava.protocol.handler.pkgs
通過-Djava.protocol.handler.pkgs=cn.ccb.wfcp注冊自定義協議的包。要求協議處理類的類名必須是Handler,包名的最後是協議名。示例如下,定義了brules協議。
package cn.ccb.wfcp.brules;
public class Handler extends URLStreamHandler {
如果要定義多個協議包就用"|"分割,比如-Djava.protocol.handler.pkgs=cn.ccb.wfcp|cn.ccb.wfcp22.
jvm內置的協議也是按照上面的方式定義的,但不用通過-Djava.protocol.handler.pkgs注冊,而是將內置的協議包拼接到後面。內置協議都在sun.net.www.protocol包下面。
獲取到Handler類名後去載入class。Class cls = null;
try {
cls = Class.forName(clsName);
} catch (ClassNotFoundException e) {
ClassLoader cl = ClassLoader.getSystemClassLoader();
if (cl != null) {
cls = cl.loadClass(clsName);
}
}
if (cls != null) {
handler =
(URLStreamHandler)cls.newInstance();
}

E. 用java 寫一個登陸的功能,輸入賬戶和密碼,發送給伺服器端,這個消息怎麼封裝

都不知道你的伺服器是web伺服器 還是socket通訊伺服器
如果是web伺服器 那就如婉月工作室所說的 那麼發送
如果是socket 伺服器 那就在伺服器上建立socket服務端
在登錄機上建立socket 客戶端
自定義通訊協議 比如 發送 login#admin#000111
服務端就可以識別為 是登錄指令 用戶名 admin 密碼 000111
伺服器訪問資料庫 得到結果 返回 login#1 或者 login#0 那客戶端就知道驗證是否成功了
這是最簡單的規約

F. 如何使用java socket來傳輸自定義的數據包

以下分四點進行描述:

1,什麼是Socket
網路上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個埠號唯一確定。
但是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基於TCP/IP協議的網路編程。

2,Socket通訊的過程
Server端Listen(監聽)某個埠是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。
對於一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:
(1) 創建Socket;
(2) 打開連接到Socket的輸入/出流;
(3) 按照一定的協議對Socket進行讀/寫操作;
(4) 關閉Socket.(在實際應用中,並未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以並未造成什麼影響。)

3,創建Socket
創建Socket
java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
其中address、host和port分別是雙向連接中另一方的IP地址、主機名和端 口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的埠號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創建serverSocket又可 以用來創建Socket。count則表示服務端所能支持的最大連接數。例如:學習視頻網 http://www.xxspw.com
Socket client = new Socket("127.0.01.", 80);
ServerSocket server = new ServerSocket(80);
注意,在選擇埠時,必須小心。每一個埠提供一種特定的服務,只有給出正確的埠,才 能獲得相應的服務。0~1023的埠號為系統所保留,例如http服務的埠號為80,telnet服務的埠號為21,ftp服務的埠號為23, 所以我們在選擇埠號時,最好選擇一個大於1023的數以防止發生沖突。
在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。

4,簡單的Client/Server程序
1. 客戶端程序
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本機的4700埠發出客戶請求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統標准輸入設備構造BufferedReader對象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,並構造PrintWriter對象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,並構造相應的BufferedReader對象
String readline;
readline=sin.readLine(); //從系統標准輸入讀入一字元串
while(!readline.equals("bye")){
//若從標准輸入讀入的字元串為 "bye"則停止循環
os.println(readline);
//將從系統標准輸入讀入的字元串輸出到Server
os.flush();
//刷新輸出流,使Server馬上收到該字元串
System.out.println("Client:"+readline);
//在系統標准輸出上列印讀入的字元串
System.out.println("Server:"+is.readLine());
//從Server讀入一字元串,並列印到標准輸出上
readline=sin.readLine(); //從系統標准輸入讀入一字元串
} //繼續循環
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則列印出錯信息
}
}
}

2. 伺服器端程序
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//創建一個ServerSocket在埠4700監聽客戶請求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出錯,列印出錯信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客戶請求,有客戶
//請求到來則產生一個Socket對象,並繼續執行
}catch(Exception e) {
System.out.println("Error."+e);
//出錯,列印出錯信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,並構造相應的BufferedReader對象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,並構造PrintWriter對象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統標准輸入設備構造BufferedReader對象
System.out.println("Client:"+is.readLine());
//在標准輸出上列印從客戶端讀入的字元串
line=sin.readLine();
//從標准輸入讀入一字元串
while(!line.equals("bye")){
//如果該字元串為 "bye",則停止循環
os.println(line);
//向客戶端輸出該字元串
os.flush();
//刷新輸出流,使Client馬上收到該字元串
System.out.println("Server:"+line);
//在系統標准輸出上列印讀入的字元串
System.out.println("Client:"+is.readLine());
//從Client讀入一字元串,並列印到標准輸出上
line=sin.readLine();
//從系統標准輸入讀入一字元串
} //繼續循環
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
server.close(); //關閉ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出錯,列印出錯信息
}
}
}

閱讀全文

與java自定義協議相關的資料

熱點內容
伺服器內部錯誤500運行什麼 瀏覽:944
鬼叫春為什麼吃了餅變黃牛。 瀏覽:146
女子穿越與多個男主在一起 瀏覽:734
電影刪減視頻去哪裡看 瀏覽:638
韓國電影兩個當兵的救一個女的 瀏覽:305
大遲度未刪電影 瀏覽:912
金花媛 寡糖 瀏覽:359
pdf的application 瀏覽:125
pdf數理邏輯 瀏覽:885
歐美愛情喜劇電影 瀏覽:194
主角叫李天的小說 瀏覽:574
台灣風情片 瀏覽:468
xcode新版編譯運行 瀏覽:182
原版純英文字幕電影 瀏覽:231
阿里雲如何做到雲伺服器獨立ip 瀏覽:708
單片機進制教案 瀏覽:476
有什麼好的演算法書 瀏覽:157
到達市電影院英語 瀏覽:135
韓國電影男的進健房找女教練 瀏覽:10
國內十個免費網站 瀏覽:703