Android设备间通信(wifi连接)
来源:互联网 发布:mac下载os x yosemite 编辑:程序博客网 时间:2024/05/01 17:39
基于TCP/IP协议实现:
1、首先在服务端新建ServerSocket类,指定端口号,利用其获取连接信息,得到Socket,之后的数据接收与发送,就可以通过这个Socket来进行实现。
server端主程序
package aw.com.wifi_connect_server;import android.app.Activity;import android.content.Context;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class MainActivity extends AppCompatActivity { private TextView server_ip_port; private TextView client_ip_port; private TextView sendData; private String msg_send; private EditText message; private ServerSocket serverSocket = null; StringBuffer stringBuffer = new StringBuffer(); private InputStream inputStream; private String IP=null; private int Port=0; private String clientIp; private int clientPort; private Socket socket = null; public Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { //super.handleMessage(msg); switch (msg.what){ case 1: server_ip_port.setText(msg.obj.toString()); break; case 2: message.setText(msg.obj.toString()); stringBuffer.setLength(0); break; case 3: client_ip_port.setText(msg.obj.toString()); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); server_ip_port = (TextView) findViewById(R.id.server); client_ip_port = (TextView) findViewById(R.id.client); message = (EditText) findViewById(R.id.message_get); sendData = (EditText) findViewById(R.id.send_data); receiveData(); } /* 服务器端接收数据 需要注意以下一点: 服务器端应该是多线程的,因为一个服务器可能会有多个客户端连接在服务器上; */ private void receiveData() { Thread thread = new Thread(){ @Override public void run() { super.run(); /*指明服务器端的端口号*/ try { serverSocket = new ServerSocket(8091); } catch (IOException e) { e.printStackTrace(); } if (serverSocket!=null && !serverSocket.isClosed()){ Port = serverSocket.getLocalPort(); } WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); int state = wifiManager.getWifiState(); if (state == 3) { WifiInfo info = wifiManager.getConnectionInfo(); IP = intIP2StringIP(info.getIpAddress()); Message message_1 = handler.obtainMessage(); message_1.what = 1; message_1.obj = "IP:" + IP + " PORT: " + Port; handler.sendMessage(message_1); while (true) { try { if (serverSocket != null && !serverSocket.isClosed()) { socket = serverSocket.accept(); clientIp = socket.getInetAddress().toString(); clientIp = clientIp.substring(1,clientIp.length()); clientPort = socket.getPort(); Message message_3 = handler.obtainMessage(); message_3.what = 3; message_3.obj = "IP:" + clientIp + " PORT:" + clientPort; handler.sendMessage(message_3); inputStream = socket.getInputStream(); new ServerThread(socket, inputStream).start(); } } catch (IOException e) { e.printStackTrace(); } } } } }; thread.start(); } private String intIP2StringIP(int ip) { return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF); } public void send(View view){ msg_send = sendData.getText().toString(); if (msg_send.isEmpty()){ Toast.makeText(MainActivity.this, "Please input Sending data", Toast.LENGTH_SHORT).show(); } msg_send = msg_send + "\0"; Thread thread = new Thread() { @Override public void run() { super.run(); try { OutputStream outputStream = socket.getOutputStream(); outputStream.write(msg_send.getBytes()); } catch (IOException e) { e.printStackTrace(); } } }; thread.start(); } class ServerThread extends Thread{ private Socket socket; private InputStream inputStream; private StringBuffer stringBuffer = MainActivity.this.stringBuffer; public ServerThread(Socket socket,InputStream inputStream){ this.socket = socket; this.inputStream = inputStream; } @Override public void run() { int len; byte[] bytes = new byte[20]; boolean isString = false; try { //在这里需要明白一下什么时候其会等于 -1,其在输入流关闭时才会等于 -1, //并不是数据读完了,再去读才会等于-1,数据读完了,最结果也就是读不到数据为0而已; while ((len = inputStream.read(bytes)) != -1) { for(int i=0; i
server端页面
2、客户端,需知道服务器端的IP地址与端口号,然后才能依据server端的IP和端口号与server端建立连接,得到Socket,建立连接后,数据的接收与发送同样依赖于这一Socket。
client端主程序
package aw.com.wifi_connect_client;import android.content.Context;import android.net.wifi.WifiManager;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;public class MainActivity extends AppCompatActivity { private EditText et_IP, et_data; private TextView local_ip_port; private String localIP; private int localPort; private OutputStream outputStream = null; private Socket socket = null; private String IP; private String data; private boolean socketStatus = false; private EditText message; private StringBuffer stringBuffer = new StringBuffer(); private InputStream inputStream; public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //super.handleMessage(msg); switch (msg.what) { case 1: local_ip_port.setText(msg.obj.toString()); break; case 2: message.setText(msg.obj.toString()); stringBuffer.setLength(0); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_IP = (EditText) findViewById(R.id.et_ip); et_data = (EditText) findViewById(R.id.et_data); local_ip_port = (TextView) findViewById(R.id.local_ip_port); message = (EditText) findViewById(R.id.message_get); } public void connect(View view) { IP = et_IP.getText().toString(); if (IP.isEmpty()) { Toast.makeText(MainActivity.this, "Please input Server IP", Toast.LENGTH_SHORT).show(); } Thread thread = new Thread() { @Override public void run() { super.run(); WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); int state = wifiManager.getWifiState(); if (!socketStatus && state == 3) { try { socket = new Socket(IP, 8091); if (socket != null && !socket.isClosed()) { localIP = socket.getLocalAddress().toString(); localIP = localIP.substring(1, localIP.length()); localPort = socket.getLocalPort(); Message message_1 = handler.obtainMessage(); message_1.what = 1; message_1.obj = "IP:" + localIP + " PORT:" + localPort; handler.sendMessage(message_1); socketStatus = true; outputStream = socket.getOutputStream(); receiveData(); //建立连接后,才可进行数据发送与数据接收 } } catch (IOException e) { e.printStackTrace(); } } } }; thread.start(); } public void send(View view) { data = et_data.getText().toString(); if (data.isEmpty()) { Toast.makeText(MainActivity.this, "Please input Sending Data", Toast.LENGTH_SHORT).show(); } data = data + "\0"; Thread thread = new Thread() { @Override public void run() { super.run(); if (socketStatus) { try { outputStream.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); } } } }; thread.start(); } /** * 接收数据 */ private void receiveData() { Thread thread = new Thread() { @Override public void run() { super.run(); try { inputStream = socket.getInputStream(); new ServerThread(socket, inputStream).start(); } catch (IOException e) { e.printStackTrace(); } } }; thread.start(); } class ServerThread extends Thread{ private Socket socket; private InputStream inputStream; private StringBuffer stringBuffer = MainActivity.this.stringBuffer; public ServerThread(Socket socket, InputStream inputStream) { this.socket = socket; this.inputStream = inputStream; } @Override public void run() { int len; byte[] bytes = new byte[20]; boolean isString = false; try { //在这里需要明白一下什么时候其会等于 -1,其在输入流关闭时才会等于 -1, //并不是数据读完了,再去读才会等于-1,数据读完了,最结果也就是读不到数据为0而已; while ((len = inputStream.read(bytes)) != -1) { for(int i=0; i
客户端页面
server端与client端页面效果
注意事项:
由于使用到了网络,故需要添加相应的权限,若缺少可能会出现如下错误
10-12 20:09:03.680 23977-24056/aw.com.wifi_connect_server W/System.err: java.net.SocketException: Permission denied
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.createImpl(ServerSocket.java:309)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.getImpl(ServerSocket.java:258)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.bind(ServerSocket.java:377)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.<init>(ServerSocket.java:237)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.<init>(ServerSocket.java:128)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at aw.com.wifi_connect_server.MainActivity$2.run(MainActivity.java:71)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.createImpl(ServerSocket.java:309)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.getImpl(ServerSocket.java:258)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.bind(ServerSocket.java:377)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.<init>(ServerSocket.java:237)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.<init>(ServerSocket.java:128)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at aw.com.wifi_connect_server.MainActivity$2.run(MainActivity.java:71)
在server与client的AndroidManifest.xml中添加相应权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERNET" />
阅读全文
0 0
- Android设备间通信(wifi连接)
- Android设备间Wifi通信
- adb wifi连接android设备
- 通过wifi与设备进行通信(Android)
- android wifi(WAP/PSK加密)蓝牙设备的连接
- adb通过wifi连接android设备(魅族note3)
- 两台android设备间通过OTG-USB连接,实现通信(android设备间的通信)
- 两台android设备间通过OTG-USB连接,实现通信(android设备间的通信)
- adb 用 wifi 连接 android 设备
- 通过wifi连接android设备的方法
- 利用wifi连接android设备进行调试
- 通过wifi连接android设备的方法
- 通过wifi连接android设备的方法
- 通过wifi连接android设备的方法
- 通过wifi连接android设备的方法
- 获取android设备wifi连接状态
- wifi连接android设备进行调试
- Android设备通过wifi连接adb调试
- 关于win10下搭建kafka0.10的一些坑
- 阿里巴巴Java开发规约插件安装IDEA和Eclipse教程
- Java的单例及多例设计模式
- 第1章 引论
- scala Currying
- Android设备间通信(wifi连接)
- SecondarySort二次排序代码
- [LeetCode]7.Reverse Integer ❤
- python的一些知识点小结(1)
- 5.Spark SQL:Parquet数据源之自动分区推断
- 中国著名的数学家
- 字符数组与字符指针
- 安全相关网站
- 面试平安科技--二面