Java套接字


前言: 

  本文補充一下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 }

  以上代碼中,服務端創建多線程,給每一個對接的客戶端分一個獨立的線程;客戶端代碼不變,還是實例一的代碼。程序輸出跟實例一近似,只不過這是服務端一直運行着,可供多個客戶端連接。(因為獨立分配線程,程序運行時資源比較浪費,所以代碼僅供參考,有待優化!)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM