android 两个客户端间的通信(Socket通信)
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
?
客戶端之間通信:??? 實際上兩個客戶端不能直接通信,要借助服務(wù)器來做為中轉(zhuǎn)站,才能實現(xiàn)雙方通信。
??????????????? 一個客戶端發(fā)送數(shù)據(jù)到服務(wù)器,服務(wù)器將數(shù)據(jù)發(fā)送給(所有連接上服務(wù)器的)客戶端,這樣客戶端之間實現(xiàn)了通信。
服務(wù)器的代碼:
public class PcService {
????????????private static final int SERVICEPORT=10086;
?????????? ?private static ArrayList<Socket> mClientList=new ArrayList<Socket>(); //記錄連接上服務(wù)器的客戶端
????????????private ExecutorService mExecutorService;???????????????????????????? //創(chuàng)建線程池來管理
??????????? 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){? //一接受到客戶端發(fā)送來的數(shù)據(jù),立刻將信息轉(zhuǎn)發(fā)給所有連接在線的客戶端
????? ????????????????? 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();
?????????????}
???
????????}
??
???????? //發(fā)送消息給每一個連接的客戶端
????????private void sendMessageToClient(){
??????????? try {
??????????????? for(Socket? client:mClientList){
?????????????????? printWriter=new PrintWriter(client.getOutputStream());
???????????????? ? printWriter.println( message );
???????????? ?? }
???????????}
???????? ?catch (Exception e) {
???????????? e.printStackTrace();
????????? }
?????? ?}
??
??}
}
?
?
監(jiān)控TCP的狀態(tài): 心跳包
?? 做法:一個單獨線程(心跳線程),來維護tcp的連接。
??????? 每隔一個時間就向服務(wù)器/客戶端發(fā)送一段連接信息,當對方接受到后馬上回復(fù)對方。然后設(shè)置一個超時時間
?????? ,過個時間就反復(fù)發(fā)幾次。如果沒有收到回復(fù),則判定tcp斷開了。
??????? 用心跳包來維護連接,在發(fā)送心跳包異常時,可以認為對方短線,
??????? 或者指定時間超時后,未收到對方的心跳響應(yīng),也認為是對方短線。
?????? ?或者就是Send的時候會直接報異常,可以直接認為是掉線了。
轉(zhuǎn)載于:https://my.oschina.net/u/2406195/blog/508768
總結(jié)
以上是生活随笔為你收集整理的android 两个客户端间的通信(Socket通信)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 文件权限详解 含义和修改和安
- 下一篇: ASP.NET MVC SignalR(