DatagramSocket总是发送UDP数据后无法接收数据
ref:http://blog.chinaunix.net/uid-20771867-id-3416509.html
cmd:telnet localhost 5554
redir add udp:8002:8001 (将PC 8002端口映射为模拟器 8001端口)
模拟器-SERVER:ServerSocket server = new ServerSocket(8001);//zcl:7100改为2888
public static void ReceiveUDP() throws IOException {
// TODO Auto-generated method stub
ReliableUDP udp = new ReliableUDP(null, "172.17.21.231", 8001, 8001);
byte[] revBuf = new byte[1024];
int res = udp.ReadFixedLength(revBuf, 1);
}
PC-CLIENT:Socket socket = new Socket("127.0.0.1", 8002);
《TCP/UDP测试工具》 UDP:127.0.0.1 port 8002 (注意:8002是PC的映射端口)
ok ——》 最终找到原因:是redir add会抢占端口:
ok ——》解决方法:环境设置——关键是一定要使用remotePC,单靠本机无法实现调试
+++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++
+ localPC + + remotePC +
+ ip:172.17.22.8 + + ip:172.17.21.54 +
+ redir udp:: + + +
+ + + +
+ +++++++++++++++++++++++++++++ + + +
+ + android vm + + + +
+ + + + + +
+ + + + + +
+ + send(DestIP=remotePC, + + + Receive(localPort=) +
+ + localPort=) + + + +
+ + DestPort=) + + + +
+ + --------------------------------------> -
+ + + + + +
+ + + + + +
+ + Receive(localPort=), + + + send( DestIP=localPC +
+ + + + + localPort=) +
+ + + + + DestPort=) +
+ + + + + +
+ + <----------+---<----------+----- +
+ + + + + +
+ + + + + +
+ +++++++++++++++++++++++++++++ + + +
+ + + +
+++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++
ok ——》code:
public class LEDControlerDriver {
public static void SendUDP() {
// TODO Auto-generated method stub
ReliableUDP udp = new ReliableUDP(null, DestIP, 8001, 8001);//to lydsw 前一个8001是模拟器-SERVER port,后一个8001是pc 接收消息的port,注意!不是pc映射给模拟器的端口(8002)
String s= "32323213";
int res = udp.SendFixedLength(s.getBytes(), s.length());
}
public static void ReceiveUDP() throws IOException {
// TODO Auto-generated method stub
ReliableUDP udp = new ReliableUDP(null, DestIP, 8001, 8001);//to lydsw 前一个8001是模拟器-SERVER port,后一个8001是pc 接收消息的port,注意!不是pc映射给模拟器的端口(8002)
byte[] revBuf = new byte[1];
int res = udp.ReadFixedLength(revBuf, 1);
}
public class ReliableUDP {
public int SendFixedLength(byte[] sendBuf,int nSendLen){
Log.i("UDP Demo", "发送数据(1):");
// check
int res = 1;
if (sendBuf.length!=nSendLen) {
return -2;
}
// create socket
DatagramSocket socket = null;
try {
socket = new DatagramSocket(null); // 指定Null很重要,否则Java会自动随机选个可用端口来绑定
socket.setReuseAddress(true); // DatagramSocket的setReuseAddress(true)方法执行后,可以允许多个DatagramSocket
// 绑定到相同的IP地址和端口,那么发送到此IP地址和端口的数据能够被复制到多个DatagramSocket
socket.setSoTimeout(10000);
socket.bind(new InetSocketAddress(this.LocalPort));
} catch (SocketException e) {
Log.i("UDP Demo", "SendFixedLength:socket create failed1:"+e.getMessage());
return -3;
}
Log.i("UDP Demo", "发送数据(2):");
// 定义一个用于发送的DatagramPacket对象
DatagramPacket outPacket = null;
try {
outPacket = new DatagramPacket(sendBuf , nSendLen , InetAddress.getByName(this.IPaddr) , this.TargetPort);
socket.send(outPacket);
Log.i("UDP Demo", "SendData:UDP发送数据:"+StringHexbyteTransform.bytesToHexString(sendBuf));
} catch (IOException e2) {
Log.i("UDP Demo", "SendData:io failed:"+e2.toString()+":"+e2.getMessage());
res = -52;
}
socket.close();
return res;
}
public int ReadFixedLength(byte[] revBuf,int nRecvLen, int timeout)
{
Log.i("UDP Demo", "Read数据(1):");
// check
int res = 1;
int len = nRecvLen;
if (-1 == nRecvLen) {
len = revBuf.length;
}
// create socket
DatagramSocket socket = null;
try {
socket = new DatagramSocket(null); // 指定Null很重要,否则Java会自动随机选个可用端口来绑定
socket.setReuseAddress(true); // DatagramSocket的setReuseAddress(true)方法执行后,可以允许多个DatagramSocket
// 绑定到相同的IP地址和端口,那么发送到此IP地址和端口的数据能够被复制到多个DatagramSocket
socket.setSoTimeout(timeout);
socket.bind(new InetSocketAddress(this.LocalPort));
} catch (SocketException e) {
Log.i("UDP Demo", "SendFixedLength:socket create failed1:"+e.getMessage());
return -3;
}
Log.i("UDP Demo", "Read数据(2):");
// 定义一个用于发送的DatagramPacket对象
DatagramPacket inPacket = null;
try {
inPacket = new DatagramPacket(revBuf , len);
socket.receive(inPacket);
ExpandRevBuffer(revBuf);
Log.i("UDP Demo", "receive:"+StringHexbyteTransform.bytesToHexString(revBuf));
} catch (IOException e2) {
Log.i("UDP Demo", "SendData:io failed:"+e2.toString()+":"+e2.getMessage());
res = -52;
}
socket.close();
return res;
}
DatagramSocket总是发送UDP数据后无法接收数据的更多相关文章
- Android上UDP组播无法接收数据的问题
最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...
- sql server中新增一条数据后返回该数据的ID
开发中遇到的问题:在新增一条数据后往往不需要返回该数据的ID,但是有的时候可能需要返回该数据的ID以便后面的编程使用. 在这里介绍两种方法: 其一:使用存储过程: create procedure a ...
- JQuery Ajax 发送请求成功后却接收不到任何响应数据问题
问题描述 使用 JQuery Ajax 向后端服务器发送请求,服务器也收到请求返回了响应数据,但是 Ajax 却收不到任何响应数据. 举例如下: $.ajax({ type: "post&q ...
- QTcpSocket的连续发送数据和连续接收数据
关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为 ...
- sql清空表数据后重新添加数据存储过程
ALTER PROCEDURE [dbo].[sp_add_Jurisdiction] @CTableName varchar(20), --当前要删除.新增的表 @filedkeyValue var ...
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源 UDP协议接 ...
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题
STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...
- android蓝牙(二)——接收数据
在蓝牙开发中,我们有这种一个需求:我们的androidclient要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,androidclient就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持an ...
随机推荐
- VB断点调试
最近都在敲机房收费系统,这个系统是我们第一次自己在没有源代码的情况下进行的系统. 写程序的时候逻辑非常重要,可是我们还要清楚非常多时候你以为的并非你以为的! 就像在敲机房的时候,我们明明理清了逻辑.并 ...
- GMGC记实(上篇)
24日和25日參加了2014年GMGC大会,整体感觉今年的大会比前2届大会办的更符合听众的需求.由于今年的大会开设了开发人员训练营的分会场.在成都这样一个CP占主流的IT圈中非常有意义.另一点就是在会 ...
- MySql 删除相同前缀的表名
SELECT CONCAT('drop table ', table_name, ';') FROM information_schema.tables WHERE table_name LIKE ' ...
- mongo: 索引
索引创建 在学习索引之前,我们先看一下,如果没有添加索引时,我们用explain()函数,查看查询计划是什么样的. 发现使用的是BasicCursor,那么就代表我们没有索引,当我们查某一个数据的时候 ...
- 方法return外部链接
return new ModelAndView(new RedirectView(url));
- Python学习笔记(一)三步走安装pip
pip是用来方便地管理Python的第三方包的,由于此前玩Python仅仅是浅尝辄止,用的是python(x,y),但是这里并不代表你想用什么包都能从里面找到的,所以我把python(x,y)卸了,然 ...
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- oracle中位图索引和B-tree索引的区别
1.适用系统的不同:位图索引适合OLAP系统,而B-tree索引适合OLTP系统. 2.占用存储空间不同:位图索引只需要很小的存储空间,而B-tree索引需要占用很大的存储空间. 3.创建需要的时间不 ...
- oracle字符乱码的解决方法
原因分析: 客户端字符集就是为了让数据库知道我们传递过去的字符是属于哪种字符集,以便于Oracle在存储字符时进行相应的编码映射(查看客户端字符集通过查找注册表中的NLS_LANG键).在客户端查询数 ...
- 利用SQL server 的复制功能分散用户访问服务器的负载
先来了解一下一个基本的关于复制的概念. 什么是复制? 复制就是把数据的多个拷贝(复制品)分发到公司中的各个服务器中,通过复制为多台服务器提供相同的数据.这样用户就可以在不同服务器中访问同样的信息. 对 ...