日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 两个客户端间的通信(Socket通信)

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 两个客户端间的通信(Socket通信) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

?

客戶端之間通信:??? 實際上兩個客戶端不能直接通信,要借助服務器來做為中轉站,才能實現雙方通信。

??????????????? 一個客戶端發送數據到服務器,服務器將數據發送給(所有連接上服務器的)客戶端,這樣客戶端之間實現了通信。

服務器的代碼:

public class PcService {
????????????private static final int SERVICEPORT=10086;
?????????? ?private static ArrayList<Socket> mClientList=new ArrayList<Socket>(); //記錄連接上服務器的客戶端
????????????private ExecutorService mExecutorService;???????????????????????????? //創建線程池來管理
??????????? private ServerSocket serverSocket;
?????????? ?public static void main(String[] args) {
????????????????? new PcService();
??????????? ?}
?????????? public PcService() {
?????????????? ?try {
???????????????????? serverSocket=new ServerSocket(SERVICEPORT);
???????????????????? mExecutorService=Executors.newCachedThreadPool();??
????????????????? ? Socket? clientSocket=null;
??????????????????? while(true){? //一接受到客戶端發送來的數據,立刻將信息轉發給所有連接在線的客戶端
????? ????????????????? clientSocket=serverSocket.accept();
????????????????????????mClientList.add(clientSocket);
?????????????????????? ?mExecutorService.execute(new ThreadServer(clientSocket));
??????????????????? }
????????????? ?}
???????????? ?catch (Exception e) {
????????????????? ??e.printStackTrace();
???????????? ?}
????????}
?

?


?????? static class ThreadServer implements Runnable{
???????????? ?PrintWriter printWriter;
?????????? ?? BufferedReader bufferedReader;
???????????? ?String message;
?????????? ?? Socket socket;

????????????? public ThreadServer(Socket socket) throws IOException {
?????????????? ???? this.socket=socket;
??????????????????? bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
????????????????????message=this.socket.getInetAddress()+"";
??????????????????? sendMessageToClient();
???????????? ?}
???????????? public void run() {
?????????????? ?try {
???????????????? ??while((message=bufferedReader.readLine())!=null){
??????????????????????if(message.trim().equals("exit")){//當一個客戶端退出時
?????????????????????????? ?mClientList.remove(socket);
??????????????????????????? bufferedReader.close();

????????????????????????????printWriter.close();
????????????????????????? ??socket.close();
???????????????????????? ?? sendMessageToClient();
??????????????????????????? ?break ;
???????????????? ??? }
???? ??????????????? else{
???????????????????????? ?message=socket.getInetAddress()+"";
???????????????????????? ?sendMessageToClient();
??????????????????? ?}
???????????????? ?}
????????????? }
??????????? ?catch (Exception e) {
?????????????????? e.printStackTrace();
?????????????}
???
????????}
??
???????? //發送消息給每一個連接的客戶端
????????private void sendMessageToClient(){
??????????? try {
??????????????? for(Socket? client:mClientList){
?????????????????? printWriter=new PrintWriter(client.getOutputStream());
???????????????? ? printWriter.println( message );
???????????? ?? }
???????????}
???????? ?catch (Exception e) {
???????????? e.printStackTrace();
????????? }
?????? ?}
??
??}
}

?

?

監控TCP的狀態: 心跳包

?? 做法:一個單獨線程(心跳線程),來維護tcp的連接。
??????? 每隔一個時間就向服務器/客戶端發送一段連接信息,當對方接受到后馬上回復對方。然后設置一個超時時間

?????? ,過個時間就反復發幾次。如果沒有收到回復,則判定tcp斷開了。

??????? 用心跳包來維護連接,在發送心跳包異常時,可以認為對方短線,

??????? 或者指定時間超時后,未收到對方的心跳響應,也認為是對方短線。
?????? ?或者就是Send的時候會直接報異常,可以直接認為是掉線了。

轉載于:https://my.oschina.net/u/2406195/blog/508768

總結

以上是生活随笔為你收集整理的android 两个客户端间的通信(Socket通信)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。