Android(安卓)使用Socket实现服务器与手机客户端的长连接一:一对一聊天
16lz
2021-01-26
1、创建服务器端可以是Web或Java项目,创建类TcpServer:
/** * @描述 服务器端 * @项目名称 SocketServer * @包名 com.java.socket.server * @类名 TCPServer * @author chenlin * @date 2012年6月26日 下午4:36:27 * @version 1.0 */@SuppressWarnings("all")public class TCPServer { public static void main(String[] args) { int port = 10002; try { ServerSocket server = new ServerSocket(port); while (true) { // 获得客户端连接 // 阻塞式方法 System.out.println("准备阻塞..."); final Socket client = server.accept(); System.out.println("阻塞完成..."); new Thread(new Runnable() { @Override public void run() { try { // 输入流,为了获取客户端发送的数据 InputStream is = client.getInputStream(); //得到输出流 OutputStream out = client.getOutputStream(); byte[] buffer = new byte[1024]; int len = -1; System.out.println("准备read..."); while ((len = is.read(buffer)) != -1) { String text = new String(buffer, 0, len); System.out.println(text); //回复信息 out.write("收到信息,over".getBytes()); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } } catch (Exception e) { e.printStackTrace(); } }
2、创建手机端,先写个Socket管理类
/** * @描述 使用socket实现长连接 * @项目名称 App_Chat * @包名 com.android.chat.utils * @类名 TcpUtil * @author chenlin * @date 2012年6月26日 下午4:06:43 * @version 1.0 */public class TcpManager { protected static final int STATE_FROM_SERVER_OK = 0; private static String dsName = "192.168.31.239"; private static int dstPort = 10002; private static Socket socket; private static TcpManager instance; private TcpManager() { }; public static TcpManager getInstance() { if (instance == null) { synchronized (TcpManager.class) { if (instance == null) { instance = new TcpManager(); } } } return instance; } /** * 连接 * * @return */ public boolean connect(final Handler handler) { if (socket == null || socket.isClosed()) { new Thread(new Runnable() { @Override public void run() { try { socket = new Socket(dsName, dstPort); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { throw new RuntimeException("连接错误: " + e.getMessage()); } try { // 输入流,为了获取客户端发送的数据 InputStream is = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer)) != -1) { final String result = new String(buffer, 0, len); Message msg = Message.obtain(); msg.obj = result; msg.what = STATE_FROM_SERVER_OK; handler.sendMessage(msg); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } return true; } /** * 发送信息 * * @param content */ public void sendMessage(String content) { OutputStream os = null; try { if (socket != null) { os = socket.getOutputStream(); os.write(content.getBytes()); os.flush(); } } catch (IOException e) { throw new RuntimeException("发送失败:" + e.getMessage()); } //此处不能关闭// finally {// if (os != null) {// try {// os.close();// } catch (IOException e) {// throw new RuntimeException("未正常关闭输出流:" + e.getMessage());// }// }// } } /** * 关闭连接 */ public void disConnect() { if (socket != null && !socket.isClosed()) { try { socket.close(); } catch (IOException e) { throw new RuntimeException("关闭异常:" + e.getMessage()); } socket = null; } }}
3、创建页面:
/** * @描述 Socket通信简易客户端 * @项目名称 SocketClient * @包名 org.java.socket.client * @类名 ClientActivity * @author chenlin * @date 2012年6月26日 下午4:43:06 * @version 1.0 */public class ClientActivity extends Activity { private EditText mEtContent; private TcpManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); manager = TcpManager.getInstance(); manager.connect(mHandler); } private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case TcpManager.STATE_FROM_SERVER_OK: String result = (String) msg.obj; ToastUtil.show(ClientActivity.this, result); break; default: break; } }; }; /** * 发送信息 * @param view */ public void clickMessage(View view){ mEtContent = (EditText)findViewById(R.id.et); if (mEtContent.getText()!= null) { manager.sendMessage(mEtContent.getText().toString()); } } @Override protected void onDestroy() { manager.disConnect(); super.onDestroy(); }}
4、测试:
先运行服务器
然后启动客户端,按“发送消息”按钮,看服务器端是否打印了数据
———————————————————————
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
有需求者请进站查看,非诚勿扰
https://item.taobao.com/item.htm?spm=686.1000925.0.0.4a155084hc8wek&id=555888526201
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–
更多相关文章
- Android(安卓)Wifi开发
- Android(安卓)IQ包 发送 基于XMPP
- Android调用手机新浪微博客户端分享
- Android(安卓)Handler(四)
- Android(安卓)USB Host与HID通讯(二)
- SpringBoot webSocket 发送广播、点对点消息,Android接收
- Android(安卓)中文API (70) —— BluetoothDevice[蓝牙]
- Android下的BLE编程遇到的一些BUG
- Android(安卓)连接Wifi和创建Wifi热点的实例