前言:
本文補充一下Java關於套接字方面的內容,因為其應用相對比較簡單,所以下面介紹兩個程序實例。
---------------------------------------------------------------------------------------
1.Socket對接過程
(注:這是之前在網上見過一張圖片,大致過程還是比較清晰的)
分析:
- Socket對接之后的數據傳送類似於文件的讀寫;
- 流套接字采用TCP傳輸數據流,一旦數據發送失敗將重傳,所以具有安全無損的特點。
2.實例一【Server->Client(1:1)】
1 package socket; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.net.Inet4Address; 7 import java.net.InetAddress; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 import java.util.Date; 11 12 public class Server { 13 14 public Server(){ 15 try { 16 //服務端開啟端口8000 17 ServerSocket serverSocket = new ServerSocket(8000); 18 System.out.println("server start at:"+new Date()); 19 //等待客戶端相應 20 Socket socket = serverSocket.accept(); 21 InetAddress address = socket.getInetAddress(); 22 System.out.println("connected with address:"+address.getHostAddress()); 23 DataInputStream input = new DataInputStream(socket.getInputStream()); 24 DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 25 26 //while(true){ 27 int num = input.readInt(); 28 System.out.println(num); 29 //} 30 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 } 35 36 public static void main(String[] args) { 37 new Server(); 38 } 39 40 }
1 package socket; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.net.Socket; 6 7 public class Client { 8 public static void main(String[] args) throws Exception { 9 10 System.out.println("--client--"); 11 12 //Socket(,)內參數分別設為服務端IP和端口 13 Socket socket = new Socket("localhost", 8000); 14 15 DataInputStream input = new DataInputStream(socket.getInputStream()); 16 DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 17 18 int x = 222; 19 output.writeInt(x); 20 System.out.println("data convented:"+x); 21 } 22 }
服務端輸出(執行之后顯示紅點,表示等待中...):
server start at:Sat Aug 15 19:39:40 CST 2015
connected with address:127.0.0.1
222
客戶端輸出:
--client--
data convented:222
3.實例二【Server->Client(1:n)】
1 package socket; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.net.InetAddress; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 import java.util.Date; 9 10 public class SuperServer { 11 private int countOfClient=0; 12 public SuperServer() { 13 try { 14 ServerSocket serverSocket = new ServerSocket(8000); 15 System.out.println("server start at:" + new Date()); 16 17 while (true) { 18 Socket socket = serverSocket.accept(); 19 InetAddress address = socket.getInetAddress(); 20 System.out.println("connected with address:" 21 + address.getHostAddress()); 22 //為每一位Client創建一個單獨的線程 23 new Thread(new ConnectTask(socket)).start(); 24 countOfClient++; 25 System.out.println("this is the "+countOfClient + "(th) of client. "); 26 } 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 31 } 32 33 public static void main(String[] args) { 34 new SuperServer(); 35 } 36 37 class ConnectTask implements Runnable { 38 private Socket socket = null; 39 40 public ConnectTask(Socket socket) { 41 this.socket = socket; 42 } 43 44 @Override 45 public void run() { 46 try { 47 DataInputStream input = new DataInputStream( 48 socket.getInputStream()); 49 DataOutputStream output = new DataOutputStream( 50 socket.getOutputStream()); 51 52 int numFromClient = input.readInt(); 53 System.out.println("number from client:"+numFromClient); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } 57 } 58 59 } 60 61 }
以上代碼中,服務端創建多線程,給每一個對接的客戶端分一個獨立的線程;客戶端代碼不變,還是實例一的代碼。程序輸出跟實例一近似,只不過這是服務端一直運行着,可供多個客戶端連接。(因為獨立分配線程,程序運行時資源比較浪費,所以代碼僅供參考,有待優化!)