这篇文章主要为大家详细介绍了机器人中(电源)插座通信的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
机器人中(电源)插座通信简单实现,供大家参考,具体内容如下
(电源)插座通信需要有一个服务器和客户端,可以把同一个应用作为服务器跟客户端,也可以分开成两个应用程序。
先上个图:
这里以一个应用作为服务器跟客户端为示例
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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。