1. javaweb項目中訪問socket介面
java.io.Socket 可以使用的,,,,,,
2. JAVA socket 我需要遠程觸發應用伺服器的一些方法。我如何調用介面或者其他方法。謝謝。
建議引入: 自定義協議或叫做消息
協議可以用基於位元組的(二進制的), 也可以是基於字元的
假設是位元組的, 你可以定義如下
協議頭: 包括協議的長度, 協議的消息ID等你覺得需要放的數據(比如是否需要分包等)
協議內容: 包含各種參數
第一步: 客戶端向服務端發送這些協議
第二步: 服務端解析這些協議
第三步: 如果你對STRUTS的工作原理有所了解的話, 建議這里有個Controler(或者叫分配器), 將協議內容分配給與消息ID相匹配的處理類.
第四步: 相應的處理類進行邏輯處理, 是否返回相關數據看需求而定
如有疑問, 加網路HI再聊
3. java,socket連接和http連接的區別
這個是網上轉的,相互學習,樓主可以看看。
Java之Socket與HTTP區別
我們都知道TCP/IP協議共分四層:
① 鏈路層,有時也稱作數據鏈路層或網路介面層,通常包括操作系統中的設備驅動程序和計算機中對應的網路介面卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理介面細節。
② 網路層,有時也稱作互聯網層,處理分組在網路中的活動,例如分組的選路。在TCP/IP協議族中,網路層協議包括IP協議(網際協議),ICMP協議(internet互聯網控制報文協議),以及IGMP協議(internet組管理協議)。
③ 傳輸層,主要為兩台主機上的應用程序提供端到端的通信。在TCP/IP協議族中,有兩個互不相同的傳輸協議: TCP(傳輸控制協議)和UDP(用戶數據報協議)。 TCP為兩台主機提供高可靠性的數據通信。它所做的工作包括把應用程序交給它的數據分成合適的小塊交給下面的網路層,確認接收到的分組,設置發送最後確認分組的超時時鍾等。由於運輸層提供了高可靠性的端到端的通信,因此應用層可以忽略所有這些細節。而另一方面, U D P則為應用層提供一種非常簡單的服務。它只是把稱作數據報的分組從一台主機發送到另一台主機,但並不保證該數據報能到達另一端。任何必需的可靠性必須由應用層來提供。 這兩種運輸層協議分別在不同的應用程序中有不同的用途,這一點將在後面看到。
④ 應用層,負責處理特定的應用程序細節。幾乎各種不同的TCP/IP實現都會提供下面這些通用的應用程序:Telnet 遠程登錄。FTP 文件傳輸協議。SMTP 簡單郵件傳送協議。SNMP 簡單網路管理協議。
我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝HTTP文本信息,然後使用TCP/IP做傳輸層協議將它發到網路上。
<1>Socket是一個針對TCP和UDP編程的介面,你可以藉助它建立TCP連接等等。而TCP和UDP協議屬於傳輸層 。
而http是個應用層的協議,它實際上也建立在TCP協議之上(HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網路通信的能力)。
<2>Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API),通過Socket,我們才能使用TCP/IP協議。Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數介面。
下面是一些的重要的概念,特在此做摘抄和總結。
一。什麼是TCP連接的三次握手
第一次握手:客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包里不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時伺服器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過「四次握手」(過程就不細寫了,就是伺服器和客戶端交互,最終確定斷開)
二。利用Socket建立網路連接的步驟
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
1。伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
2。客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連接請求。
3。連接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
三。HTTP鏈接的特點
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為「一次連接」。
四。TCP和UDP的區別
1。TCP是面向鏈接的,雖然說網路的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;而UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。
2。也正由於1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。
知道了TCP和UDP的區別,就不難理解為何採用TCP傳輸協議的MSN比採用UDP的QQ傳輸文件慢了,但並不能說QQ的通信是不安全的,因為程序員可以手動對UDP的數據收發進行驗證,比如發送方對每個數據包進行編號然後由接收方進行驗證啊什麼的,即使是這樣,UDP因為在底層協議的封裝上沒有採用類似TCP的「三次握手」而實現了TCP所無法達到的傳輸效率。
4. java socket 使用方法
Socket.getPort(); // 獲取客戶端的埠
Socket.getInetAddress(); //獲取客戶端的地址信息返回InetAddress對象
InetAddress對象裡面都是你要的信息,具體可以查JDK文檔
5. java項目如何調用獨立socket客戶端項目
可以實現啊。。。你直接用你的java項目 引用你的socket項目就可以用你的socket裡面的方法了。。。(在 eclipse 開發階段)
發布以後,就把你的socket項目的.jar文件,拷貝到你的java項目就行了啊
並且最好把socket中要用的東西,單獨分到一個.jar,這樣可以更好的管理啊。。
6. java簡答題 如何創建socket連接的過程
java socket建立連接的過程如下:
socket
1、 首先調用Socket類的構造函數,以伺服器的指定的IP地址或指定的主機名和指定的埠號為參數,創建一個Socket流,在創建Socket流的過程中包含了向伺服器請求建立通訊連接的過程實現。
2、 建立了客戶端通訊Socket後。就可以使用Socket的方法getInputStream()和getOutputStream()來創建輸入/輸出流。這樣,使用Socket類後,網路輸入輸出也轉化為使用流對象的過程。
3、 使用輸入輸出流對象的相應方法讀寫位元組流數據,因為流連接著通訊所用的Socket,Socket又是和伺服器端建立連接的一個端點,因此數據將通過連接從伺服器得到或發向伺服器。這時我們就可以對位元組流數據按客戶端和伺服器之間的協議進行處理,完成雙方的通訊任務。
4、 待通訊任務完畢後,我們用流對象的close()方法來關閉用於網路通訊的輸入輸出流,在用Socket對象的close()方法來關閉Socket。
7. java 中的socket 是不是從哪個埠發出客戶端請求就從這個埠接收數據
一、建立伺服器類
Java中有一個專門用來建立Socket伺服器的類,名叫ServerSocket,可以用伺服器需要使用的埠號作為參數來創建伺服器對象。
ServerSocket server = new ServerSocket(9998)
這條語句創建了一個伺服器對象,這個伺服器使用9998號埠即在埠9998上注冊服務,這里稍微要注意的是埠的分配必須是唯一的。因為埠是為了唯一標識每台計算機唯一服務的,另外埠號是從0~65535之間的,前1024個埠已經被Tcp/Ip 作為保留埠,因此你所分配的埠只能是1024個之後的。當一個客戶端程序建立一個Socket連接,所連接的埠號為9998時,伺服器對象server便響應這個連接,並且server.accept()方法會創建一個Socket對象。伺服器端便可以利用這個Socket對象與客戶進行通訊。
Socket incoming = server.accept() ; // 監聽窗口,等待連接
進而得到輸入流和輸出流,並進行封裝
BufferedReader in = new BufferedReader(new
InputStreamReader(incoming.getInputStream()));
/*
當讀取文件時,先把內容讀到緩存中,當調用in.readLine()時,再從緩存中以字元的方式讀取數據(以下簡稱「緩存位元組讀取方式」)。
*/
PrintWriter ut = new PrintWriter(incoming.getOutputStream(),true);
隨後,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發送數據。從而可以根據程序的需要對客戶端的不同請求進行回應。
在所有通訊結束以後應該關閉這兩個數據流,關閉的順序是先關閉輸出流,再關閉輸入流,即使用
out.close();
in.close();
二、建立客戶端代碼
相比伺服器端,客戶端要簡單一些,客戶端只需用伺服器所在機器的ip以及伺服器的埠作為參數創建一個Socket對象。得到這個對象後,就可以用"建立伺服器"部分介紹的方法實現數據的輸入和輸出。
Socket socket = new Socket("168.160.12.42",9998);
或:
Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主機名為InetAddress.getLocalHost()的伺服器申請連接
客戶機必須知道有關伺服器的IP地址,對於著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供,它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法。
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
以上的程序代碼建立了一個Socket對象,這個對象連接到ip地址為168.160.12.42的主機上、埠為9998的伺服器對象。並且建立了輸入流和輸出流,分別對應伺服器的輸出和客戶端的寫入。
8. java Socket通信原理
具體如下:
首先socket 通信是基於TCP/IP 網路層上的一種傳送方式,我們通常把TCP和UDP稱為傳輸層。其中UDP是一種面向無連接的傳輸層協議。UDP不關心對端是否真正收到了傳送過去的數據。
如果需要檢查對端是否收到分組數據包,或者對端是否連接到網路,則需要在應用程序中實現。UDP常用在分組數據較少或多播、廣播通信以及視頻通信等多媒體領域。
在這里我們不進行詳細討論,這里主要講解的是基於TCP/IP協議下的socket通信。
socket是基於應用服務與TCP/IP通信之間的一個抽象,他將TCP/IP協議裡面復雜的通信邏輯進行分裝。
服務端初始化ServerSocket,然後對指定的埠進行綁定,接著對埠及進行監聽,通過調用accept方法阻塞。
此時,如果客戶端有一個socket連接到服務端,那麼服務端通過監聽和accept方法可以與客戶端進行連接。
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。
Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
9. java的socket通信
socket=server.accept();這句話會造成線程阻塞,程序將在這句話停止運行,直到有連接請求
reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));這句話只是定義了一個讀取Socket緩沖區數據的介面,並沒有實際讀取數據
getMessage();這句話是讀取Socket緩沖區數據的操作方法,程序將在這句話停止運行,直到有數據被讀到
所以盡管放心運行JAVA程序,當客戶端發出數據,並且服務端接收到後,程序才會從getMessage();繼續運行下去