,,Android中socket通信的简单实现

,,Android中socket通信的简单实现

这篇文章主要为大家详细介绍了机器人中(电源)插座通信的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

机器人中(电源)插座通信简单实现,供大家参考,具体内容如下

(电源)插座通信需要有一个服务器和客户端,可以把同一个应用作为服务器跟客户端,也可以分开成两个应用程序。

先上个图:

这里以一个应用作为服务器跟客户端为示例

1、添加网络访问权限

uses-permission Android:name=' Android。许可。互联网'/

2、写服务器,在应用上启动

导入Java。io。数据输入流;

导入Java。io。数据输出流;

导入Java。io。io异常;

导入Java。网。inet地址;

导入Java。网。服务器套接字;

导入Java。网。插座;

公共类服务器{

服务器套接字服务器套接字=空

公共最终int port=9998

private int I=0;

公共服务器(){

//输出服务器的互联网协议(互联网协议)地址

尝试{

inet地址addr=inet地址。get localhost();

System.out.println('本地主机:' addr ');

服务器套接字=新的服务器套接字(端口);

系统。出去。println(' 0k ');

} catch (IOException e) {

//TODO自动生成的捕捉块

e。printstacktrace();

}

}

public void startService(){

尝试{

Socket socket=null

System.out.println('waiting . ');

//等待连接,每建立一个连接,就新建一个线程

while(true){

套接字=服务器套接字。接受();//等待一个客户端的连接,在连接之前,此方法是阻塞的

系统。出去。println('连接到'套接字。getine address()':'套接字。getlocalport());

新的连接螺纹(插座)。start();

}

} catch (IOException e) {

//TODO自动生成的捕捉块

系统。出去。println(“io异常”);

e。printstacktrace();

}

}

//向客户端发送信息

类连接线程扩展线程{

Socket socket=null

公共连接线程(套接字套接字){

super();

this.socket=套接字

}

@覆盖

公共无效运行(){

尝试{

数据输入流dis=新数据输入流(套接字。getinputstream());

数据输出流dos=新的数据输出流(套接字。获取输出流());

while(true){

我;

字符串msg recv=dis。读取utf();

System.out.println('来自客户端的消息:' msg recv ');

dos。写utf(msgRecv I);

dos。flush();

}

} catch (IOException e) {

//TODO自动生成的捕捉块

e。printstacktrace();

}

}

}

}

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

新线程(()-新服务器()。startService()).start();

3、客户端代码

导入安卓。OS。捆绑;

导入安卓。OS。处理者;

导入安卓。OS。消息;

导入安卓。小部件。按钮;

导入安卓。小部件。编辑文本;

导入安卓。小部件。textview

导入安卓。小部件。敬酒;

导入Java。io。数据输入流;

导入Java。io。数据输出流;

导入Java。io。io异常;

导入Java。网。inet地址;

导入Java。网。插座;

导入Java。网。unknownhostexception

导入安卓克斯。app compat。app。app compat活动;

/**

* @作者冯海涛

* @时间2020年四月2日14:34:33

* scoket客户端连接测试

*/

公共类插座活动度扩展AppCompatActivity {

//IP地址和端口号

公共静态字符串IP _ ADDRESS=

公共静态(同Internationalorganizations)国际组织端口=9998;

//三个控件

EditText et _ message=null//需要发送的内容

button Bt _ get address=null//获取本机互联网协议(互联网协议)地址

Button bt _ connect=null//连接并发送

Button bt _ startServer=null//启动服务端

TextView TV _ address=null//IP地址

TextView tv _ reply=null//服务器回复的消息

//处理程序

处理程序handler=null

套接字soc=空

DataOutputStream dos=null

DataInputStream dis=null

字符串messageRecv=null

@覆盖

受保护的void onCreate(Bundle saved instancestate){

超级棒。oncreate(savedInstanceState);

setContentView(r . layout。活动_插座);

et _ message=findViewById(r . id。et _ message);

Bt _ get address=findViewById(r . id。Bt _ get地址);

Bt _ connect=findViewById(r . id。Bt _ connect);

Bt _ startServer=findViewById(r . id。Bt _ startServer);

TV _ adress=findViewById(r . id。TV _ address);

TV _ reply=findViewById(r . id。TV _回复);

Bt _ get地址。setonclicklistener(v-{

新线程(()- {

尝试{

inet地址addr=inet地址。get localhost();

System.out.println('本地主机:' addr ');

runOnUiThread(()-TV _ address。settext(addr。tostring().split('/')[1]);

} catch (UnknownHostException e) {

e。printstacktrace();

}

}).start();

});

Bt _ startserver。setonclicklistener(v-{

新线程(()-新服务器()。startService()).start();

吐司。制作文本(套接字活动。“这,”服务已启动,吐司. LENGTH_SHORT)。show();

});

Bt _ connect。setonclicklistener(v-{

IP_ADDRESS=tv_adress.getText().toString();

新建连接线程(et _ message。gettext().toString()).start();

});

处理程序=新的处理程序(消息- {

捆绑包b=消息。get data();//获取消息中的捆对象

string str=b . getstring(' data ');//获取键为数据的字符串的值

TV _回复。append(字符串);

返回错误的

});

}

//新建一个子线程,实现(电源)插座通信

类连接线程扩展线程{

字符串消息=空

公共连接线程(字符串消息){

消息=消息

}

@覆盖

公共无效运行(){

if (soc==null) {

尝试{

//Log.d('socket ',' new socket ');

如果(')。等于(IP地址)){

返回;

}

soc=new Socket(IP_ADDRESS,PORT);

//获取(电源)插座的输入输出流

dis=新数据输入流。getinputstream());

新数据输出流(SOC)。获取输出流());

} catch (IOException e) {

//TODO自动生成的捕捉块

e。printstacktrace();

}

}

尝试{

dos。写utf(消息);

dos。flush();

messageRecv=dis。读取utf();//如果没有收到数据,会阻塞

Message msg=new Message();

Bundle b=new Bundle();

b.putString('data ',messageRecv);

味精。setdata(b);

处理程序。发送消息(msg);

} catch (IOException e) {

//TODO自动生成的捕捉块

e。printstacktrace();

}

}

}

}

下面是可扩展标记语言页面代码

?可扩展标记语言版本='1.0 '编码='utf-8 '?

线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '

xmlns:app=' http://模式。安卓。' com/apk/RES-auto '

xmlns:tools=' http://模式。安卓。' com/tools '

Android:layout _ width=' match _ parent '

Android:layout _ height=' match _ parent '

工具:上下文='。'' SocketActivity '

线性布局

Android:layout _ width=' match _ parent '

Android:layout _ height=' match _ parent '

安卓:方向='垂直'

线性布局

Android:layout _ width=' match _ parent '

Android:layout _ height=' wrap _ content '

android:layout_marginTop='10dp '

纽扣

Android:id=' @ id/Bt _ get address '

Android:layout _ width=' wrap _ content '

Android:layout _ height=' wrap _ content '

android:text='获取互联网协议(互联网协议)地址'/

文本视图

Android:id=' @ id/TV _ address '

android:layout_width='200dp '

Android:layout _ height=' match _ parent '

Android:layout _ margin left=' 15dp '

android:textSize='20dp '

安卓:重力='中心'/

/线性布局

纽扣

android:id='@ id/bt_startServer '

android:text='启动服务'

android:layout_marginTop='10dp '

Android:layout _ width=' wrap _ content '

Android:layout _ height=' wrap _ content '/

编辑文本

android:id='@ id/et_message '

android:layout_marginTop='10dp '

android:hint='请输入发送信息'

Android:layout _ width=' wrap _ content '

Android:layout _ height=' wrap _ content '/

纽扣

android:id='@ id/bt_connect '

android:text='连接发送'

android:layout_marginTop='10dp '

Android:layout _ width=' wrap _ content '

Android:layout _ height=' wrap _ content '/

文本视图

android:id='@ id/tv_reply '

Android:layout _ width=' wrap _ content '

Android:layout _ height=' wrap _ content '

android:layout_marginTop='10dp '

android:text='服务端返回消息:'

android:textSize='30sp'/

/线性布局

/线性布局

记得在与服务器通信之前启动服务器。如果端口被占用,则需要更换端口。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: