Java新人之路 -- Java中的Socket
阿新 • • 發佈:2020-12-11
技術標籤:java
Socket程式設計
Socket的英文原義是“孔”或“插座”。
Socket類(套接字)可以看成是兩個網路應用程式進行通訊時,各自通訊連線中的端點。當然,Socket也可以提供多個埠的連線服務
資料傳輸其實就是客戶端到服務端,服務端到客戶端的一個過程,資料是以流的形式進行傳輸的
特點:基於TCP連線,更安全所以適合應用於即時通訊
流程: 以客戶端(client)及服務端(server)為例
- server執行開始監聽
- client執行發出請求
- 建立連線開始通訊
以聊天功能為例
- 客戶端程式碼
public class Client {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
OutputStreamWriter osw = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
while (true) {
// 建立客戶端物件,設定傳送的地址及埠號
socket = new Socket("172.16.4.127", 5555);
// 從控制檯獲取要傳送的內容
Scanner scan = new Scanner(System.in);
String sendContent = scan.nextLine();
// 將要傳送的內容通過輸出流的形式進行寫的操作
os = socket.getOutputStream();
// 將位元組流轉為字元流進行寫的操作(當中會寫字串)
osw = new OutputStreamWriter(os);
// 進行寫的操作
osw.write(sendContent);
// 重新整理流
osw.flush();
// 告訴伺服器寫完了,請求接收
socket.shutdownOutput();
// 以下為獲取服務端的反饋
// 從socket中獲取輸入流物件
is = socket.getInputStream();
// 從位元組流轉為字元流進行讀取
isr = new InputStreamReader(is);
// 使用字元緩衝流進行讀取操作
br = new BufferedReader(isr);
String getContent = null;
while ((getContent = br.readLine()) != null) {
System.out.println(getContent);
}
// 結束判斷
if (sendContent.equals("Over!")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
if (osw != null) {
osw.close();
}
if (os != null) {
os.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 服務端
public class Server {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
OutputStreamWriter osw = null;
try {
// 1.建立服務端的Socket物件
serverSocket = new ServerSocket(5555);
while (true) {
// 2.監聽對應埠號下的所有應用
socket = serverSocket.accept();
// 3.獲取客戶端傳送過來的訊息
is = socket.getInputStream();
// 3.1將位元組流轉換為字元流進行讀操作
isr = new InputStreamReader(is);
// 3.2使用字元緩衝流處理讀取重複的問題
br = new BufferedReader(isr);
String readContent = null;
while ((readContent = br.readLine()) != null) {
System.out.println(readContent);
}
// 給客戶端返回資訊
// 4.1 從Socket中獲取輸出流
os = socket.getOutputStream();
// 4.2 將位元組輸出流轉換為字元輸出流
osw = new OutputStreamWriter(os);
Scanner scan = new Scanner(System.in);
String rebackContent = scan.nextLine();
osw.write(rebackContent);
osw.flush();
socket.shutdownOutput();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (osw != null) {
osw.close();
}
if (os != null) {
os.close();
}
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
if (socket != null) {
socket.close();
}
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
結果