android WebSocketClient和TCP协议Socket
16lz
2021-01-23
WebSocketClient封装
public class SockClient extends WebSocketClient { //设置一个接口 提供外部数据 类似handle功能 private SockClient.OnOkButtonFireListener okListener; public interface OnOkButtonFireListener{ public void onOpen(); public void onMessage(String resultStr); } public void setOkListener(SockClient.OnOkButtonFireListener okListener) { this.okListener = okListener; } public SockClient(String url,Map var3) { //1请求地址, 2版本号需和服务端一直, 3上传参数, 4请求超时时间 super(URI.create(url), new Draft_17(), var3, 120000); } //添加安全协议 public void SetAgreement(){ try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, null, null); SSLSocketFactory factory = sc.getSocketFactory(); this.setSocket(factory.createSocket()); } catch (Exception e) { e.printStackTrace(); } } //连接服务器 public void connect(){ try { this.connectBlocking(); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void onOpen(ServerHandshake serverHandshake) { System.out.println("握手成功"); okListener.onOpen(); } @Override public void onMessage(String s) { System.out.println("返回消息"); //次位置可以对返回的s 数据进行处理使外面的数据可以更便捷使用 根据需求而定 okListener.onMessage(s); } @Override public void onClose(int i, String s, boolean b) { System.out.println("关闭连接"); } @Override public void onError(Exception e) { System.out.println("连接失败:"+e.getMessage()); }}
WebSocketClient调用方法
public static void main(String[] args) { String url = "http://localhost:8080/socket"; Map headerMap = new HashMap(); headerMap.put("token", "upload-parameters"); final SockClient socket = new SockClient(url,headerMap); socket.setOkListener(new SockClient.OnOkButtonFireListener() { @Override public void onOpen() { //握手成功后发送一条指令 根据需求而定 socket.send("information"); } @Override public void onMessage(String resultStr) { System.out.println("消息:"+resultStr); } }); socket.SetAgreement(); socket.connect(); }
TCP协议Socket方法封装
public class SocketCon { //设置一个接口 提供外部数据 类似handle功能 private SocketCon.OnOkButtonFireListener okListener; public interface OnOkButtonFireListener{ public void onMessage(String resultStr); } public void setOkListener(SocketCon.OnOkButtonFireListener okListener) { this.okListener = okListener; } private BufferedReader br; private BufferedWriter bw; private InputStream in; private OutputStream out; private Socket socket = null; private SocketSender sender; private SocketReceiver receiver; public SocketCon(){ try { socket = new Socket("ip地址", 8080); socket.setSoTimeout(1000); in = socket.getInputStream(); out = socket.getOutputStream(); br = new BufferedReader(new InputStreamReader(in, "UTF-8")); bw = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); //接收数据开启一个线程 receiver = new SocketReceiver(); //发送数据开启一个线程 sender = new SocketSender(); }catch (Exception e){ e.getMessage(); } } //判断是否连接成功 public boolean isConnected(){ return socket.isConnected(); } //发送消息 public void sendMag(String mag){ if(null!=sender && null!=mag){ sender.sendStr = mag; } } public class SocketSender implements Runnable { private boolean alive; public Thread thread; public boolean ThreadStop; public String sendStr = ""; public SocketSender() { ThreadStop=false; alive = true; sendStr = ""; thread = new Thread(this); thread.start(); } public void run() { while (alive) { if(ThreadStop){ break; } try { if (null!=sendStr && !"".equals(sendStr)) { bw.write(sendStr, 0, sendStr.length()); bw.flush(); sendStr = ""; } synchronized (this) { wait(100); } Thread.yield(); } catch (Exception e) { e.printStackTrace(); close(); } } } public void free() { alive = false; ThreadStop=true; } } public class SocketReceiver implements Runnable { public boolean alive; public Thread thread; public boolean ThreadStop; public SocketReceiver() { alive = true; ThreadStop= false; thread = new Thread(this); thread.start(); } public void run() { while (alive) { try { if(ThreadStop){ break; } String text=br.readLine(); if(text!=null){ okListener.onMessage(text); } synchronized (this) { wait(100); } Thread.yield(); } catch (Exception e) { e.printStackTrace(); } } } public void free() { alive = false; ThreadStop= true; } } public void close() { try { if (socket != null) { socket.close(); socket = null; } if (sender != null) { sender.free(); sender = null; } if (receiver != null) { receiver.free(); receiver = null; } in = null; out = null; br = null; bw = null; } catch (Exception e) { e.printStackTrace(); } }}
方法调用
public static void main(String[] args) { SocketCon scket = new SocketCon(); scket.setOkListener(new SocketCon.OnOkButtonFireListener() { @Override public void onMessage(String resultStr) { System.out.println("接收到消息:"+resultStr) } }); //发送消息 //scket.sendMag("消息"); //关闭连接 //scket.close(); }
更多相关文章
- Android api 数据的保存方式
- 【Java转Android】30. LitePal操作SQLite数据库
- Android SQLite数据库相关操作
- Android调用系统的发邮件方法
- android 自带的contacts2.db数据库表结构脚本
- android 两个apk之间恭喜数据SharedPreferences
- Android轮播图Banner使用方法
- Android Sqlite数据库中判断某个表是否存在的SQL语句
- Android JSON数据的解析与封装小Demo