1、具體實現步驟
2、客戶端
public class SocketTcpClient {
public static final int PORT = 2000;
public static void main(String[] args) throws IOException {
// 1、創建socket對象
Socket socket = new Socket();
// 設置超時 (表示如果對方連接狀態10秒沒有收到數據的話強制斷開客戶端)
socket.setSoTimeout(5000);
// 建立連接,設置服務端ip和端口,並設置連接超時5秒
InetAddress localHost = Inet4Address.getLocalHost();
System.out.println("服務器端ip=" + localHost.getHostAddress() + ",port=" + PORT);
socket.connect(new InetSocketAddress(localHost, PORT), 5000);
System.out.println("開始連接....");
System.out.println("客戶端 ip=" + socket.getLocalAddress() + ",port=" + socket.getLocalPort());
System.out.println("服務端 ip=" + socket.getInetAddress() + ",port=" + socket.getPort());
todo(socket);
}
private static void todo(Socket socket) {
boolean tag = true;
try {
// 從鍵盤獲取流
InputStream in = System.in;
BufferedReader keyboardInputReader = new BufferedReader(new InputStreamReader(in));
// socket 輸入流
InputStream inputStream = socket.getInputStream();
BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(inputStream));
// 獲取 socket 輸出流
OutputStream outputStream = socket.getOutputStream();
PrintStream outPrintStream = new PrintStream(outputStream);
do {
// 數據寫入到服務端
String line = keyboardInputReader.readLine();
outPrintStream.println(line);
// 服務端返回數據
String serverDataStr = inputStreamReader.readLine();
if (serverDataStr.equalsIgnoreCase("bye")) {
System.out.println("服務端回覆 : bye");
tag = false;
} else {
System.out.println("服務端回覆 : " + serverDataStr);
}
} while (tag);
inputStreamReader.close();
outPrintStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 關閉客戶端
socket.close();
System.out.println("客戶端關閉");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、服務端
public class SocketTcpServer {
public static void main(String[] args) throws IOException {
// 1、創建serverSocket
ServerSocket serverSocket = new ServerSocket(2000);
System.out.println("服務端開啓,等待客戶端加入");
while (true) {
// 等待連接
Socket socket = serverSocket.accept();
System.out.println("ip=" + socket.getInetAddress() + ",port=" + socket.getPort() + " 客戶端加入");
new ClientHandler(socket).start();
}
}
public static class ClientHandler extends Thread {
private Socket mServerSocket;
private boolean tag = true;
private ClientHandler(Socket socket) {
mServerSocket = socket;
}
@Override
public void run() {
super.run();
try {
// 獲取輸出流
OutputStream outputStream = mServerSocket.getOutputStream();
PrintStream outPrintStream = new PrintStream(outputStream);
// 獲取輸入流
InputStream inputStream = mServerSocket.getInputStream();
BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(inputStream));
do {
// 獲取客戶端發送數據
String clientData = inputStreamReader.readLine();
if (clientData.equalsIgnoreCase("bye")) {
tag = false;
System.out.println("客戶端發送數據 : bye");
outPrintStream.println("bye");
} else {
System.out.println("客戶端發送數據 : " + clientData);
outPrintStream.println("你發送字符長度爲" + clientData.length());
}
} while (tag);
outPrintStream.close();
inputStreamReader.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("連接異常斷開");
} finally {
try {
mServerSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("ip=" + mServerSocket.getInetAddress() + ",port=" + mServerSocket.getPort() + " 客戶端退出");
}
}
}
4、運行結果貼圖