文档章节

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

新根
 新根
发布于 2015/09/20 17:17
字数 487
阅读 2474
收藏 14

 

客户端之间通信:    实际上两个客户端不能直接通信,要借助服务器来做为中转站,才能实现双方通信。

                一个客户端发送数据到服务器,服务器将数据发送给(所有连接上服务器的)客户端,这样客户端之间实现了通信。

服务器的代码:

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的时候会直接报异常,可以直接认为是掉线了。

© 著作权归作者所有

新根
粉丝 5
博文 28
码字总数 9431
作品 0
深圳
程序员
私信 提问
android socket各种通信

我已经试验成功: ps:模拟器做服务器,PC机做客户端。如果通过wifi连接的话直接访问IP就行,不用重定向。 PC访问模拟器用localhost即127.0.0.1, 模拟器 访问 模拟器用10.0.2.2 本人已成功运...

buleberry
2014/04/01
0
0
PC电脑和Android模拟器访问及模拟器之间tcp/udp通信

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统。要想实现PC电脑和Android模拟器系统以及Android模拟器之间相互通信必须借助端口重定...

小克898
2013/09/06
0
0
android网络通信之socket教程实例汇总

一、socket基础 1、Socket通讯机制(详细),如何将socket通信的客户端与服务器 http://www.eoeandroid.com/thread-61727-1-1.html 2、Http和Socket区别 http://www.eoeandroid.com/thread-9...

程序袁_绪龙
2014/12/11
0
0
Android模拟器的ip获取以及模拟器之间socket通信

1、Android 获取本机Mac 地址方法: 需要在AndroidManifest.xml文件中添加权限: <uses-permission android:name="android.permission.ACCESSWIFISTATE" /> Java代码 public String getLocal......

xiahuawuyu
2012/10/07
0
0
Android必备:Android Socket编程的了解与学习整理

看这里:Android必备:Android Socket编程的了解与学习整理 最近学习Android的过程中,由于项目、业务等因素影响,服务端通过Socket进行通信,于是开始学习Socket编程,之前的开发中,很少涉...

Realfighter
2015/03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式Session的实现方式

JWT Token 使用 JWT Token 储存用户身份,然后再从数据库或者 cache 中获取其他的信息。这样无论请求分配到哪个服务器都无所谓。 Tomcat + Redis 在 tomcat 的配置文件中配置: <Valve class...

禅明
18分钟前
0
0
Android饼图 PieChart

PieChart 饼图,android 图表。会根据定义PieChartView的大小自动居中,所以如果要调整位置,只需要在xml更改PieChartView位置大小即可。 https://github.com/ccMagic/PieChart 1、先看一下效...

ccMagic
22分钟前
3
0
说说我当初是如何学Linux的

今天我就说说我当初是如何从一名普通桌面维护工程师,通过学习和努力转成Linux运维工程师的,以及作为Linux运维工程师需要一些什么技能和知识,希望可以帮到一些对Linux有兴趣或者想往Linux...

Linux就该这么学
22分钟前
2
0
Tomcat启动异常Unable to register MBean [HikariDataSource (null)]:InstanceAlreadyExistsException

Unable to register MBean [HikariDataSource (null)] with key 'xxx'; nested exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hik ari:name=baseDataSource,ty......

sunranhou
27分钟前
2
0
qt从普通线程发信号到UI线程

加入从当前一个普通线程发送信号到ui,更新Ui只能使用Qt::BlockingQueuedConnection,用Qt::QueuedConnection会一会有用一会没用,并且会导致崩溃。 connect(this, &Task::startTask, this, ...

青黑
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部