1. 程式人生 > >Android TCP/UDP通訊試煉以及部分程式

Android TCP/UDP通訊試煉以及部分程式

客戶端

  1. publicclass MainActivity extends AppCompatActivity {  
  2.     privatestaticfinal String TAG = "lzy";  
  3.     private Context context;  
  4.     private TextView mTextView;  
  5.     @Override
  6.     protectedvoid onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         context = this;  
  10.         mTextView = (TextView) findViewById(R.id.tv);  
  11.     }  
  12.     publicvoid bt(View view) {  
  13.         new Thread() {  
  14.             @Override
  15.             publicvoid run() {  
  16.                 try {  
  17.                     Socket socket = new Socket("172.16.7.234"3000);  
  18.                     BufferedReader br = new
     BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));  
  19.                     String line = br.readLine();  
  20.                     Log.i(TAG, "讀取資料:" + line);  
  21.                     br.close();  
  22.                     socket.close();  
  23.                 } catch (IOException e) {  
  24.                     e.printStackTrace();  
  25.                 }  
  26.             }  
  27.         }.start();  
  28.     }  
  29. }  
首先是建立遠端連線的Socket,然後通過這個Socket獲取到資料。這裡的埠號和上面的要對應

設定Socket的超時時間

setSoTimeout(int timeout) :設定Socket的超時時間,不能小於0,如果使用Socket進行讀寫操作完成之前已經超出了這個時間,那麼就會丟擲SocketException。

設定Socket連線伺服器超時時間

  1. //建立一個無連線的Socket
  2. Socket socket = new Socket();  
  3. //讓Socket連線到遠端伺服器,如果經過1秒沒有連線到則認為超時
  4. socket.connect(new InetSocketAddress(host,port),1000);  
在Socket的構造引數裡面並沒有設定超時時長這個引數,所以需要先建立一個無連線的Socket,呼叫它的connect方法連線遠端伺服器,而這裡就可以設定一個超時時長的引數。

再寫一個聊天室的小應用來看看Socket的使用


服務端

在Android Studio建立一個服務端,點選File->New->New Module,建立一個Java Library

  1. publicclass MyServer {  
  2.     publicstatic List<Socket> listSocket = new ArrayList<>();  
  3.     publicstaticvoid main(String[] args) throws IOException {  
  4.         ServerSocket serverSocket = new ServerSocket(808);  
  5.         while (true) {  
  6.             //等待連線
  7.             Socket socket = serverSocket.accept();  
  8.             System.out.println("a target online");  
  9.             listSocket.add(socket);  
  10.             //每當客戶端連線成功 後啟動一條執行緒為該客戶端服務
  11.             new Thread(new ServerThread(socket)).start();  
  12.         }  
  13.     }  
  14. }  

listSocket是用於儲存客戶端連線後產生的Socket物件。

這段程式碼首先是在8080埠建立一個ServerSocket,然後是一個while的死迴圈呼叫ServerSocket的accept方法不停的接收來自客戶端的連線請求,然後為這個客戶端開啟一個執行緒為其服務

  1. publicclass ServerThread implements Runnable {    
  2.     private Socket socket;  
  3.     private BufferedReader br;  
  4.     public ServerThread(Socket socket) throws IOException {  
  5.         this.socket = socket;  
  6.         br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));  
  7.     }  
  8.     @Override
  9.     publicvoid run() {  
  10.         String content;  
  11.         //不斷把客服端的資料讀取出來
  12.         while ((content = readFromClient()) != null) {    
  13.             //把收到的訊息遍歷發給每一個 連線了的客戶端
  14.             for (Iterator<Socket> iterator = MyServer.listSocket.iterator(); iterator.hasNext(); ) {  
  15.                 Socket socket = iterator.next();  
  16.                 //打印出客服端的Ip和埠號
  17.                 System.out.println("IP:" + socket.getInetAddress() + "    port:" + socket.getPort());  
  18.                 try {  
  19.                     OutputStream os = socket.getOutputStream();  
  20.                     os.write((content + "\n").getBytes("utf-8"));  
  21.                 } catch (IOException e) {  
  22.                     e.printStackTrace();  
  23.                 }  
  24.             }  
  25.         }  
  26.     }   
  27.     private String readFromClient() {  
  28.         try {  
  29.             return br.readLine();  
  30.         } catch (IOException e) {  
  31.             e.printStackTrace();  
  32.             MyServer.listSocket.remove(socket);  
  33.         }  
  34.         returnnull;  
  35.     }  
  36. }  

在這個執行緒中把Socket的資料讀到BufferedReader裡面,然後通過一個while迴圈把訊息讀取來遍歷傳送給每一個連線了的客戶端。

readFromClient用來讀取接收到的客戶端資料,如果發生了異常就把這個Socket移除。

客戶端

MainActivity

  1. publicclass MainActivity extends AppCompatActivity {  
  2.     privatestaticfinal String TAG = "lzy";  
  3.     private List<String> list = new ArrayList<>();  
  4.     private RecyclerView mRecyclerView;  
  5.     private Context context;  
  6.     private ChatAdapter adapter;  
  7.     private EditText mEditText;  
  8.     private ClientThread clientThread;  
  9.     //用於傳送接收到的服務端的訊息,顯示在介面上
  10.     private Handler handler = new Handler() {  
  11.         @Override
  12.         publicvoid handleMessage(Message msg) {  
  13.             list.add(msg.obj.toString());  
  14.             adapter.notifyDataSetChanged();  
  15.         }  
  16.     };  
  17.     @Override
  18.     protectedvoid onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.         context = 

    相關推薦

    Android TCP/UDP通訊以及部分程式

    客戶端publicclass MainActivity extends AppCompatActivity {      privatestaticfinal String TAG = "lzy";      private Context context;      private TextView mTe

    PC和Android模擬器訪問及模擬器之間tcp/udp通訊

    Android系統預設只能通過IP(10.0.2.2)單向訪問PC電腦,而PC電腦不能通過IP來直接訪問Android模擬器系統。要想實現PC電腦和Android模擬器系統以及Android模擬器之間相互通訊必須藉助埠重定向(redir)來實現。 先說說埠重定向所需要的telnet客戶端安裝: windo

    TCP UDP 通訊技術

    什麼是 TCP UDP呢,不懂的,送概念連線一份: https://baike.baidu.com/item/UDP/571511?fr=aladdin https://baike.baidu.com/item/TCP/IP%E5%8D%8F%E8%AE%AE 簡單來講,TCP

    設計多個非本地IP之間進行TCP/UDP通訊

    工作需要,遇到過一個問題,需要模擬多個非本地IP之間進行TCP/UDP通訊,一開始以為非常簡單,直到遇到錯誤“非法IP”“該請求地址無效”"指定了無效的IP地址"這些錯誤,就是本地模擬TCP/UDP時出了本地迴環地址127.0.0.1其它地址都是無法識別的,程式不知道怎麼建立套接字,也不知道傳送給誰

    TCP UDP粘包和程序部分

    TCP 半連線池原理 #客戶端 import socket client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(("127.0.0.1",9999)) while

    C# TCP/UDP 通訊程式碼講解

    之前寫一個檔案傳輸軟體的時候不過的瞭解這 TCP和UDP的 一些概念和 知識,趁著目前還熱乎著,寫下來溫習一下。。第一次寫部落格 有不好的地方歡迎指出來。 首先介紹下我之前寫的思路。大家都知道 UDP是沒有連線是不可靠的,而TCP是面向連線可靠的連線。雖然TCP面向連線並

    Android TCP socket通訊

    之前做過的一個區域網內TCP通訊、聊天的demo(當然不是區域網也可以進行通訊,剛試了一下可以的),週日整理了一下。該demo可以做客戶端,也可以做服務端。兩個手機都安裝該應用,一個做客戶端、一個做服務端,然後進行通訊(連線在同一區域網,或伺服器是外網ip,

    TCP/UDP通訊協議基礎全集(區別,三次握手四次揮手)

    在本篇部落格你將瞭解到: 什麼是TCP/IP和UDP協議 TCP協議中的三次握手和四次揮手過程 為什麼連線的時候是三次握手,關閉的時候卻是四次握手 為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態 TCP與UDP的

    JAVA中TCP,UDP傳輸 簡單的聊天室程式

    JAVA中聊天室程式 要求: 編寫一個聊天程式 有收資料的部分,也同時有發資料的部分。 這兩部分需要同時執行,那就需要用到多執行緒技術。 一個執行緒控制發,一個執行緒控制收。 注意 這裡我們需要注意的是,因為收發動作是不一致的,所以要定義兩個run方法,而且這兩

    Android程序間通訊 - Socket使用(TCPUDP

    在使用Socket實現程序間通訊前,先對網路協議相關知識進行簡單回顧。 網路分層 一般情況會將網路分為5層: 應用層     常見協議:HTTP、FTP、POP3等 傳輸層     

    Socket 通訊原理(Android客戶端和伺服器以TCP&&UDP方式互通)

    ZERO、前言 有關通訊原理內容是在網上或百科整理得到,程式碼部分為本人所寫,如果不當,還望指教。 一、Socket通訊簡介  Android與伺服器的通訊方式主要有兩種,一是Http通訊,一是Socket通訊。兩者的最大差異在於,http連線使用的是“請求—響應方式

    Android 進階12:程序通訊之 Socket (順便回顧 TCP UDP

    不要害怕困難,這是你進步的機會! 讀完本文你將瞭解: 前面幾篇文章我們介紹了 AIDL 、Binder、Messenger 以及 ContentProvider 實現程序通訊的方式,這篇文章將介紹“使用 Socket 進行跨程序通訊”。 在介紹

    Android TCP通訊的簡單例項以及常見問題[超時/主執行緒阻塞]

    個人更喜歡著眼於例項,從最簡單的開始,一步步進行測試。 理論什麼的先放一邊,把程式跑起來再說。只有跑起來了,才會有動力去繼續往下學,參透整個程式碼的執行機制。 本次的例項目標是—— 模擬一個PC伺服器與android端的通訊,目標是儘量的做到精簡,使程式碼僅留下所需核心部

    一篇文章講懂IP資料報分片、組裝以及TCP/UDP的聯絡

    http://www.mamicode.com/info-detail-1465195.html https://blog.csdn.net/leex_brave/article/details/51971053 https://blog.csdn.net/buptzwp/article

    Android開發—智慧家居系列】(四):UDP通訊傳送指令

    【Android開發—智慧家居系列】(四):UDP通訊傳送指令   思路回顧 【1】手機連線WIFI模組  【2】UDP通訊對WIFI模組傳送指令,以和WIFI模組保持連線狀態  【3】UDP通訊對WIFI模組傳送指令,讓其搜尋可用的無線網,返回WIFI列表

    TCP/UDP區別以及UDP如何實現可靠傳輸

    TCP和UDP是OSI模型中的運輸層中的協議。TCP提供可靠的通訊傳輸,而UDP則常被用於讓廣播和細節控制交給應用的通訊傳輸。   UDP(User Datagram Protocol)         UDP不提供複雜的控制機制,利用I

    第二十七天- 網路通訊協議 TCP UDP 緩衝區

        1.網路通訊協議   osi七層模型:按照分工不同把網際網路協議從邏輯上劃分了層級     socket層   2.理解socket:   Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,So

    AndroidUDP協議通訊

    最近在做的專案中用到了UDP協議來通訊,整理了一下,可以與PC端網路助手之間進行測試。下面將主要功能程式碼寫在下面供搭建參考: UDPSocketClientManage public class UDPSocketClientManage { // 伺服器IP

    java網路通訊之Socket通訊TCP/UDP

    網路通訊三要素:協議,IP,埠。七層協議。 package com.qianfeng.test; /* * 網路程式設計基礎: * 網路的通訊:三要素:協議,IP,埠 * 1.IP:在網路上唯一的標記一臺主機 127.0.0.1 :保留地址/本地地址 java

    (C#)TCPUDP通訊流程、Tcplistener和Tcpclient進行通訊、UdpClient進行通訊

    1.基於Tcp協議的Socket通訊類似於B/S架構,面向連線,不同的是伺服器端可以向客戶端主動的推送訊息 流程順序。可靠性高 (1)建立一個套接字(Socket) (2)繫結伺服器端IP地址及埠號-伺服器端 (3)利用Listen()方法開啟監聽-伺服器端 (4)利用Accep