socket是基于TCP/IP協定的一種用戶端與伺服器端通信交流的一種重要的手段:
下面實作的是一個用戶端,對伺服器發送請求,用戶端收到服務端的回複!
第一步:建立一個java Project 如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQWZ1MmNzIDO5YzN50SZ5UWYtMWZ0MTL1cDZ00iM1UDZ3EWYl9CXwMjN38CXwITMw8CX05WZth2YhRHdh9CXkF2bsBXdvwVbvNmLllXZ0lmLywGZvw1LcpDc0RHaiojIsJye.png)
第二步:伺服器端的代碼如下:
package com.socket.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 伺服器端
*
* @author lfc 對于這個用戶端以及服務端,運作的時候,必須先服務端開始運作起來,開始監聽用戶端的程式請求
* 現在傳遞的隻是一個字元串
*/
public class SocketServer {
public static void main(String[] args) {
System.out.println("伺服器端準備好監聽用戶端的請求了。。。");
try {
// 1:建立一個服務端的ServerScoket,綁定端口開始監聽
ServerSocket serverScoket = new ServerSocket(8800);
// 2:使用accept()方法阻塞等待連接配接,獲得新的連接配接
Socket socket = serverScoket.accept();
// 3:獲得輸入流
InputStream is = socket.getInputStream();
// 包裝下變成字元流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//建立輸出流,用來給用戶端提示的響應資訊
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
// 4:讀取使用者輸入的資訊
String info = null;
while (!((info = br.readLine()) == null)) {
System.out.println("我是伺服器列印出來的内容,用戶端輸入的内容是:\n" + info);
}
//給用戶端的回應資訊
String response="用戶端已經收到你們的資訊了,Success";
pw.write(response);
pw.flush();
// 5:關閉資源,注意,關閉的時候,要從底部開始往上依次關閉,順序不能錯!
os.close();
pw.close();
br.close();
is.close();
socket.close();
serverScoket.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("本次服務端監聽結束!。。。");
}
}
第三步:編寫伺服器端的代碼如下:
package com.socket.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 用戶端
*
* @author lfc
*
*/
public class loginClient {
public static void main(String[] args) throws UnknownHostException {
try {
// 1,建立serverScoket用戶端,綁定伺服器端的ip以及端口
Socket scoket = new Socket("localhost", 8800);
// 2,得到scoket讀寫流
OutputStream os = scoket.getOutputStream();
// 獲得輸入流
InputStream is = scoket.getInputStream();
// 包裝下變成字元流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 3,利用一定的協定對scoket中的對讀寫操作
PrintWriter pw = new PrintWriter(os);
String info = "使用者名是:tom,密碼是:123456 ";
pw.write(info);
pw.flush();
//需要先關閉,一定要記得先關閉
scoket.shutdownOutput();
//接收并顯示收到伺服器端傳回的資訊!
String answer = null;
while (!((answer = br.readLine()) == null)) {
System.out.println("我是伺服器端接收并且給傳回的資訊:\n" + answer);
}
// 4,關閉流
br.close();
is.close();
pw.close();
os.close();
scoket.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("用戶端請求完畢!");
}
}
第四步:ctrl+f11運作服務端的代碼,運作服務端的代碼後如下:
第五步:運作用戶端的代碼 ctrl+f11 如下圖:
第六步:我們再打開伺服器端的控制台列印資訊如下圖所示:
備注:對于本次的代碼,有一個比較大的缺點是,java是面向對象程式設計的,這裡是一個字元串,不是一個對象,在socket程式設計中,實作面向對象程式設計,傳遞的是一個對象。