Android中socket通信简单实现

socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。
先上个图:

这里以一个APP作为服务器跟客户端为示例
1、添加网络访问权限

<uses-permission android:name="android.permission.INTERNET" />

2、写服务器,在APP上启动

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;public class Server {ServerSocket serverSocket = null;public final int port = 9998;private int i = 0;public Server(){//输出服务器的IP地址try {InetAddress addr = InetAddress.getLocalHost();System.out.println("local host:"+addr);serverSocket = new ServerSocket(port);System.out.println("0k");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void startService(){try {Socket socket = null;System.out.println("waiting...");//等待连接,每建立一个连接,就新建一个线程while(true){socket = serverSocket.accept();//等待一个客户端的连接,在连接之前,此方法是阻塞的System.out.println("connect to"+socket.getInetAddress()+":"+socket.getLocalPort());new ConnectThread(socket).start();}} catch (IOException e) {// TODO Auto-generated catch blockSystem.out.println("IOException");e.printStackTrace();}}//向客户端发送信息class ConnectThread extends Thread{Socket socket = null;public ConnectThread(Socket socket){super();this.socket = socket;}@Overridepublic void run(){try {DataInputStream dis = new DataInputStream(socket.getInputStream());DataOutputStream dos = new DataOutputStream(socket.getOutputStream());while(true){i++;String msgRecv = dis.readUTF();System.out.println("msg from client:"+msgRecv);dos.writeUTF(msgRecv + i);dos.flush();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

需要在线程中调用,调用方法:

new Thread(() -> new Server().startService()).start();

3、客户端代码

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;import androidx.appcompat.app.AppCompatActivity;/*** @author fenghaitao* @time  2020年4月2日14:34:33* scoket客户端连接测试*/
public class SocketActivity extends AppCompatActivity {//IP地址和端口号public static String IP_ADDRESS = "";public static int PORT = 9998;//三个控件EditText et_message = null;  //需要发送的内容Button bt_getAdress = null;   //获取本机IP地址Button bt_connect = null;   //连接并发送Button bt_startServer = null;   //启动服务端TextView tv_adress = null;   //ip地址TextView tv_reply = null;   //服务器回复的消息//handlerHandler handler = null;Socket soc = null;DataOutputStream dos = null;DataInputStream dis = null;String messageRecv = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_socket);et_message = findViewById(R.id.et_message);bt_getAdress = findViewById(R.id.bt_getAdress);bt_connect = findViewById(R.id.bt_connect);bt_startServer = findViewById(R.id.bt_startServer);tv_adress = findViewById(R.id.tv_adress);tv_reply = findViewById(R.id.tv_reply);bt_getAdress.setOnClickListener(v -> {new Thread(() -> {try {InetAddress addr = InetAddress.getLocalHost();System.out.println("local host:"+addr);runOnUiThread(() -> tv_adress.setText(addr.toString().split("/")[1]));} catch (UnknownHostException e) {e.printStackTrace();}}).start();});bt_startServer.setOnClickListener(v -> {new Thread(() -> new Server().startService()).start();Toast.makeText(SocketActivity.this,"服务已启动",Toast.LENGTH_SHORT).show();});bt_connect.setOnClickListener(v -> {IP_ADDRESS = tv_adress.getText().toString();new ConnectionThread(et_message.getText().toString()).start();});handler = new Handler(msg -> {Bundle b = msg.getData();  //获取消息中的Bundle对象String str = b.getString("data");  //获取键为data的字符串的值tv_reply.append(str);return false;});}//新建一个子线程,实现socket通信class ConnectionThread extends Thread {String message = null;public ConnectionThread(String msg) {message = msg;}@Overridepublic void run() {if (soc == null) {try {//Log.d("socket","new socket");if ("".equals(IP_ADDRESS)) {return;}soc = new Socket(IP_ADDRESS, PORT);//获取socket的输入输出流dis = new DataInputStream(soc.getInputStream());dos = new DataOutputStream(soc.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}try {dos.writeUTF(message);dos.flush();messageRecv = dis.readUTF();//如果没有收到数据,会阻塞Message msg = new Message();Bundle b = new Bundle();b.putString("data", messageRecv);msg.setData(b);handler.sendMessage(msg);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

下面是xml页面代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SocketActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"><Buttonandroid:id="@+id/bt_getAdress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="获取IP地址"/><TextViewandroid:id="@+id/tv_adress"android:layout_width="200dp"android:layout_height="match_parent"android:layout_marginLeft="15dp"android:textSize="20dp"android:gravity="center"/></LinearLayout><Buttonandroid:id="@+id/bt_startServer"android:text="启动服务"android:layout_marginTop="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/et_message"android:layout_marginTop="10dp"android:hint="请输入发送信息"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/bt_connect"android:text="连接发送"android:layout_marginTop="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/tv_reply"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="服务端返回消息:"android:textSize="30sp"/></LinearLayout>
</LinearLayout>

客户端跟服务器进行通信之前记得先启动服务器,如果端口被占用需要换个端口。

Android中socket通信简单实现相关推荐

  1. protobuf和socket通信简单实例

    protobuf和socket通信简单实例   protobuf是 Google 公司内部的混合语言数据标准,可以用来定义通信的协议,由于其有序列化和反序列化的操作,减小了存储或通信的数据量,从而达到 ...

  2. C#中Socket通信编程的同步实现

    目录(?)[+] Socket编程基础 什么是Socket编程的同步实现 如何实现Socket同步通信 服务端 基本流程 代码示例 客户端 基本流程 代码示例 总结 本文通过分析和总结C#中Socke ...

  3. python安卓开发实例_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  4. android 手机 与 python服务器_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  5. C#中Socket的简单使用

    以前学过的Socket,后来没怎么用过,就基本忘了,所以闲来时重新回顾学习一番. 一.Socket的概念 Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和 ...

  6. Java中Socket通信-客户端与服务端相互传输对象数据

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  7. Java中Socket通信-客户端向服务端发送照片

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  8. C#中Socket通信用法实例详解

    本文实例讲述了C#中Socket通信用法.分享给大家供大家参考.具体如下: 一.UDP方式: 服务器端代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  9. android中PAG的简单使用

    (入门篇)android中PAG的简单使用 一.pag是什么? 示例:pag官网 二.使用步骤 1.引入库 代码如下(示例):在app文件夹下的build.gradle文件中,添加下面这条依赖,添加到 ...

最新文章

  1. Python:Scrapy Shell
  2. Android中对Log日志文件的分析[转]
  3. C#程序调用外部程序
  4. HDU 5289 Assignment(单调队列)
  5. php的v_PHPV是什么意思
  6. 微分先行PID控制算法用C语言实现!
  7. JS中给一个对象动态追加key
  8. Angular formControl指令定义的位置
  9. controller属于哪一层_孺教网分享|家长层次有五层,家长们都来看看,你属于哪一层?...
  10. api 文件夹index.js 集合写法
  11. [蛋蛋の涂鸦日记]02-致电通渠中心
  12. 计算机辅助翻译课怎么学的,计算机辅助翻译原理与实践
  13. 如何掌握mysql的查询语句_如何分析mysql的查询语句
  14. react取消捕获_React生命周期
  15. Cortex-M3 (NXP LPC1788)之ADC模/数转换器
  16. 【基础】PNP三极管导通条件____很具代表性
  17. 计算机界面视频录制软件,视频录制工具怎么用?这样的电脑录屏方法超实用!...
  18. AI研习丨专题:面向共享出行的群体智能技术与应用
  19. php流媒体技术srs,基于SRS开源直播系统设计与实现.doc
  20. (Qt)windows下串口检测-热插拔监测、获取可用串口

热门文章

  1. 俄罗斯----中国人对它的颠覆性---不正确的神话
  2. opc通讯配置、Dcom配置、wincc opc通讯配置(避坑版)
  3. 时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用
  4. html如何设置表表头背景色,HTML表格标记教程(36):表头的背景色属性BGCOLOR
  5. 领扣 52. N皇后 II
  6. 基于微信小程序的科普之家小程序-计算机毕业设计
  7. 我是如何放弃 JSP,转向 REST 编程的
  8. java 万年历接口_接口详细介绍-万年历查询
  9. RFID票务管理系统
  10. 《构建之法》中关于创新的探究