基於TCP協議的Socket通訊 實現使用者登入 以及服務端的相應
阿新 • • 發佈:2019-01-11
服務端
package com.example; 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; /** * Created by ChenHe on 2016/10/28. * 基於TCP協議的Socket通訊,實現使用者登入 * 服務端 */ public class Server { public static void main(String[] args){ try { //1.建立一個服務端Socket,即ServerSocket,指定繫結的埠,並且監聽埠 ServerSocket serverSocket = new ServerSocket(8888); //2.呼叫accept()方法開始監聽,等待客戶端的連線 System.out.println("***i am server let us begin***"); Socket socket = serverSocket.accept();//3.獲取輸入流,並讀取客戶端資訊 InputStream is = socket.getInputStream();//位元組輸入流 InputStreamReader isr = new InputStreamReader(is);//將位元組流轉換為字元流 BufferedReader br = new BufferedReader(isr);//為字元流新增緩衝 String info = null; while ((info = br.readLine())!=null){//迴圈讀取客戶端的資訊 System.out.println("The client say:"+info);} socket.shutdownInput();//關閉輸入流 //4.獲取輸出流,相應客戶端的請求 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os);//包裝為列印流 pw.write("Welcome !!!"); pw.flush();//呼叫flush()方法將緩衝輸出 //5.關閉資源 pw.close(); os.close(); br.close(); isr.close(); is.close(); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
伺服器列印資料
***i am server let us begin***
The client say錛�UserName: admin;PassWorld錛�123
Process finished with exit code 0
客戶端
package com.example; 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; /** * Created by ChenHe on 2016/10/28 * 客戶端. */ public class Client { public static void main(String[] args){ try { //1.建立客戶端Socket,指定服務區地址和埠 Socket socket = new Socket("localhost",8888); //2.獲取輸出流,向服務端傳送資訊 OutputStream os = socket.getOutputStream();//位元組輸出流 PrintWriter pw = new PrintWriter(os);//將輸出流包裝為列印流 pw.write("UserName: admin;PassWorld:123"); pw.flush();//重新整理 socket.shutdownOutput();//關閉輸出流 //3.獲取輸入流,並讀取服務端的相應資訊 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while ((info = br.readLine())!=null){ System.out.println("i am client,server say:"+info); } //4.關閉資源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
客戶端列印資料
i am client,server say:Welcome !!!
實現多執行緒訪問
package com.example; 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; /** * Created by ChenHe on 2016/10/28. * 伺服器執行緒處理類 */ public class ServerThread extends Thread { Socket socket = null; public ServerThread(Socket socket){ this.socket = socket; } //執行緒執行的操作,相應客戶端的請求 public void run(){ InputStream is = null;//位元組輸入流 InputStreamReader isr = null;//將位元組流轉換為字元流 BufferedReader br = null;//為字元流新增緩衝 PrintWriter pw = null; OutputStream os = null; try { //3.獲取輸入流,並讀取客戶端資訊 is = socket.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); String info = null; while ((info = br.readLine())!=null){//迴圈讀取客戶端的資訊 System.out.println("The client say:"+info); } socket.shutdownInput();//關閉輸入流 //4.獲取輸出流,相應客戶端的請求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("Welcome !!!"); pw.flush();//呼叫flush()方法將緩衝輸出 } catch (IOException e) { e.printStackTrace(); }finally { //5.關閉資源 try { pw.close(); os.close(); br.close(); isr.close(); is.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
服務端呼叫方法
//迴圈監聽客戶端的連線 while (true) { //呼叫accept()方法開始監聽,等待客戶端的連線 socket = serverSocket.accept(); //建立一個新的執行緒 ServerThread serverThread = new ServerThread(socket); //啟動執行緒 serverThread.start(); count++; System.out.println("connect count:"+count); InetAddress address = socket.getInetAddress(); System.out.println("ip:"+address); }