其實網絡編程時很重要的,當初我也沒好好去學,現在也因爲一直沒接觸到,也沒想着去看,今天無聊,就閒着看了看。
首先看下通訊的流程。
接下來我們來簡單實現一下:
先看圖有個基本的瞭解:
接下來我們就用兩個類簡單模擬一下客戶端與服務端:
先看客戶端類:
Client:
package com.socket.demo;
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.Socket;
import java.net.UnknownHostException;
/**
* 客戶端
* @author lolli
*
*/
public class Client {
public static void main(String[] args) {
try {
// 實例化一個Socket,請求8888端口
Socket socket = new Socket("localhost", 8888);
// 獲取一個輸出流像服務端發送消息
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream);
out.write("用戶名:admin; 密碼:123456");
// 刷新緩存 ,發送請求
out.flush();
socket.shutdownOutput();
// 獲取一個輸入流,接受服務端的響應
InputStream in = socket.getInputStream();
// 轉換成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入緩衝流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 獲取客戶端請求的數據
String str = "";
while((str = bufferedReader.readLine())!=null){
// 打印客戶端請求的數據
System.out.println("我是客戶端,服務端說: " + str);
}
socket.shutdownInput();
// 關閉流
out.close();
outputStream.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
再看看服務端:
Server:
package com.socket.demo;
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 lolli
*
*/
public class Server {
public static void main(String[] args) {
try {
// 實例化一個ServerSocket,監聽8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("***** 啓動服務器,等待客戶端的連接請求 ******");
Socket socket = serverSocket.accept();
// 接收輸入流(字節流)
InputStream in = socket.getInputStream();
// 轉換成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入緩衝流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 獲取客戶端請求的數據
String str = "";
String data = "";
while((str = bufferedReader.readLine())!=null){
// 打印客戶端請求的數據
System.out.println("我是服務端,客戶端說: " + str);
data = str;
}
System.out.println(str);
// 接收到客戶端請求的數據後相應客戶端
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream);
out.write("接收到了客戶端傳遞的數據,數據爲:‘" + data + "’");
out.flush();
socket.shutdownInput();
socket.shutdownOutput();
// 關閉流
bufferedReader.close();
inputStreamReader.close();
in.close();
socket.close();
serverSocket.close();
out.close();
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
再看看控制檯的簡單打印:
先看服務端的控制檯:
在看看客戶端的控制檯:
這裏值得注意的是,我們必須先啓動服務端,客戶端才能去請求。先啓動服務端,然後通過serverSocket.accept();來監聽客戶端的請求