完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
socket 作为一种通信机制,可以实现单机或者跨网络之间的通信,要有明确的server端和client端。 android里面最简单的socket 通信的demo: //1. IP 地址 InetAddress inetAddress =InetAddress.getByName("IP address"); // socket port Socket client = newSocket(inetAddress,61203,true); // get data stream InputStream in =client.getinputStream(); OutputStream out =client.getOutputStream(); // deal with data // close connection out.close(); in.close(); client.close(); 在一个完整的通行过程,包括2个socket,一个server段在用,另外一个是client段。整个架构的简介: 1)通常情况下,我们使用线程处理socket携带的信息。 2)clientThread, serverThread处理socket,好处是主线程可以继续其他的工作。 demo创建的流程:1. 在Eclipse里面安装Tomcat 作为server 2. 编写一个service project用来处理client 传递过来的数据,并且把处理过的数据返回到客户端 3. 编写一个简单的android应用,向service发送数据,并且接收service返回的数据 1. 如何在Eclipse里面配置Tomcat不是本文的重点,在网上搜索一堆。这里要说明的如果默认的8080端口被使用,要修改Tomcat配置文件里面的端口号,配置文件的地址是../conf/server.xml 这个只是Tomcat的端口,和socket里面的端口不一样。 2. Server的端代码: 1)ServerThread publicclass SeverThread implements Runnable { privateSocket socket=null; // 定义一个socket 给当前线程使用 privateBufferedReader br=null; // 处理线程里面socket所对应的输入流 publicServerThread(Socket socket) { this.socket=socket; // 初始化socket对应的流 br = newBufferedReader(newInputStreamReader(socket.getInputStream(),"utf-8")); } publicvoid run() { Stringcontent=""; // 不停的loop, 读取client传过的数据 while((content= getContent())!= null){ // 读取socket里面的内容,然后回发, 这里是整个server的核心,也是功能扩展的核心 for(Sockets : MyServer.socketList){ OutputStreamos = s.getOutputStream(); // outputStream 是用socket创建 os.write(("这个server段给你的消息").getBytes("utf-8")) } } } privateString getContent() { try{ returnbr.readLine(); }catch(Exceptionex){ MyServer.socketList.remove(socket);//如果捕获到异常,表明要关闭这个client的连接, 删除该socket } returnnull; } } 定义好一个serverThread,我们就开始在编写service app,定义一个简单的控制台应用即可,host在tomcat上。 public class MyServer{ publicList publicstatic void main(){ ServerSocketss = new ServerSocket(18070) ;// 这里的18070是端口号,这个是client 和server 公用的端口号 // 程序开始不停的loop,等待client的连接 while(true){ Socket s= ss.accept(); socketList.add(s); // 有client的socket过来的时候启动线程处理 newThread(new ServerThread(s)).start(); } } } 至此server段的代码已经编写完毕,启动Tomcat,启动server的application host在Tomcat上,一个完整的service已经好了。 3. 编写client段, client段的结构和server类似,一个clientThread,一个android application public class ClientThread implementsRunnable{ privateSocket socket; //为这个线程定义一个socket privateBufferedReader br = null;// 处理该线程的socket流 privateHandler handler;// 作用是发送message到UI,通知UI改变信息 public ClientThread(Socketsocket, Handler handler) throw IOException { this.socket = socket; this.handler=handler; br=newBufferedReader(new InputStreamReader(sockt.getInputStream())); } publicvoid run(){ try{ Stringcontent=""; // 和server相同,不停的循环读取socket里面的流 while((content=br.readLine())!=null){ // 读到数据之后,发送message,通知UI改变 Messagemsg = new Message(); msg.what=0X123;// 作为message的标识 msg.object=content; handler.sendMessage(msg); } }catch(Exceptionex){ e.printStackTrace(); } } } public class MainActivity extendsActivity implements Runnable { privateButton btnTest; private TextView tv_msg; private EditText etMessage; private String content = ""; Handler handler; // 需要BufferedReader BufferedReader bufferedReader = null; // 需要一个socket Socket socket = null; // 需要一个printWritter PrintWriter out = null; OutputStream os; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 如果是2.3以后的版本,这段必须加上 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() / .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build()); handler = new Handler() { @Override public void handleMessage(Message msg) { // 如果消息来自于子线程 if (msg.what == 0x123) { // 将读取的内容追加显示在文本框中 tv_msg.append("n" + msg.obj.toString()); } } }; initalView(); btnTest.setOnClickListener(myListener); new Thread(MainActivity.this).start(); } privatevoid initalView() { btnTest = (Button) findViewById(R.id.btnTest); etMessage = (EditText) findViewById(R.id.messageET); tv_msg = (TextView) findViewById(R.id.tv_msg); initalSocket(); } privatevoid initalSocket() { try { socket = new Socket(); InetSocketAddress sd = new InetSocketAddress(HostPort.HOST,HostPort.PORT); socket.connect(sd,5000); new Thread(new ClientThread(socket, handler)).start(); // ① os = socket.getOutputStream(); } catch (UnknownHostException e) { // 由于会发生断网什么的异常处理 System.out.print("连接不上了"); e.printStackTrace(); } catch (IOException e) { System.out.print(e.getMessage()); e.printStackTrace(); } } private View.OnClickListenermyListener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnTest: testSocket(); break; } } }; privatevoid testSocket() { // 将用户在文本框内输入的内容写入网络 try { os.write((etMessage.getText().toString() + "rn") .getBytes("utf-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 清空input文本框 etMessage.setText(""); } @Override public void run() { } @SuppressLint("HandlerLeak") public Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); Log.println(1, "test", msg.toString()); tv_msg.setText(tv_msg.getText().toString() + content); } }; } 同时在manifest.xml文件中添加权限 启动androidapplication 即可用socket通行。 以上这种方式其实质就是TCP/IP协议的网络通信。 TCP/IP通信的运行机制是首先向对方发出询问,在等到对方的response后,就给对方发数据。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
3441个成员聚集在这个小组
加入小组物联网工程师必备:怎么选择不同的无线连接威廉希尔官方网站 ,本指南帮你忙!
3302 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3956 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3460 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
4026 浏览 1 评论
20708 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
843浏览 2评论
1075浏览 2评论
1075浏览 1评论
1194浏览 1评论
412浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 20:13 , Processed in 0.814315 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号