Android设备之间通过Wifi通信
之前写过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代码如下:
只有一个按钮,实现在线程中启动相对应的服务,所以在这里就不上图了,直接放代码:
- package com.example.socketserver;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- import android.widget.Toast;
- import com.koushikdutta.async.callback.CompletedCallback;
- import com.koushikdutta.async.http.WebSocket;
- import com.koushikdutta.async.http.WebSocket.StringCallback;
- import com.koushikdutta.async.http.libcore.RequestHeaders;
- import com.koushikdutta.async.http.server.AsyncHttpServer;
- import com.koushikdutta.async.http.server.AsyncHttpServer.WebSocketRequestCallback;
- import com.koushikdutta.async.http.server.AsyncHttpServerRequest;
- import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
- import com.koushikdutta.async.http.server.HttpServerRequestCallback;
- public class MainActivity extends Activity {
- private Button btnStart;
- private ServerSocket serverSocket;
- private BufferedReader in;
- private PrintWriter out;
- private Handler hander = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- String s = (String)msg.obj;
- Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnStart = (Button)findViewById(R.id.button1);
- btnStart.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- new ServerThread().start();//在新线程中启动SocketServer...
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- @Override
- protected void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
- }
- private class ServerThread extends Thread{
- @Override
- public void run() {
- // TODO Auto-generated method stub
- super.run();
- try {
- // serverSocket = new ServerSocket(50005);//默认的路由器地址为Address: 192.168.43.1
- serverSocket = new ServerSocket(5000);
- while (true) {
- Socket clientSocket = serverSocket.accept();//阻塞等待处理...
- String remoteIP = clientSocket.getInetAddress().getHostAddress();
- int remotePort = clientSocket.getLocalPort();
- System.out.println("A client connected. IP:" + remoteIP+ ", Port: " + remotePort);
- System.out.println("server: receiving.............");
- // 获得 client 端的输入输出流,为进行交互做准备
- in = new BufferedReader(new InputStreamReader(
- clientSocket.getInputStream()));
- out = new PrintWriter(clientSocket.getOutputStream(), false);
- // 获得 client 端发送的数据
- String tmp = in.readLine();
- // String content = new String(tmp.getBytes("utf-8"));
- System.out.println("Client message is: " + tmp);
- // 向 client 端发送响应数据
- out.println("Your message has been received successfully!.");
- // 关闭各个流
- out.close();
- in.close();
- Message message = hander.obtainMessage();
- message.obj=tmp;
- hander.sendMessage(message);
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
客户端实现的代码与网上相关的资料相差无几,比较简单:
- package com.example.serverclient;
- import java.io.BufferedInputStream;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button sendBtn,sendMessageBtn;
- private Socket socket;
- private PrintStream output;
- private BufferedInputStream bufferedInputStream;
- private ReadThread readThread;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- sendBtn = (Button) findViewById(R.id.button1);
- sendMessageBtn = (Button) findViewById(R.id.button2);
- sendBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- new Thread(runnable).start();//开启线程
- }
- });
- sendMessageBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- sendMessage("hello,i am from client message");
- }
- });
- }
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- initClientSocket();
- readThread = new ReadThread();
- readThread.start();
- }
- };
- public void initClientSocket() {
- try {
- socket = new Socket("192.168.43.1", 5000);
- output = new PrintStream(socket.getOutputStream(), true, "gbk");
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- System.out.println("请检查端口号是否为服务器IP");
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- System.out.println("服务器未开启");
- e.printStackTrace();
- }
- output.println("this is the message from client");
- }
- public byte[] receiveData() {
- if (socket == null || socket.isClosed()) {
- try {
- socket = new Socket("192.168.43.1", 5000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- byte[] data = null;
- if (socket.isConnected()) {
- try {
- bufferedInputStream = new BufferedInputStream(socket.getInputStream());
- data = new byte[bufferedInputStream.available()];
- bufferedInputStream.read(data);
- } catch (IOException e) {
- e.printStackTrace();
- }
- } else {
- data = new byte[1];
- }
- return data;
- }
- private void sendMessage(String str) {
- output.println(str);
- }
- public void closeSocket() {
- try {
- output.close();
- socket.close();
- } catch (IOException e) {
- System.out.println("error"+e);
- }
- }
- private class ReadThread extends Thread{
- @Override
- public void run() {
- // TODO Auto-generated method stub
- super.run();
- while (true) {
- byte[] data = receiveData();
- if (data.length > 1) {
- System.out.println(new String(data));
- }
- }
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- }
Android设备之间通过Wifi通信的更多相关文章
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
在我们的app中添加网络服务发现功能(NSD)以方便在不同的设备上响应局域网中的请求.这种功能对于多设备之间点对点服务来说很有用,例如多人游戏,多人通话,文件共享等. 一,在网络中注册你的服务 注意: ...
- Android客户端与PC服务端、android服务端通过WiFi通信
前期准备:我的是Linux Mint操作系统(总之折腾的过程中怀疑过是不是系统的问题),首先是要创建wifi热点给android手机使用,这个时候笔记本作为通信的服务器端,android手机作为客户端 ...
- android设备之间屏幕共享
近期公司在开发一款android的设备把屏幕投射到手机上.同一时候手机还能够触控.键盘操作.这样.就达到了屏幕共享的目的. 思考了一下.主要思路: 1.将截图所获取的位图用ffmpeg编码成视频流. ...
- Android BLE开发——Android手机与BLE终端通信初识
蓝牙BLE官方Demo下载地址: http://download.csdn.net/detail/lqw770737185/8116019参考博客地址: http://www.eoeandr ...
- adb通过wifi连接android设备
问题背景 近期的项目测试中,需要将移动设备与厂商机器进行usb连接视频传输(投屏).测试过程中需要定位问题,经常需要查看实时日志,移动设备已经和厂商机器usb连接投屏,无法用usb连接到PC,那么有什 ...
- adb 通过 WiFi 连接 Android 设备
PC 和 Android 设备连接在同一个局域网. 查看 Android 设备的 IP:设置 > WLAN > 选择连接的WiFi > 查看IP地址. PC 端执行: ping &l ...
- 使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏
android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...
- Appium:通过wifi连接Android设备
1.首先用USB连接你的Android设备,然后在终端运行命令,它可以启动设备的5555端口使其在网络上可以连接. adb tcpip 2.现在断开USB连接,然后确保设备和你的电脑连接同一个无线网络 ...
- 使用Broadcast实现android组件之间的通信
android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...
随机推荐
- WCF进阶(一)——概述
前言 时间的朋友>里面几句特别有预见性的话来说明当今儿世界互联网发展趋势: 市场上有一种叫做"父爱算法"的需求.将会诞生很多伟大的公司.背后的精神就是六个字:你不用懂,听我的 ...
- 查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准
这篇文章主要介绍了查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准,方便初学者选择适合自己的版本,需要的朋友可以参考下 Eclipse 是一个开放源代码的.基于Java的可扩展开发 ...
- 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回
接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录.一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户 ...
- kill 进程的一些小细节
终止前台进程,可以用Ctrl+C组合键.但对于后台进程需要用kill命令. kill PID 还可以加信号(参数),默认情况下是编号为15的信号.term信号将终止所有不能捕捉该信号的进程. -s 可 ...
- SDUT OJ 数据结构实验之图论四:迷宫探索
数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- 关于Execel 2007 连接到 hive odbc
官方给出的都是 2010 或2012版的连接方案,看起来与2007有些不同,但我相信这些功能都是通用的. 下载 odbc hive 驱动.http://hortonworks.com/products ...
- $(xx).load()同步
这是由于 load 加载时并不是同步的,是异步的.在你点击执行 load 时,在load异步处理还没完成时,当然,就是调出了原来 #show 的内容了,当你第二次当点击时,原来第一次点击的 load异 ...
- google 浏览器的Debug 调试工具使用
一个写后台的人 有一天要自己找前台页面的错误 于是乎就得会前台debug 于是乎我不会 就在网上找了一些资料看 不就是几个按钮 嘛 有啥难的 上图片 1.Google 浏览器 F12 就可以看到 ...
- Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement
原因: 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的.由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到targe ...
- 网络编程之socket(TCP,UDP)
socket层 tcp协议和udp协议 1)Socket服务器编程 主要包括下面的几步: 1.打开socket 2.绑定到一个地址和端口 3.侦听进来的连接 4.接受连接 5.读写数据 (2)Sock ...