本篇內(nèi)容介紹了“如何理解Java socket編程”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)長期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為灣里企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、網(wǎng)站建設(shè),灣里網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
介紹
socket通常也被稱作”套接字“,用于描述IP地址和端口,是一個通信鏈的句柄;同時 socket 的通信是基于TCP/IP 網(wǎng)絡(luò)層上的一種傳送方式,我們通常把TCP和UDP稱為傳輸層 。 下面就通過 socket通信的基本原理和示例帶大家認(rèn)識一下吧!
socket通信基本原理
上面介紹說了,socket通信是基于TCP/IP 協(xié)議,屬于傳輸層協(xié)議,如下圖所示:
同時socket是基于應(yīng)用服務(wù)與TCP/IP通信之間的一個抽象,他將TCP/IP協(xié)議里面復(fù)雜的通信邏輯進(jìn)行分裝,對用戶來說,只要通過一組簡單的API就可以實現(xiàn)網(wǎng)絡(luò)的連接。首先,服務(wù)端初始化ServerSocket,然后對指定的端口進(jìn)行綁定,接著對端口及進(jìn)行監(jiān)聽,通過調(diào)用accept方法阻塞;此時,如果客戶端有一個socket連接到服務(wù)端,那么服務(wù)端通過監(jiān)聽和accept方法可以與客戶端進(jìn)行連接。如下圖所示:
基本示例
服務(wù)器端 :監(jiān)聽一個端口,等待連接的到來
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws Exception {
// 監(jiān)聽指定的端口
int port = 55533;
ServerSocket server = new ServerSocket(port);
// server將一直等待連接的到來
System.out.println("server將一直等待連接的到來");
Socket socket = server.accept();
// 建立好連接后,從socket中獲取輸入流,并建立緩沖區(qū)進(jìn)行讀取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("get message from client: " + sb);
inputStream.close();
socket.close();
server.close();
}
}
客戶端:通過ip和端口,連接到指定的server,然后通過Socket獲得輸出流,并向其輸出內(nèi)容,服務(wù)器會獲得消息。最終服務(wù)端控制臺打印消息
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
public static void main(String args[]) throws Exception {
// 要連接的服務(wù)端IP地址和端口
String host = "127.0.0.1";
int port = 55533;
// 與服務(wù)端建立連接
Socket socket = new Socket(host, port);
// 建立連接后獲得輸出流
OutputStream outputStream = socket.getOutputStream();
String message="你好";
socket.getOutputStream().write(message.getBytes("UTF-8"));
outputStream.close();
socket.close();
}
}
上面這個例子是單向的發(fā)送消息的例子,通常是有問必答,是雙向的。可參考如下例子:
雙向通信-服務(wù)器端:比上面不同的是當(dāng)讀取完客戶端的消息后,打開輸出流,將指定消息發(fā)送回客戶端
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws Exception {
// 監(jiān)聽指定的端口
int port = 55533;
ServerSocket server = new ServerSocket(port);
// server將一直等待連接的到來
System.out.println("server將一直等待連接的到來");
Socket socket = server.accept();
// 建立好連接后,從socket中獲取輸入流,并建立緩沖區(qū)進(jìn)行讀取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
//只有當(dāng)客戶端關(guān)閉它的輸出流的時候,服務(wù)端才能取得結(jié)尾的-1
while ((len = inputStream.read(bytes)) != -1) {
// 注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.println("get message from client: " + sb);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello Client,I get the message.".getBytes("UTF-8"));
inputStream.close();
outputStream.close();
socket.close();
server.close();
}
}
雙向通信-客戶器端 :比上面不同的是在發(fā)送完消息時,調(diào)用關(guān)閉輸出流方法,然后打開輸出流,等候服務(wù)端的消息
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
public static void main(String args[]) throws Exception {
// 要連接的服務(wù)端IP地址和端口
String host = "127.0.0.1";
int port = 55533;
// 與服務(wù)端建立連接
Socket socket = new Socket(host, port);
// 建立連接后獲得輸出流
OutputStream outputStream = socket.getOutputStream();
String message = "你好 yiwangzhibujian";
socket.getOutputStream().write(message.getBytes("UTF-8"));
//通過shutdownOutput高速服務(wù)器已經(jīng)發(fā)送完數(shù)據(jù),后續(xù)只能接受數(shù)據(jù)
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("get message from server: " + sb);
inputStream.close();
outputStream.close();
socket.close();
}
}
注意事項
在使用socket編程時,要注意告知對方已發(fā)送完命令,需使用如下方式:
方式一:通過Socket關(guān)閉 (注:客戶端Socket關(guān)閉后,將不能接受服務(wù)端發(fā)送的消息,也不能再次發(fā)送消息;如果客戶端想再次發(fā)送消息,需要重現(xiàn)創(chuàng)建Socket連接);
方式二:通過Socket關(guān)閉輸出流的方式;
方式三:通過約定符號;
方式四:通過特定長度;
“如何理解Java socket編程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!