服务端:
new Thread(new Runnable() { @Override public void run() { try { // 监听指定的端口 int port = 55533; server = new ServerSocket(port); Log.e(TAG, "socketServer将一直等待连接的到来"); serviceSocket = server.accept();//如果不设置连接超时,会发生阻塞等待 Log.e(TAG, "是否连接中: " + serviceSocket.isConnected()); serviceSocket.setSoTimeout(3000);// 设置读取流的超时时间,不设置,则是一直阻塞读取 byte[] bytes; // 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取 InputStream inputStream = serviceSocket.getInputStream(); final OutputStream outputStream = serviceSocket.getOutputStream(); //因为对方无论何时发送数据,我们必须接收。这里开了个子线程在循环读流。由于读流是阻塞式,所以需要设置读流超时时间 while (isAccept) { outputStream.write("ok\r\n".getBytes()); outputStream.flush(); Log.e(TAG, "发送成功"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } int len = inputStream.available(); StringBuilder sb = new StringBuilder(); while (len != 0) { bytes = new byte[len]; inputStream.read(bytes); // 注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8 sb.append(new String(bytes, 0, len, "UTF-8")); len = inputStream.available(); Log.e(TAG, "get message from client: " + sb);; } } } catch (Exception e) { Log.e(TAG, "socket错误===" + e.toString()); } } }).start();
客户端:
int port = 55533; // 与服务端建立连接 Log.d("data====", socket + "==========" + outputStream); socket = new Socket(ipAddress, port); socket.setKeepAlive(true); outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); myHandler.sendEmptyMessage(3); byte[] bytes; while (isConnect) { int len = inputStream.available(); StringBuilder sb = new StringBuilder(); while (len != 0) { bytes = new byte[len]; inputStream.read(bytes); sb.append(new String(bytes, 0, len, "UTF-8")); len = inputStream.available(); Log.e("data===", "消息: " + sb); } if (!TextUtils.isEmpty(msg)) { try { Log.e("data====", " 开始传数据"); outputStream.write(msg.getBytes()); outputStream.flush(); msg = ""; myHandler.sendEmptyMessage(2); Log.e("data====", " 传数据finish..."); } catch (Exception e) { msg = ""; myHandler.sendEmptyMessage(1); e.printStackTrace(); Log.e("data====", "333错误: " + e.toString()); } } }