之前写过PC与Android之间通过WIFI通信(通过Socket,可以在博客里面搜索),PC作为主机,Android作为客户机,现在手头有一台仪器通过wifi传输数据,如果仪器作为主机发射WIFI热点信号,Android需要连接到该热点才能进一步进行通信,但是由于主机并没有连接到网络,所以在该种情况下Android设备无法使用网络实现相关的网络服务(比如关键数据的上传,网络数据的获取等等),所以仪器在开始设计的时候将其作为客户端,Android设备作为主机(网上的相关资料大多是将Android设备作为客户端),当Android设备开启热点后,仪器会主动尝试连接固定的热点信息,其中网络SSID和密码已经写死了,所以需要手机端手动修改热点名称:

在开启热点之后,此时手机相当于一个路由器,这个路由器的IP地址是固定的(本人测试过3台Android设备,其默认的路由器地址:192.168.43.1,iPhone的默认路由器地址:172.20.10.1),这个Demo主要实现的目标是Android设备客户端发送信息,服务端接受到信息后再发送信息给客户端。那么Android设备创建的SocketServer代码如下:

只有一个按钮,实现在线程中启动相对应的服务,所以在这里就不上图了,直接放代码:

  1. package com.example.socketserver;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintWriter;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. import android.app.Activity;
  13. import android.os.Bundle;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. import android.util.Log;
  17. import android.view.Menu;
  18. import android.view.MenuItem;
  19. import android.view.View;
  20. import android.widget.Button;
  21. import android.widget.Toast;
  22.  
  23. import com.koushikdutta.async.callback.CompletedCallback;
  24. import com.koushikdutta.async.http.WebSocket;
  25. import com.koushikdutta.async.http.WebSocket.StringCallback;
  26. import com.koushikdutta.async.http.libcore.RequestHeaders;
  27. import com.koushikdutta.async.http.server.AsyncHttpServer;
  28. import com.koushikdutta.async.http.server.AsyncHttpServer.WebSocketRequestCallback;
  29. import com.koushikdutta.async.http.server.AsyncHttpServerRequest;
  30. import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
  31. import com.koushikdutta.async.http.server.HttpServerRequestCallback;
  32.  
  33. public class MainActivity extends Activity {
  34. private Button btnStart;
  35. private ServerSocket serverSocket;
  36. private BufferedReader in;
  37. private PrintWriter out;
  38. private Handler hander = new Handler(){
  39.  
  40. @Override
  41. public void handleMessage(Message msg) {
  42. // TODO Auto-generated method stub
  43. super.handleMessage(msg);
  44. String s = (String)msg.obj;
  45. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  46. }
  47.  
  48. };
  49. @Override
  50. protected void onCreate(Bundle savedInstanceState) {
  51. super.onCreate(savedInstanceState);
  52. setContentView(R.layout.activity_main);
  53. btnStart = (Button)findViewById(R.id.button1);
  54. btnStart.setOnClickListener(new View.OnClickListener() {
  55.  
  56. @Override
  57. public void onClick(View v) {
  58. // TODO Auto-generated method stub
  59. new ServerThread().start();//在新线程中启动SocketServer...
  60. }
  61. });
  62. }
  63.  
  64. @Override
  65. public boolean onCreateOptionsMenu(Menu menu) {
  66. // Inflate the menu; this adds items to the action bar if it is present.
  67. getMenuInflater().inflate(R.menu.main, menu);
  68. return true;
  69. }
  70.  
  71. @Override
  72. public boolean onOptionsItemSelected(MenuItem item) {
  73. // Handle action bar item clicks here. The action bar will
  74. // automatically handle clicks on the Home/Up button, so long
  75. // as you specify a parent activity in AndroidManifest.xml.
  76. int id = item.getItemId();
  77. if (id == R.id.action_settings) {
  78. return true;
  79. }
  80. return super.onOptionsItemSelected(item);
  81. }
  82. @Override
  83. protected void onStop() {
  84. // TODO Auto-generated method stub
  85. super.onStop();
  86.  
  87. }
  88. private class ServerThread extends Thread{
  89.  
  90. @Override
  91. public void run() {
  92. // TODO Auto-generated method stub
  93. super.run();
  94. try {
  95. // serverSocket = new ServerSocket(50005);//默认的路由器地址为Address: 192.168.43.1
  96. serverSocket = new ServerSocket(5000);
  97. while (true) {
  98. Socket clientSocket = serverSocket.accept();//阻塞等待处理...
  99. String remoteIP = clientSocket.getInetAddress().getHostAddress();
  100. int remotePort = clientSocket.getLocalPort();
  101. System.out.println("A client connected. IP:" + remoteIP+ ", Port: " + remotePort);
  102. System.out.println("server: receiving.............");
  103. // 获得 client 端的输入输出流,为进行交互做准备
  104. in = new BufferedReader(new InputStreamReader(
  105. clientSocket.getInputStream()));
  106. out = new PrintWriter(clientSocket.getOutputStream(), false);
  107.  
  108. // 获得 client 端发送的数据
  109. String tmp = in.readLine();
  110. // String content = new String(tmp.getBytes("utf-8"));
  111. System.out.println("Client message is: " + tmp);
  112.  
  113. // 向 client 端发送响应数据
  114. out.println("Your message has been received successfully!.");
  115.  
  116. // 关闭各个流
  117. out.close();
  118. in.close();
  119. Message message = hander.obtainMessage();
  120. message.obj=tmp;
  121. hander.sendMessage(message);
  122. try {
  123. Thread.sleep(100);
  124. } catch (InterruptedException e) {
  125. // TODO Auto-generated catch block
  126. e.printStackTrace();
  127. }
  128. }
  129. } catch (IOException e) {
  130. // TODO Auto-generated catch block
  131. e.printStackTrace();
  132. }
  133.  
  134. }
  135.  
  136. }
  137. }

客户端实现的代码与网上相关的资料相差无几,比较简单:

  1. package com.example.serverclient;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.IOException;
  5. import java.io.PrintStream;
  6. import java.net.Socket;
  7. import java.net.UnknownHostException;
  8.  
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.view.Menu;
  12. import android.view.MenuItem;
  13. import android.view.View;
  14. import android.widget.Button;
  15.  
  16. public class MainActivity extends Activity {
  17. private Button sendBtn,sendMessageBtn;
  18. private Socket socket;
  19. private PrintStream output;
  20. private BufferedInputStream bufferedInputStream;
  21. private ReadThread readThread;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. sendBtn = (Button) findViewById(R.id.button1);
  27. sendMessageBtn = (Button) findViewById(R.id.button2);
  28. sendBtn.setOnClickListener(new View.OnClickListener() {
  29.  
  30. @Override
  31. public void onClick(View v) {
  32. // TODO Auto-generated method stub
  33. new Thread(runnable).start();//开启线程
  34. }
  35. });
  36. sendMessageBtn.setOnClickListener(new View.OnClickListener() {
  37.  
  38. @Override
  39. public void onClick(View v) {
  40. // TODO Auto-generated method stub
  41. sendMessage("hello,i am from client message");
  42. }
  43. });
  44. }
  45. Runnable runnable = new Runnable() {
  46.  
  47. @Override
  48. public void run() {
  49. // TODO Auto-generated method stub
  50. initClientSocket();
  51. readThread = new ReadThread();
  52. readThread.start();
  53. }
  54. };
  55.  
  56. public void initClientSocket() {
  57. try {
  58. socket = new Socket("192.168.43.1", 5000);
  59. output = new PrintStream(socket.getOutputStream(), true, "gbk");
  60.  
  61. } catch (UnknownHostException e) {
  62. // TODO Auto-generated catch block
  63. System.out.println("请检查端口号是否为服务器IP");
  64. e.printStackTrace();
  65. } catch (IOException e) {
  66. // TODO Auto-generated catch block
  67. System.out.println("服务器未开启");
  68. e.printStackTrace();
  69. }
  70. output.println("this is the message from client");
  71. }
  72. public byte[] receiveData() {
  73. if (socket == null || socket.isClosed()) {
  74. try {
  75. socket = new Socket("192.168.43.1", 5000);
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. byte[] data = null;
  81. if (socket.isConnected()) {
  82. try {
  83. bufferedInputStream = new BufferedInputStream(socket.getInputStream());
  84. data = new byte[bufferedInputStream.available()];
  85. bufferedInputStream.read(data);
  86. } catch (IOException e) {
  87. e.printStackTrace();
  88. }
  89. } else {
  90. data = new byte[1];
  91. }
  92. return data;
  93. }
  94. private void sendMessage(String str) {
  95. output.println(str);
  96. }
  97.  
  98. public void closeSocket() {
  99. try {
  100. output.close();
  101. socket.close();
  102. } catch (IOException e) {
  103. System.out.println("error"+e);
  104. }
  105. }
  106. private class ReadThread extends Thread{
  107.  
  108. @Override
  109. public void run() {
  110. // TODO Auto-generated method stub
  111. super.run();
  112. while (true) {
  113. byte[] data = receiveData();
  114. if (data.length > 1) {
  115. System.out.println(new String(data));
  116. }
  117. }
  118. }
  119.  
  120. }
  121.  
  122. @Override
  123. public boolean onCreateOptionsMenu(Menu menu) {
  124. // Inflate the menu; this adds items to the action bar if it is present.
  125. getMenuInflater().inflate(R.menu.main, menu);
  126. return true;
  127. }
  128.  
  129. @Override
  130. public boolean onOptionsItemSelected(MenuItem item) {
  131. // Handle action bar item clicks here. The action bar will
  132. // automatically handle clicks on the Home/Up button, so long
  133. // as you specify a parent activity in AndroidManifest.xml.
  134. int id = item.getItemId();
  135. if (id == R.id.action_settings) {
  136. return true;
  137. }
  138. return super.onOptionsItemSelected(item);
  139. }
  140. }

Android设备之间通过Wifi通信的更多相关文章

  1. 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能

    在我们的app中添加网络服务发现功能(NSD)以方便在不同的设备上响应局域网中的请求.这种功能对于多设备之间点对点服务来说很有用,例如多人游戏,多人通话,文件共享等. 一,在网络中注册你的服务 注意: ...

  2. Android客户端与PC服务端、android服务端通过WiFi通信

    前期准备:我的是Linux Mint操作系统(总之折腾的过程中怀疑过是不是系统的问题),首先是要创建wifi热点给android手机使用,这个时候笔记本作为通信的服务器端,android手机作为客户端 ...

  3. android设备之间屏幕共享

    近期公司在开发一款android的设备把屏幕投射到手机上.同一时候手机还能够触控.键盘操作.这样.就达到了屏幕共享的目的. 思考了一下.主要思路: 1.将截图所获取的位图用ffmpeg编码成视频流. ...

  4. Android BLE开发——Android手机与BLE终端通信初识

    蓝牙BLE官方Demo下载地址:   http://download.csdn.net/detail/lqw770737185/8116019参考博客地址:    http://www.eoeandr ...

  5. adb通过wifi连接android设备

    问题背景 近期的项目测试中,需要将移动设备与厂商机器进行usb连接视频传输(投屏).测试过程中需要定位问题,经常需要查看实时日志,移动设备已经和厂商机器usb连接投屏,无法用usb连接到PC,那么有什 ...

  6. adb 通过 WiFi 连接 Android 设备

    PC 和 Android 设备连接在同一个局域网. 查看 Android 设备的 IP:设置 > WLAN > 选择连接的WiFi > 查看IP地址. PC 端执行: ping &l ...

  7. 使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...

  8. Appium:通过wifi连接Android设备

    1.首先用USB连接你的Android设备,然后在终端运行命令,它可以启动设备的5555端口使其在网络上可以连接. adb tcpip 2.现在断开USB连接,然后确保设备和你的电脑连接同一个无线网络 ...

  9. 使用Broadcast实现android组件之间的通信

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...

随机推荐

  1. WCF进阶(一)——概述

    前言 时间的朋友>里面几句特别有预见性的话来说明当今儿世界互联网发展趋势: 市场上有一种叫做"父爱算法"的需求.将会诞生很多伟大的公司.背后的精神就是六个字:你不用懂,听我的 ...

  2. 查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准

    这篇文章主要介绍了查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准,方便初学者选择适合自己的版本,需要的朋友可以参考下 Eclipse 是一个开放源代码的.基于Java的可扩展开发 ...

  3. 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回

    接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录.一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户 ...

  4. kill 进程的一些小细节

    终止前台进程,可以用Ctrl+C组合键.但对于后台进程需要用kill命令. kill PID 还可以加信号(参数),默认情况下是编号为15的信号.term信号将终止所有不能捕捉该信号的进程. -s 可 ...

  5. SDUT OJ 数据结构实验之图论四:迷宫探索

    数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  6. 关于Execel 2007 连接到 hive odbc

    官方给出的都是 2010 或2012版的连接方案,看起来与2007有些不同,但我相信这些功能都是通用的. 下载 odbc hive 驱动.http://hortonworks.com/products ...

  7. $(xx).load()同步

    这是由于 load 加载时并不是同步的,是异步的.在你点击执行 load 时,在load异步处理还没完成时,当然,就是调出了原来 #show 的内容了,当你第二次当点击时,原来第一次点击的 load异 ...

  8. google 浏览器的Debug 调试工具使用

    一个写后台的人 有一天要自己找前台页面的错误 于是乎就得会前台debug 于是乎我不会 就在网上找了一些资料看  不就是几个按钮 嘛 有啥难的  上图片 1.Google 浏览器 F12 就可以看到 ...

  9. Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement

    原因: 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的.由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到targe ...

  10. 网络编程之socket(TCP,UDP)

    socket层 tcp协议和udp协议 1)Socket服务器编程 主要包括下面的几步: 1.打开socket 2.绑定到一个地址和端口 3.侦听进来的连接 4.接受连接 5.读写数据 (2)Sock ...