android udp与pc端通信实例
来源:互联网 发布:软件测试专业术语 编辑:程序博客网 时间:2024/05/17 02:29
udp通信还是必备知识的,最近花时间去调通了一个例子程序,还不错。包括android程序以及网络调试助手。pc的网络调试助手稂莠不齐,不好弄。我推荐一个网络调试助手。名字就叫网络调试助手,英文名称NetAssist。
1,测试环境
android 4.4真机,window 10系统
网络调试助手适配版本window all
2,网络调试助手指南
百度经验地址:http://jingyan.baidu.com/article/fea4511a70803af7bb91258a.html
界面如下:
支持TCP服务端,客户端调试;UDP服务器,客户端调试。
3,android udp客户端连接类
package com.udp.client;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Enumeration;import android.annotation.SuppressLint;import android.util.Log;public class UDPSocketClientManage {// 服务器IPprivate static String SERVER_IP = "192.168.1.100";// 服务器端口private static int LOCAL_PORT_AUDIO = 5052;// 接收数据包private DatagramPacket Packet_Receive;// 端口private DatagramSocket msocketClient;NetworkState mLastNetworkState = NetworkState.NETWORK_STATE_NULL;SocketConnectListener mConnectListener = null;// 设置网络连接参数public void setNetworkParameter(String strIP, int nPort) {SERVER_IP = strIP;LOCAL_PORT_AUDIO = nPort;}// 注册接收连接状态和数据的回调函数public void RegSocketConnectListener(SocketConnectListener listener) {mConnectListener = listener;}/** * 启动连接服务器 */public void Connect() {// 正在开始连接mLastNetworkState = NetworkState.NETWORK_STATE_CONNECT_ING;try {// 端口msocketClient = new DatagramSocket(LOCAL_PORT_AUDIO);// 接收数据缓存byte[] Buffer_Receive = new byte[1024];// 接收包Packet_Receive = new DatagramPacket(Buffer_Receive,1024);mLastNetworkState = NetworkState.NETWORK_STATE_CONNECT_SUCCEED;} catch (IOException e) {mLastNetworkState = NetworkState.NETWORK_STATE_CONNECT_FAILLD;Log.e("Show", e.toString());e.printStackTrace();} catch (Exception e) {mLastNetworkState = NetworkState.NETWORK_STATE_CONNECT_FAILLD;Log.e("Show", e.toString());e.printStackTrace();}// 向回调发数据if (null != mConnectListener) {mConnectListener.OnConnectStatusCallBack(mLastNetworkState);}if (msocketClient != null) {new Thread(reRunnable).start();}}Runnable reRunnable = new Runnable() {@SuppressLint("NewApi") @Overridepublic void run() {while (true) {try {// 接收数据if (Packet_Receive != null) {msocketClient.receive(Packet_Receive);// 判断数据是否合法InetSocketAddress address = (InetSocketAddress) Packet_Receive.getSocketAddress();// 判断是否是调度服务器的ipif (!address.getHostName().equals(SERVER_IP)) {continue;}// 判断是否是调度服务器的端口if (address.getPort() != LOCAL_PORT_AUDIO) {continue;}int length = Packet_Receive.getLength();if (length > 0) mConnectListener.OnReceiverCallBack(length, Packet_Receive.getData());}} catch (IOException e) {e.printStackTrace();Log.e("Show", e.toString());}}}};/** * 断开连接 */public void Close() {if (msocketClient != null) {msocketClient = null;mLastNetworkState = NetworkState.NETWORK_STATE_DISCONNECT_SUCCEED;mConnectListener.OnConnectStatusCallBack(mLastNetworkState);}}/** * @brief 发送数据 * @param data * :需要发送的数据 * @param len * :数据字节数据 */public void send(byte[] data, int len) {Thread_Send thread_send = new Thread_Send(data, len);new Thread(thread_send).start();}/** * @brief 发送线程 */private class Thread_Send implements Runnable {// 发送数据缓存private byte[] Buffer_Send = new byte[1024];// 发送数据包private DatagramPacket Packet_Send;/** * @brief 构造函数 * @param data * :需要发送的数据 * @param len * :数据字节数据 */public Thread_Send(byte[] data, int len) {// 发送包Packet_Send = new DatagramPacket(Buffer_Send,1024);Packet_Send.setData(data);Packet_Send.setLength(len);}@Overridepublic void run() {try {Packet_Send.setPort(LOCAL_PORT_AUDIO);Packet_Send.setAddress(InetAddress.getByName(SERVER_IP));if (msocketClient != null) {msocketClient.send(Packet_Send);mLastNetworkState = NetworkState.NETWORK_STATE_TXD;mConnectListener.OnConnectStatusCallBack(mLastNetworkState);}else {mLastNetworkState = NetworkState.NETWORK_STATE_NULL;mConnectListener.OnConnectStatusCallBack(mLastNetworkState);}} catch (UnknownHostException e) {e.printStackTrace();mLastNetworkState = NetworkState.NETWORK_STATE_NULL;mConnectListener.OnConnectStatusCallBack(mLastNetworkState);} catch (IOException e) {e.printStackTrace();mLastNetworkState = NetworkState.NETWORK_STATE_NULL;mConnectListener.OnConnectStatusCallBack(mLastNetworkState);}}}// 获取最后的网络状态public NetworkState getLastNetworkState() {return mLastNetworkState;}public static String getLocalIpAddress() {try {for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {NetworkInterface intf = en.nextElement();for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {InetAddress inetAddress = enumIpAddr.nextElement();if (!inetAddress.isLoopbackAddress()&& !inetAddress.isLinkLocalAddress()) {return inetAddress.getHostAddress().toString();}}}} catch (SocketException ex) {Log.e("WifiPreference IpAddress", ex.toString());}return null;}}
4,界面以及调用方法
package com.example.udpdemo;import com.udp.client.NetworkState;import com.udp.client.UDPSocketClientManage;import com.udp.client.SocketConnectListener;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import android.os.Bundle;import android.os.Handler;import android.os.Message;public class MainActivity extends ActionBarActivity implements OnClickListener{ UDPSocketClientManage socketClientManage = null; private String mstrDataString=""; private TextView textViewRecrive; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); findViewById(R.id.button3).setOnClickListener(this); TextView loTextView = (TextView)findViewById(R.id.textViewLoca); //手机端的连接路由之后IP地址,网络调试助手向目标主机发送的IP地址就是这里获取出来的 String strLoString = UDPSocketClientManage.getLocalIpAddress(); if (strLoString != null) { loTextView.setText(strLoString);} textViewRecrive = (TextView)findViewById(R.id.textViewRecrive); socketClientManage = new UDPSocketClientManage(); socketClientManage.RegSocketConnectListener(new SocketConnectListener() {@Overridepublic void OnReceiverCallBack(int nLength, byte[] data) {mstrDataString = new String(data);mHandler.sendEmptyMessage(1);}@Overridepublic void OnConnectStatusCallBack(NetworkState networkState) {switch (networkState) {case NETWORK_STATE_CONNECT_SUCCEED:mHandler.sendEmptyMessage(0);break;default:break;}}}); } Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 0: // 接受到消息之后,对UI控件进行修改Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();break;case 1: // 接受到消息之后,对UI控件进行修改textViewRecrive.append(mstrDataString);Toast.makeText(MainActivity.this, mstrDataString, Toast.LENGTH_SHORT).show();break;default:break;}}}; @Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button1:new Thread(new Runnable() {@Overridepublic void run() {socketClientManage.Connect();}}).start();break;case R.id.button2:EditText ipEditText = (EditText)findViewById(R.id.editText1);EditText porText = (EditText)findViewById(R.id.editText2);String ipString = ipEditText.getText().toString().trim();String portString = porText.getText().toString().trim();socketClientManage.setNetworkParameter(ipString, portString != null ? Integer.parseInt(portString) : 0);Toast.makeText(MainActivity.this, "设置成功", Toast.LENGTH_SHORT).show();break;case R.id.button3:EditText sendEditText = (EditText)findViewById(R.id.editText3);String sendDataString = sendEditText.getText().toString().trim();if(sendDataString != null)socketClientManage.send(sendDataString.getBytes(), sendDataString.getBytes().length);break;default:break;}}}
5,记得权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
6,实现效果如下
7,总结
首先明确概念,就是通信流程。同一个路由器中,你pc连上路由获取的ip地址,跟移动端连接路由获取的ip地址是不一样的,只不过网段是一样的。
这个时候就要确定相对而言的目标ip地址以及端口的概念。pc端发送,就是往移动端的ip,端口地址发送。移动端就是反过来了。
还有就是好的pc端的调试工具。
本博客的项目下载(里面有源码以及pc网络调试助手):http://download.csdn.net/detail/qq_16064871/9714545
1 0
- android udp与pc端通信实例
- android模拟器与PC进行UDP通信
- PC与Android模拟器UDP/TCP 通信的端口问题
- PC与Android模拟器UDP/TCP 通信的端口问题
- 实现PC端与手机端的UDP通信
- Android与PC端WIFI通信
- Android与PC端WIFI通信 .
- Android手机与PC端进行通信
- Android手机与PC端进行通信
- 详细分析局域网内通过无线实现Android端与PC端TCP/UDP通信的四种情况
- 安卓PC实现通信与UDP的Java实现
- PC端与android手机端使用adb forword通信
- PC端与android手机端使用adb forword通信
- PC端与android手机端使用adb forword通信
- Android 手机端与pc服务器之Socket通信
- Android使用蓝牙与PC端进行通信
- Android客户端接收PC端UDP广播
- Android与PC的socket通信
- 短信开发(华为软件包)
- dtd详解
- 如何找到appstore下载的系统dmg
- C语言50题之百度笔试题
- LeetCode 461. Hamming Distance
- android udp与pc端通信实例
- 本周小结
- @property基本概念
- Java语言基础(六)之 —— 顺序结构
- 安全工具介绍
- 字节对齐(Data Alignment)
- Swift3.0通过闭包回调传递参数 / @escaping
- spark RDD操作算子详解(应用场景汇总)
- 《零点起飞学C语言(康莉)》读书笔记六