Socket和DatagramSocket的區別


簡而言之就是:

Socket使用的tcp連接,需要先連接之后才能發送數據。

DatagramSocket使用的UDP連接,客戶端不需要先連接數據,可以直接發送給指定服務端。

DatagramSocket:

客戶端發送(直接發送數據,沒有連接的過程):

[Java]  純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
protected void connectServerWithUDPSocket(Context context, String id) {
 
         DatagramSocket socket;
 
         try {
 
             //創建DatagramSocket對象並指定一個端口號,注意,如果客戶端需要接收服務器的返回數據,
 
             //還需要使用這個端口號來receive,所以一定要記住
 
             socket = new DatagramSocket( null );
 
             //使用InetAddress(Inet4Address).getByName把IP地址轉換為網絡地址
 
             InetAddress serverAddress = null ;
 
             mHost = Utils.getLocalIpStr(context);
 
             Log.d(TAG, "connectServerWithUDPSocket mHost =" + mHost);
 
             if ( null == mHost) return ;
 
             try {
 
                 serverAddress = InetAddress.getByName(mHost);
 
             } catch (UnknownHostException e) {
 
                 Log.d(TAG, "未找到服務器" );
 
                 e.printStackTrace();
 
             }
 
             //Inet4Address serverAddress = (Inet4Address) Inet4Address.getByName("192.168.1.32");
 
             String str = id; //設置要發送的報文
 
             byte data[] = str.getBytes(); //把字符串str字符串轉換為字節數組
 
             //創建一個DatagramPacket對象,用於發送數據。
 
             //參數一:要發送的數據  參數二:數據的長度  參數三:服務端的網絡地址  參數四:服務器端端口號
 
             DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, PORT);
 
             try {
 
                 socket.send(packet); //把數據發送到服務端。
 
             } catch (IOException e) {
 
                 Log.d(TAG, "發送失敗" );
 
                 e.printStackTrace();
 
             }
 
             Log.d(TAG, "socket.send------------------------" );
 
         } catch (SocketException e) {
 
             Log.i(TAG, "建立接收數據報失敗" );
 
             e.printStackTrace();
 
         }
 
     }


服務端接收:

[Java]  純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public void serverReceviedByUdp() {
 
         //創建一個DatagramSocket對象,並指定監聽端口。(UDP使用DatagramSocket)
 
         DatagramSocket socket;
 
         try {
 
             socket = new DatagramSocket(PORT);
 
             //創建一個byte類型的數組,用於存放接收到得數據
 
             byte data[] = new byte [ 4 * 1024 ];
 
             //創建一個DatagramPacket對象,並指定DatagramPacket對象的大小
 
             DatagramPacket packet = new DatagramPacket(data, data.length);
 
             while ( true ) {
 
                 //讀取接收到得數據
 
                 socket.receive(packet);
 
                 //把客戶端發送的數據轉換為字符串。
 
                 //使用三個參數的String方法。參數一:數據包 參數二:起始位置 參數三:數據包長
 
                 String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
 
                 Log.d(TAG, "service result = " + result);
 
                 
 
             }
 
  
 
         } catch (SocketException e) {
 
             e.printStackTrace();
 
         } catch (IOException e) {
 
             e.printStackTrace();
 
         }
 
     }


Socket:

服務端:

[Java]  純文本查看 復制代碼
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
public class TcpServer {
 
     private static ServerSocket serverSocket;
 
     private static Socket socket;
 
  
 
     public static void startServer(){
 
         if (serverSocket == null ){
 
             new Thread( new Runnable() {
 
                 @Override
 
                 public void run() {
 
                     try {
 
                         serverSocket = new ServerSocket( 8080 );
 
                         Log.i( "tcp" , "服務器等待連接中" );
 
                         socket = serverSocket.accept();
 
                         Log.i( "tcp" , "客戶端連接上來了" );
 
                         InputStream inputStream = socket.getInputStream();
 
                         byte [] buffer = new byte [ 1024 ];
 
                         int len = - 1 ;
 
                         while ((len = inputStream.read(buffer)) != - 1 ) {
 
                             String data = new String(buffer, 0 , len);
 
                             Log.i( "tcp" , "收到客戶端的數據-----------------------------:" + data);
 
                             EventBus.getDefault().post( new MessageServer(data));
 
                         }
 
                     } catch (IOException e) {
 
                         e.printStackTrace();
 
  
 
                     } finally {
 
                         try {
 
                             socket.close();
 
                         } catch (IOException e) {
 
                             e.printStackTrace();
 
                         }
 
                         try {
 
                             serverSocket.close();
 
                         } catch (IOException e) {
 
                             e.printStackTrace();
 
                         }
 
                         socket = null ;
 
                         serverSocket = null ;
 
                     }
 
                 }
 
             }).start();
 
         }
 
     }
 
  
 
     public static void sendTcpMessage( final String msg){
 
         if (socket != null && socket.isConnected()) {
 
             new Thread( new Runnable() {
 
                 @Override
 
                 public void run() {
 
                     try {
 
                         socket.getOutputStream().write(msg.getBytes());
 
                         socket.getOutputStream().flush();
 
                     } catch (IOException e) {
 
                         e.printStackTrace();
 
                     }
 
                 }
 
             }).start();
 
         }
 
     }
 
}


客戶端(這邊需要先連接服務端之后,才能發送數據):

[Java]  純文本查看 復制代碼
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
public class TcpClient {
 
  
 
     public static Socket socket;
 
  
 
     public static void startClient( final String address , final int port){
 
         if (address == null ){
 
             return ;
 
         }
 
         if (socket == null ) {
 
             new Thread( new Runnable() {
 
                 @Override
 
                 public void run() {
 
                     try {
 
                         Log.i( "tcp" , "啟動客戶端" );
 
                         socket = new Socket(address, port);
 
                         Log.i( "tcp" , "客戶端連接成功" );
 
                         PrintWriter pw = new PrintWriter(socket.getOutputStream());
 
  
 
                         InputStream inputStream = socket.getInputStream();
 
  
 
                         byte [] buffer = new byte [ 1024 ];
 
                         int len = - 1 ;
 
                         while ((len = inputStream.read(buffer)) != - 1 ) {
 
                             String data = new String(buffer, 0 , len);
 
                             Log.i( "tcp" , "收到服務器的數據---------------------------------------------:" + data);
 
                             EventBus.getDefault().post( new MessageClient(data));
 
                         }
 
                         Log.i( "tcp" , "客戶端斷開連接" );
 
                         pw.close();
 
  
 
                     } catch (Exception EE) {
 
                         EE.printStackTrace();
 
                         Log.i( "tcp" , "客戶端無法連接服務器" );
 
  
 
                     } finally {
 
                         try {
 
                             socket.close();
 
                         } catch (IOException e) {
 
                             e.printStackTrace();
 
                         }
 
                         socket = null ;
 
                     }
 
                 }
 
             }).start();
 
         }
 
     }
 
  
 
     public static void sendTcpMessage( final String msg){
 
         if (socket != null && socket.isConnected()) {
 
             new Thread( new Runnable() {
 
                 @Override
 
                 public void run() {
 
                     try {
 
                         socket.getOutputStream().write(msg.getBytes());
 
                         socket.getOutputStream().flush();
 
                     } catch (IOException e) {
 
                         e.printStackTrace();
 
                     }
 
                 }
 
             }).start();
 
         }
 
     }

 

更多學習資料可關注:annalin1203獲取


免責聲明!

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



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