參考資料:https://www.cnblogs.com/goodboy-heyang/p/6372058.html
Socket通信實現步驟:1、創建ServerSocket和Socket(client)。2、打開連接到Socket的輸入/輸出流。3、按照協議對Socket進行讀/寫操作。4、關閉輸入輸出流、關閉Socket。
一定有兩個不同的Socket(要麼ip不同,要麼port不同)才能通信!!!
1 創建服務端
1、創建ServerSocket對象,綁定監聽端口。 new ServerSocket(8888)
2、通過accept()方法監聽客戶端請求。 Socket socket = serverSocket.accept()
3、鏈接建立後,通過輸入流讀取客戶端發送的請求信息。 socket.getInputStream();
4、通過輸出流向客戶端發送響應信息。 socket.getOutputStream()
5、關閉相關資源。
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while (true)
{
// 阻塞 直到有socket連接serverSocket
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();// 得到一個輸入流,接收客戶端傳遞的信息
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);// 提高效率,將自己字節流轉爲字符流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);// 加入緩衝區
CharBuffer charBuffer = CharBuffer.allocate(1024);
while (bufferedReader.read(charBuffer) != -1) {
charBuffer.flip();
char[] inc = new char[charBuffer.limit()];
System.out.println("已接收到客戶端連接");
charBuffer.get(inc);
System.out.println(Thread.currentThread().getName() + "服務端接收到客戶端信息:" + new String(inc)
+ ",當前客戶端ip爲:" + socket.getInetAddress().getHostAddress());
charBuffer.clear();
}
}
}
}
2 創建客戶端
1、創建Socket對象,指明需要連接的服務器的地址和端口號。 new Socket(“localhost”,8888) 相當於connect localhost:8888 但自身的socket對應端口肯定不是8888,由socket.getLocalPort()獲取,隨機產生(如62572)
2、連接建立後,通過輸出流向服務器端發送請求信息。 socket.getOutputStream()
3、通過輸入流獲取服務器響應的信息。 socket.getInputStream()
4、關閉相關資源。
public class Client {
public static void main(String[] args) {
// 1、創建客戶端Socket,指定服務器地址和端口
try {
Socket socket = new Socket("localhost", 8888);
// 2、獲取輸出流,向服務器端發送信息
OutputStream os = socket.getOutputStream();// 獲取字節輸出流
// 將輸出流包裝爲打印流
PrintWriter pw = new PrintWriter(os);
pw.write("用戶名:admin 密碼:123");
pw.flush();
while(true){
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
CharBuffer cb = CharBuffer.allocate(1024);
int rs = br.read(cb);
if(rs>0){
cb.flip();
char[] c = new char[cb.limit()];
cb.get(c);
System.out.println("接收來自服務端的消息:"+new String(c));
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}