最簡單的socket通訊伺服器和客戶端
阿新 • • 發佈:2019-01-06
底部附上了效果圖 伺服器程式碼: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(2000); System.out.println("伺服器準備就緒"); //System.out.println("client: "+ socket.getLocalAddress() + " p : " + socket.getLocalPort()); System.out.println("伺服器資訊 : " + serverSocket.getInetAddress() + " p : " + serverSocket.getLocalPort()); //等待客戶端連線 while (true) { Socket client = serverSocket.accept(); ClientHandler clientHandler = new ClientHandler(client); clientHandler.start(); } } private static class ClientHandler extends Thread{ private Socket socket; ClientHandler(Socket socket){ this.socket = socket; } private boolean flag = true; @Override public void run() { //super.run(); System.out.println("新客戶端連線: " + socket.getInetAddress() + "p: " + socket.getPort()); try { //得到列印流,用於資料輸出;伺服器回送資料使用 PrintStream soketOutput = new PrintStream(socket.getOutputStream()); //得到輸入流,用於接收資料 BufferedReader socketInput = new BufferedReader( new InputStreamReader(socket.getInputStream())); do { //客戶端拿到一條資料 String str = socketInput.readLine(); //String echo = socketInput.readLine(); if ("bye".equalsIgnoreCase(str)) { flag = false; soketOutput.println("bye"); }else { //列印到螢幕,並回送資料長度 System.out.println(str); soketOutput.println("回送: " + str.length()); } }while (flag); socketInput.close(); soketOutput.close(); } catch (IOException e) { System.out.println("連線異常斷開"); }finally { //連線關閉 try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("客戶端已退出: " + socket.getInetAddress() + " p : " + socket.getPort()); } } } 客戶端程式碼: import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket(); socket.setSoTimeout(3000); //連線本地,埠2000;超時時間為3000ms socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000), 3000); System.out.println("伺服器已連線"); System.out.println("client: "+ socket.getLocalAddress() + " p : " + socket.getLocalPort()); System.out.println("伺服器資訊 : " + socket.getInetAddress() + " p : " + socket.getPort()); try { todo(socket); }catch (Exception e){ System.out.println("關閉異常"); } socket.close(); System.out.println("客戶端已退出"); } private static void todo(Socket client) throws IOException{ InputStream in = System.in; BufferedReader input = new BufferedReader(new InputStreamReader(in)); //得到soket輸出流,並轉換為列印流 OutputStream outputStream = client.getOutputStream(); PrintStream sockePrintStream = new PrintStream(outputStream); // 得到sokcet輸入流,並轉換為socketBufferReader InputStream inputStream = client.getInputStream(); BufferedReader sokcetBufferedReader = new BufferedReader(new InputStreamReader(inputStream)); boolean flag = true; do { //鍵盤讀取一行 String str = input.readLine(); //傳送到伺服器 sockePrintStream.println(str); //從伺服器讀取一行 String echo = sokcetBufferedReader.readLine(); if ("bye".equalsIgnoreCase(echo)) { flag = false; }else { System.out.println(echo); } }while (flag); //關閉socket流 sockePrintStream.close(); sokcetBufferedReader.close(); } }