Android Sokect 一对多~ 服务端对多个客户端(个人笔记)
最近公司要求做个小工具 要求三台手机同时操作做某个事情——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 一对多~ 服务端对多个客户端(个人笔记)相关推荐
- Qt 多线程TCP服务端一键关闭所有客户端
Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...
- 启动go服务_内网穿透工具 FRP公网服务端、内网客户端快速配置文件说明
内网穿透工具 FRP 公网服务端.内网客户端 frps.ini .frpc.ini 配置文件常用设置展示及说明 公网服务端 frps.ini 配置文件常用设置 公网服务端配置文件:frps.ini [ ...
- git的CentOS服务端安装和windows客户端的使用
git的CentOS服务端安装和windows客户端的使用 此教程以 ***vps CentOS 6 x64 的系统为环境,搭建 git 服务端.windows 7 系统为客户端. git客户端 在W ...
- socket服务端处理多个客户端的请求学习理解
socket服务端处理多个客户端的请求: while(true){ Socket s=ss.accept(); new WorkThread(s).start(); } class WorkThrea ...
- 【Socket编程】Python实现一个服务端,多个客户端接入
Python实现一个服务端,多个客户端接入 1. 服务器端 服务器端每一次接收客户端连接,都要fork一个进程来完成,如果单纯使用socket模块来实现,是不容易完成多线程接入的.为了方便,可以直接使 ...
- 征服账号服务器,最新中文征服服务端(带架设教程+客户端补丁+需要的工具)10.13日更新...
最新中文征服服务端(带架设教程+客户端补丁+需要的工具)10.13日更新 10月9号版本更新信息: 增加了 头像. 头像已经很完美了 天石 , 挖矿, 宝石效果 高级宝石 可以放出 动画 数据库已经改 ...
- SSR 服务端渲染与 CSR 客户端渲染
SSR 服务端渲染与 CSR 客户端渲染 SSR 服务端渲染 CSR 客户端渲染 本文要点: 介绍 SSR 服务端渲染概念.优点.缺点.案例及常用框架. 介绍 CSR 服务端渲染概念.优点.缺点. S ...
- 热血江湖服务端 linux,热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程
热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程 本人没有测试过!!!本人没有测试过!!!本人没有测试过!!! 可升级120级,个别服升150级8转 爆率低 特别是强化石 强化石可以叠加 ...
- 弹弹堂服务器如何修改,弹弹堂端游服务端+手工弹弹堂游戏客户端+GM管理后台+附安裝构建实例教程...
弹弹堂端游服务端+手工弹弹堂游戏客户端+GM管理后台+附安裝构建实例教程 系统centos 7.2 64位 安装宝塔 yum install -y wget && wget -O in ...
最新文章
- Sql Server系列:触发器
- centos7配置br0_centos7 bond 和 网桥配置
- 北斗通信运营商_国内首个“北斗+5G”应用方案发布 配套5G产品将于年底量产上市...
- mysql对日期的操作_MySql对日期的操作
- GitHub下载文件时缓慢的问题
- 深度学习《BiGAN》
- 阿里云迎来 2.0,重新定义软件系统应用开发方式
- unity2d自动生成敌人_【A*Pathfinding】超级简单的Unity2D寻路
- Glide 缓存与解码复用
- TestReport目录
- 安装ANSYS、SolidWorks、MATLAB等软件出错解决办法汇总(此大乘佛法可解决99.9%的问题)
- 如何导出带有dn值的栅格影像(方便arcgis处理)
- 初识Cpp之 三、Cpp预处理器
- 微信小程序 - 实现搜索界面(带热搜、搜索历史和结果页)
- 手机麦克风权限在哪里开启_手机麦克风权限怎么设置
- 使用STM32的DFSDM外设来驱动PDM麦克风进行音频采集
- 迫于无奈,顺丰再进电商市场,可惜已太迟
- 新生报到系统毕业设计,新生报到管理系统设计与实现,新生报到系统论文毕设作品参考
- CTFshow月饼杯crypto部分wp
- CDH集群: 数据恢复/备份