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

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

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

服务器的代码:

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

时间: 2024-10-11 18:14:32

android 两个客户端间的通信(Socket通信)的相关文章

Android客户端与本地服务器Socket通信

Android客户端与本地服务器Socket通信 Socket服务器运行结果图?? 一.客户端和服务器端的选择: 客户端是我们手机端,关于服务器端,只要安装了JDK,自然就拥有通讯的功能,我们只需要在Eclipse或者MyEclipse中写好文章中服务器端的代码,运行起来即可,用accept()方法启动服务器端,等待客户端的连接,在未连接的情况下,服务器端处于堵塞的状态. 二.客户端注意事项 andriod客户端添加网络访问权限 <uses-permission android:name="

android的NDK和java进行本地socket通信

关于Android应用与Framework的socket通信,相信关心这个问题的朋友们已经看过<android使用socket使底层和framework通信>这篇文章,美中不足的是作者只贴出一些关键的代码片段而并没有放出源码.我这里还是以一个能实际运行的例子为基础来讲,这样也方便大家学习. 首先看一下效果,如下图.我填写姓名"Potter",选择性别"Mr"然后点击发送,底层socket收到消息后将消息直接返回给我,我将返回的结果(Mr.Potter)直

Android 两个Activity间的传值与回传值

MainActivity.java Intent intent = new Intent(); intent.putExtra("message", "传到SecondActivity的值"); intent.setClass(MainActivity.this, SecondActivity.class); /*  * 如果希望启动另一个Activity,并且希望有返回值,则需要使用startActivityForResult这个方法,  * 第一个参数是Inte

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

马哥教育第二十天TCP及socket通信原理详解、http协议、httpd

1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      常用端口:0-1023:管理员才有权限使用,永久地分配给某应用使用      注册端口:1024-41951:只有一部分被注册,只要确保主机上没有进程使用该端口.      动态端口或私有端口:41952-65535:由内核分配临时端口,如果临时端口不够可以通过修改内核参数修改临时端口范围       /proc/sys/net/ipv4/ip_local_port_range:定义两个

Socket通信原理简介

Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为I/O(input output). Unix的计算机处理IO是通过文件的抽象.计算机不同的进程之间也有输入输出,也就是通信.因此这这个通信也是通过文件的抽象文件描述符来进行. 在同一台计算机,进程之间可以这样通信,如果是不同的计算机呢?网络上不同的计算机,也可以通信,那么就得使用网络套接字(soc

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

Socket通信入门小实例

客户端: public class Client { private int port = 8000; private String host = "localhost"; private Socket socket; public Client() throws UnknownHostException, IOException { socket = new Socket(host, port); } public void readFromUser() throws IOExcep

于TCP协议的socket通信

基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤: 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 多线程服务器 多线程用来实现 服务器与多客户端之间的通信 基本步骤 1 服务器创建serverSocket,循环调用accept()等待客户端连接 2 客户端创建一个scoket并请求和服务器端连接 3 服务器端接收客户端请求,创建socket与该客户建立专线连接 4 建立