標籤:傳輸 處理 buffere system info 密碼 ++ import public
基於TCP的Socket通訊:
伺服器端:
- 建立一個伺服器端Socket,即ServerSocket,指定綁定的連接埠,並監聽此連接埠
- 調用accept()方法開始監聽,等待用戶端的串連
- 串連建立後,通過輸入資料流讀取客戶發送的請求資訊
- 通過輸出資料流向用戶端發送響應資訊
- 關閉相關資源
用戶端:
- 建立用戶端Socket,指定伺服器位址和連接埠
- 串連建立後,通過輸出資料流,向伺服器端發送資訊
- 擷取輸入資料流,並讀取伺服器端的響應資訊
- 關閉資源
例:伺服器端:
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.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class Server { public static void main(String[] args) { try { //1.建立一個伺服器端Socket,即ServerSocket,指定綁定的連接埠,並監聽此連接埠 ServerSocket serverSocket=new ServerSocket(8888); Socket socket=null; //記錄用戶端的數量 int count=0; System.out.println("***伺服器即將啟動,等待用戶端的串連***"); //迴圈監聽等待用戶端的串連 while(true){ //調用accept()方法開始監聽,等待用戶端的串連 socket=serverSocket.accept(); //建立一個新的線程 ServerThread serverThread=new ServerThread(socket); //啟動線程 serverThread.start(); count++;//統計用戶端的數量 System.out.println("用戶端的數量:"+count); InetAddress address=socket.getInetAddress(); System.out.println("當前用戶端的IP:"+address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } }}
用戶端:
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;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("使用者名稱:alice;密碼:789"); 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("我是用戶端,伺服器說:"+info); } //4.關閉資源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
伺服器線程處理類:
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;public class ServerThread extends Thread { // 和本線程相關的Socket Socket socket = null; public ServerThread(Socket socket) { this.socket = socket; } //線程執行的操作,響應用戶端的請求 public void run(){ InputStream is=null; InputStreamReader isr=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; try { //擷取輸入資料流,並讀取用戶端資訊 is = socket.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); String info=null; while((info=br.readLine())!=null){//迴圈讀取用戶端的資訊 System.out.println("我是伺服器,用戶端說:"+info); } socket.shutdownInput();//關閉輸入資料流 //擷取輸出資料流,響應用戶端的請求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("歡迎您!"); pw.flush();//調用flush()方法將緩衝輸出 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //關閉資源 try { if(pw!=null) pw.close(); if(os!=null) os.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); if(is!=null) is.close(); if(socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } }}
使用TCP通訊傳輸對象:
ObjectOutputStream oos=new ObjectOutputStream(os);
User user=new User(“admin”,”123”);//封裝為對象
oos.writeObject(user);//序列化
Tips:
優先順序問題:serverthread.setPriority();//降低優先順序,以防運行速度較慢
輸入輸出資料流問題:同一個Socket,關閉輸出資料流則會關閉與之關聯的Socket,所以不用關閉輸出資料流,最後關閉Socket即可。
Java Socket編程之TCP