歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中的Scoket編程

Java中的Scoket編程

日期:2017/3/1 9:10:20   编辑:Linux編程

網絡編程是指編寫運行在多個設備(計算機)的程序,這些設備都通過網絡連接起來。

java.net包中提供了兩種常見的網絡協議的支持:

  • TCP: TCP是傳輸控制協議的縮寫,它保障了兩個應用程序之間的可靠通信。通常用於互聯網協議,被稱TCP / IP。
  • UDP:UDP是用戶數據報協議的縮寫,一個無連接的協議。提供了應用程序之間要發送的數據的數據包。

在這裡我們主要講解socket編程(使用最為廣泛的網絡編程),舉個簡單的例子,就像是我們平常用的QQ,每個人用的都是一個Client(客戶端),而服務端則是騰訊的服務器,我們彼此之間的通信是通過先將消息發送到服務端,然後服務端轉發到目標客戶端(你想要發送給的對象),而不是每個客戶端直接通信。

由此我們可以得出socket通信的基本流程:

首先是客戶端:通過IP地址和port(端口號)與服務端建立連接->進行信息傳遞—>關閉連接,然後是服務端:對客戶端進行監聽—>建立連接—>信息傳遞—>關閉連接。

下面是一個簡單的實現客戶端和服務端通信的例子:

  服務端:

 1 package com.internet.server;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.ServerSocket;
 7 import java.net.Socket;
 8 
 9 public class TestServer {
10     public static void main(String[] args) {
11         ServerSocket serverSocket = null;
12         Socket socket = null;
13         OutputStream out = null;
14         InputStream in = null;
15         int port = 12125;
16 
17         try {
18             serverSocket = new ServerSocket(port);
19             System.out.println("服務端開始監聽!!!");
20             socket = serverSocket.accept();
21             in = socket.getInputStream();
22             byte[] b = new byte[1024];
23             out = socket.getOutputStream();
24             for (int i = 0; i < 3; i++) {
25                 int n = in.read(b);
26                 System.out.println("接收到的信息為:" + new String(b, 0, n));
27                 out.write(b, 0, n);
28             }
29 
30         } catch (IOException e) {
31             e.printStackTrace();
32         } finally {
33             try {
34                 out.close();
35                 in.close();
36                 socket.close();
37                 serverSocket.close();
38             } catch (IOException e) {
39                 e.printStackTrace();
40             }
41         }
42 
43     }
44 }

  客戶端:

 1 package lib;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.Socket;
 7 
 8 public class TestClient {
 9     public static void main(String[] args) throws InterruptedException,
10             IOException {
11         Socket socket = null;
12         InputStream in = null;
13         OutputStream out = null;
14         // 定義端口
15         int port = 12125;
16         // 服務端的IP地址
17         String serverIP = "127.0.0.1";
18         // 傳遞的數據
19         String data[] = { "First", "Second", "Third" };
20         try {
21             socket = new Socket(serverIP, port);
22             out = socket.getOutputStream();
23             in = socket.getInputStream();
24             byte[] b = new byte[1024];
25             for (int i = 0; i < data.length; i++) {
26                 out.write(data[i].getBytes());
27                 int n = in.read(b);
28                 System.out.println("傳遞的數據為:" + new String(b, 0, n));
29             }
30         } catch (IOException e) {
31             e.printStackTrace();
32         } finally {
33             in.close();
34             out.close();
35             socket.close();
36         }
37     }
38 }

  服務端和客戶端之間是通過我們之前提到的“流“(字節流)的方式進行信息傳遞的。在上述代碼中我們需要保證客戶端和服務端的端口號是一致的,同時客戶端中的IP地址我們可以填寫本機地址,即127.0.0.1也可以填寫外網IP。只需要一個服務端即可,然後在多個客戶端之間實現通信,當然這只是簡單的信息傳遞,如果想要編寫出類似於QQ的簡單的小程序還需要swing,多線程等知識,感興趣的小伙伴可以自行嘗試。

Copyright © Linux教程網 All Rights Reserved