最近公司要求做个小工具 要求三台手机同时操作做某个事情——Sokect就简单粗暴可实现

一个服务端 两个客户端就欧了

服务端:

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

import com.eggplant.virgo.features.main.FaceMainNewActivity;

import org.greenrobot.eventbus.EventBus;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;

import static com.eggplant.virgo.features.sokect.tcp.SockeState.SERVICE_ADDCLIENT;
import static com.eggplant.virgo.features.sokect.tcp.SockeState.SERVICE_DISCONNECT;
import static com.eggplant.virgo.features.sokect.tcp.SockeState.STARTSERVICE;
import static com.eggplant.virgo.features.sokect.tcp.SockeState.STARTSERVIC_ERROR;

public class ServerListener {
    private static ServerListener minstace;
    private ServerListener () {}
    public static ServerListener getInstance() {
        if (minstace == null) {
            synchronized (ServerListener.class) {
                if (minstace == null) {
                    minstace = new ServerListener();
                }
            }
        }
        return minstace;

}
  private static ServerSocket serverSocket;
    public boolean isOpen() {
        if (serverSocket != null) {
            return !serverSocket.isClosed();
        }
        return false;
    }

//启动服务端

public void startService() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    serverSocket = new ServerSocket(8080);
                    while (true) {
                        Log.d("skj", "========:启动服务"+  serverSocket);
                        EventBus.getDefault().post(new SockeState(STARTSERVICE));
                        Socket socket = serverSocket.accept();
                        ChartSocket cs = new ChartSocket(socket);
                        cs.start();
                        ChatManager.getChatManager().add(cs);
                        EventBus.getDefault().post(new SockeState(SERVICE_ADDCLIENT));

}
                } catch (IOException e) {
                    Log.d("skj", "========:服务开启异常");
                    EventBus.getDefault().post(new SockeState(STARTSERVIC_ERROR, e.toString()));
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

-------------------------------------------------------------------------------------------------------------
import android.util.Log;import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;import static com.eggplant.virgo.features.main.FaceMainNewActivity.HEART;public class ChatManager {/*** @param*/private ChatManager() {}private static final ChatManager cm = new ChatManager();public static ChatManager getChatManager() {return cm;}Vector<ChartSocket> vector = new Vector<ChartSocket>();public void add(ChartSocket cs) {vector.add(cs);cs.out(HEART);//连接进来第一时间发送心跳包sendBeatData();}public void publish(ChartSocket cs, String out) {for (int i = 0; i < vector.size(); i++) {//遍历所有de chartsocketChartSocket csChartSocket = vector.get(i);//获取循环中的第I个对象  telnet localhost 12345if (!cs.equals(csChartSocket)) {//除了本身csChartSocket.out(out);System.out.println("将信息发送给所有客户 调用pulish:  " + out);}}}/*** 服务器给所有用户发送信息*/public void servicePublish(String out) {for (int i = 0; i < vector.size(); i++) {//遍历所有de chartsocketChartSocket csChartSocket = vector.get(i);//获取循环中的第I个对象  telnet localhost 12345csChartSocket.out(out);}}/*倒计时Timer发送心跳包*/private Timer timer;private TimerTask task;private int heartCycle = 10;/*定时发送数据*/private void sendBeatData() {if (timer == null) {timer = new Timer();}if (task == null) {task = new TimerTask() {@Overridepublic void run() {try {Log.i("skj", "服务器发送心跳包");servicePublish(HEART);} catch (Exception e) {e.printStackTrace();}}};timer.schedule(task, 0, 1000 * heartCycle);}}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class ChartSocket extends Thread {Socket socket;BufferedWriter bw;BufferedReader br;public ChartSocket(Socket s) {this.socket = s;try {bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));} catch (IOException e) {e.printStackTrace();}}public void out(String out) {try {bw.write(out + "\n");// 必须要加换行符号,不然数据发不出去bw.flush();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void run(){try {
//          BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));String line=null;while((line=br.readLine())!=null){//reaadline是个阻塞函数  没有读取到会一直处于阻塞状态System.out.println("读取到了信息");System.out.println("客户端发来数据:"+line);
//                ChatManager.getChatManager().publish(this, line);System.out.println("写入了信息");}br.close();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

==========================================================================

客户端代码:

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;import org.greenrobot.eventbus.EventBus;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;import static com.eggplant.virgo.features.main.FaceMainNewActivity.HEART;
import static com.eggplant.virgo.features.sokect.tcp.SockeState.SERVICE_DISCONNECT;public class SokectClient {private static SokectClient minstace;private int heartCycle = 10;public static SokectClient getInstance() {if (minstace == null) {synchronized (SokectClient.class) {if (minstace == null) {minstace = new SokectClient();}}}return minstace;}Socket socket = null;BufferedReader reader = null;BufferedWriter writer = null;AsyncTask<Void, String, Void> read;private Listener mListener;private long lastService;private boolean isClose = true;private Context mContext;private String mIp;public void setListener(Listener listener, Context context) {this.mListener = listener;this.mContext = context;}/*** 连接服务端*/public void connect(final String ip) {this.mIp = ip;if (read!=null){recovery();}read = new AsyncTask<Void, String, Void>() {protected Void doInBackground(Void... params) {try {socket = new Socket(ip, 8080);writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));Log.e("skj", "writerwriterwriterwriter");reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));Log.e("skj", "dream......................");publishProgress("@Sucess");sendBeatData();} catch (UnknownHostException e1) {Log.d("skj", "=====:无法建立链接");mListener.dataListener("103");EventBus.getDefault().post(new SockeState(103, e1.toString()));e1.printStackTrace();} catch (IOException e1) {Log.d("skj", "=====:无法建立链接");EventBus.getDefault().post(new SockeState(103, e1.toString()));mListener.dataListener("103");e1.printStackTrace();}try {String line;while ((reader != null) && (line = reader.readLine()) != null) {publishProgress(line);Log.e("skj", " readling()");}} catch (IOException e) {e.printStackTrace();}return null;}@Overrideprotected void onProgressUpdate(String... values) {mListener.dataListener(values[0]);if (values[0].equals("@Sucess")) {isClose = false;lastService = System.currentTimeMillis();Toast.makeText(mContext, "建立链接",Toast.LENGTH_SHORT).show();} else {isClose = false;
//                    Toast.makeText(context, "收到数据!",
//                            Toast.LENGTH_SHORT).show();Log.d("skj", "服务器信息:" + values[0] + "\n");if (values[0] != null && values[0].equals(HEART)) {Log.d("skj", "收到心跳包:" + values[0] + "\n");lastService = System.currentTimeMillis();}}}};read.execute();}public boolean isClose() {if (socket != null) {if (socket.isClosed()) {return socket.isClosed();} else {return isClose;}} else {return isClose;}}/*倒计时Timer发送心跳包*/private Timer timer;private TimerTask task;/*定时发送数据*/private void sendBeatData() {if (timer == null) {timer = new Timer();}if (task == null) {task = new TimerTask() {@Overridepublic void run() {try {Log.i("skj", "发送心跳包");/*这里的编码方式根据你的需求去改*/writer.write("heart" + "\n");writer.flush();if ((System.currentTimeMillis() - lastService) > 2000 * heartCycle) {EventBus.getDefault().post(new SockeState(SERVICE_DISCONNECT));Log.e("skj", "服务器连接断开,正在重连");isClose = true;recovery();connect(mIp);}} catch (Exception e) {/*发送失败说明socket断开了或者出现了其他错误*/EventBus.getDefault().post(new SockeState(SERVICE_DISCONNECT));isClose = true;Log.e("skj", "连接断开,正在重连");/*重连*/recovery();connect(mIp);e.printStackTrace();}}};}timer.schedule(task, 0, 1000 * heartCycle);}private void recovery() {if (timer != null) {timer.cancel();timer = null;}if (task != null) {task.cancel();task = null;}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}if (writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (read.getStatus() == AsyncTask.Status.RUNNING ||read.getStatus() == AsyncTask.Status.PENDING) {read.cancel(true);read = null;}}public interface Listener {void dataListener(String l);}}

获取本机IP地址:

public class IPUtil {public static String formatIpAddress(int ipAdress) {return (ipAdress & 0xFF) + "." + ((ipAdress >> 8) & 0xFF) + "." + ((ipAdress >> 16) & 0xFF) + "."+ (ipAdress >> 24 & 0xFF);}//获取本地IP函数public static String getLocalIPAddress() {//获取wifi服务  WifiManager wifiManager = (WifiManager) VirgoApp.getInstance().getApplicationContext().getSystemService(Context.WIFI_SERVICE);//判断wifi是否开启  if (!wifiManager.isWifiEnabled()) {wifiManager.setWifiEnabled(true);}WifiInfo wifiInfo = wifiManager.getConnectionInfo();int ipAddress = wifiInfo.getIpAddress();return formatIpAddress(ipAddress);}
}

UI比较简单

转载:https://blog.csdn.net/Larry_794204525/article/details/53842951

Android Sokect 一对多~ 服务端对多个客户端(个人笔记)相关推荐

  1. Qt 多线程TCP服务端一键关闭所有客户端

    Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...

  2. 启动go服务_内网穿透工具 FRP公网服务端、内网客户端快速配置文件说明

    内网穿透工具 FRP 公网服务端.内网客户端 frps.ini .frpc.ini 配置文件常用设置展示及说明 公网服务端 frps.ini 配置文件常用设置 公网服务端配置文件:frps.ini [ ...

  3. git的CentOS服务端安装和windows客户端的使用

    git的CentOS服务端安装和windows客户端的使用 此教程以 ***vps CentOS 6 x64 的系统为环境,搭建 git 服务端.windows 7 系统为客户端. git客户端 在W ...

  4. socket服务端处理多个客户端的请求学习理解

    socket服务端处理多个客户端的请求: while(true){ Socket s=ss.accept(); new WorkThread(s).start(); } class WorkThrea ...

  5. 【Socket编程】Python实现一个服务端,多个客户端接入

    Python实现一个服务端,多个客户端接入 1. 服务器端 服务器端每一次接收客户端连接,都要fork一个进程来完成,如果单纯使用socket模块来实现,是不容易完成多线程接入的.为了方便,可以直接使 ...

  6. 征服账号服务器,最新中文征服服务端(带架设教程+客户端补丁+需要的工具)10.13日更新...

    最新中文征服服务端(带架设教程+客户端补丁+需要的工具)10.13日更新 10月9号版本更新信息: 增加了 头像. 头像已经很完美了 天石 , 挖矿, 宝石效果 高级宝石 可以放出 动画 数据库已经改 ...

  7. SSR 服务端渲染与 CSR 客户端渲染

    SSR 服务端渲染与 CSR 客户端渲染 SSR 服务端渲染 CSR 客户端渲染 本文要点: 介绍 SSR 服务端渲染概念.优点.缺点.案例及常用框架. 介绍 CSR 服务端渲染概念.优点.缺点. S ...

  8. 热血江湖服务端 linux,热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程

    热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程 本人没有测试过!!!本人没有测试过!!!本人没有测试过!!! 可升级120级,个别服升150级8转 爆率低 特别是强化石 强化石可以叠加 ...

  9. 弹弹堂服务器如何修改,弹弹堂端游服务端+手工弹弹堂游戏客户端+GM管理后台+附安裝构建实例教程...

    弹弹堂端游服务端+手工弹弹堂游戏客户端+GM管理后台+附安裝构建实例教程 系统centos 7.2 64位 安装宝塔 yum install -y wget && wget -O in ...

最新文章

  1. Sql Server系列:触发器
  2. centos7配置br0_centos7 bond 和 网桥配置
  3. 北斗通信运营商_国内首个“北斗+5G”应用方案发布 配套5G产品将于年底量产上市...
  4. mysql对日期的操作_MySql对日期的操作
  5. GitHub下载文件时缓慢的问题
  6. 深度学习《BiGAN》
  7. 阿里云迎来 2.0,重新定义软件系统应用开发方式
  8. unity2d自动生成敌人_【A*Pathfinding】超级简单的Unity2D寻路
  9. Glide 缓存与解码复用
  10. TestReport目录
  11. 安装ANSYS、SolidWorks、MATLAB等软件出错解决办法汇总(此大乘佛法可解决99.9%的问题)
  12. 如何导出带有dn值的栅格影像(方便arcgis处理)
  13. 初识Cpp之 三、Cpp预处理器
  14. 微信小程序 - 实现搜索界面(带热搜、搜索历史和结果页)
  15. 手机麦克风权限在哪里开启_手机麦克风权限怎么设置
  16. 使用STM32的DFSDM外设来驱动PDM麦克风进行音频采集
  17. 迫于无奈,顺丰再进电商市场,可惜已太迟
  18. 新生报到系统毕业设计,新生报到管理系统设计与实现,新生报到系统论文毕设作品参考
  19. CTFshow月饼杯crypto部分wp
  20. CDH集群: 数据恢复/备份

热门文章

  1. mysql数据库精确匹配搜索_mysql 模糊搜索方法
  2. Oracle For Linux 恢复日记 霆智X8III
  3. (a+c)/(b+d)与a/b和c/d的关系
  4. Java、JSP体育用品销售管理系统
  5. java如何判断前端传来的是否是数字类型
  6. 靠手机软件免流是真的吗?什么原理?
  7. 政务网时间同步(NTP时钟同步服务器)原理及重要性分析
  8. 关于JavaScript精确度问题
  9. JD+XX金融的面试
  10. 组织机构权限系统设计