- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试建立 UDP 发送/接收应用程序。我发送一条消息,服务器回复,然后服务器可能随时间发送更多信息。我创建了一个线程来发送消息,另一个异步线程在后台不断检查新消息。但是,我没有正确收到消息。如果我有一个恒定的接收数据包馈送,它可以正常工作,但是当接收是随机的时它就不起作用。
例如:端口 1:不断向我的客户端发送数据,所以我每秒都会收到新的数据包。结果很好,我的应用程序显示了每个新数据包。我的“正在接收更新”甚至会像“正在接收”一样滴答作响。 “正在接收……” “正在接收……”
端口 2:我随机接收数据包。只有当我一直点击我的发送按钮时它才会显示它们。我的接收进度点仅在我按下发送按钮时重复。有时数据包会闪烁并消失。
我正在尝试让端口 2 正常工作。我尝试在发布进度后让我的 inbackground() 函数 hibernate 2 秒,但这没有帮助。我真的很困惑如何制作它以便我可以不断接收 UDP 数据包。这是我的代码。
编辑:现在端口 2 显示正确,消息不只是闪烁和消失。然而,我的接收...进度点更新真的很慢。我的问题是,在我的“doInBackground”函数中,我有一个无限的 while 循环,这个循环不是一直执行得非常快吗?因此,即使没有新消息,我仍然会在循环结束时发布,以便我的“正在接收..”进度点应该向右移动?
再次编辑:我实际上没有对源代码进行任何更改,只是一些布局内容,现在端口 2 不再工作。它不显示任何新接收或接收更新栏。
如果我通过持续的馈送进入端口 1,那么一切都会完美更新......
我试着查看其他问题,但无法理解该怎么做。感谢您的帮助!
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.provider.Settings.Global;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
Button button;
TextView txt1, txtH, txtE, txtER, txtUpdate;
String msg;
CharSequence oldMsg="a";
Integer updateCount=0;
Activity mActivity;
DatagramSocket socket;
boolean msgSent = false;
boolean errorSend = false;
boolean errorReceive = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt1 = (TextView) findViewById(R.id.textView2);
txtH = (TextView) findViewById(R.id.textView1);
txtE = (TextView) findViewById(R.id.textView6);
txtER = (TextView) findViewById(R.id.textView8);
txtUpdate = (TextView) findViewById(R.id.textView9);
//I start my async class here
new receiveUDP().execute();
button = (Button) findViewById(R.id.button1);
//When I click this, I send a message
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread sendThread = new Thread(){
public void run(){
try{
byte[] data ="Some MSG".getBytes();
InetAddress address = InetAddress.getByName("Some address");
DatagramPacket pack = null;
pack = new DatagramPacket(data,data.length, address, somePort);
socket.send(pack);
msgSent=true;
} catch (Exception e){
boolean errorSend = true;
}
}
};
sendThread.start();
try {
sendThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (msgSent){
txtH.setText("SENT!");
}
}
});
if (errorSend){
txtE.setText("Error Sending Socket");
}
}
public class receiveUDP extends AsyncTask <Void, CharSequence, Void>{
@Override
protected Void doInBackground(Void... params) {
//Constantly check to see if we received a new packet.
while (true){
try{ //if no socket, create a new socket
if (socket == null){
socket = new DatagramSocket(somePort, InetAddress.getByName("address"));
socket.setBroadcast(true);
}
byte[] buf = new byte[2500];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
//Get the data of the packet to be a string
msg = new String(packet.getData(),0,packet.getLength());
} catch (Exception e){
errorReceive=true;
e.printStackTrace();
}
publishProgress(msg);
}
}
protected void onProgressUpdate(CharSequence...progress) {
updateCount++;
// If no errors, and if new message is different than old message
// Then change the text field to show new message.
if(!(errorReceive)){
if(!(oldMsg.equals(progress[0]))){
txt1.setText(progress[0]);
oldMsg = progress[0];
}
}else
{
txtER.setText("Error Receiving");
}
//Progress dots...
if(updateCount==1){
txtUpdate.setText("Receiving.");
}
else if(updateCount==2){
txtUpdate.setText("Receiving..");
}
else {
txtUpdate.setText("Receiving...");
updateCount=0;
}
}
}
}
最佳答案
我这样做成功了(假设我收到的消息是一个字符串,使用下面的符号来划分参数|
因此你看到我在收到消息后使用拆分命令
p.s.: 不要用模拟器,在真机上试试
p.p.s.:当您创建 Activity 时使用 startReceiveUdp 开始监听,然后在您的 gui 线程中使用 stopReceiveUdp 停止监听,就在关闭您的 Activity 之前(我在 onDismiss 子中使用它,覆盖它)。
ReceiveSocket receiveSocket;
void startReceiveUdp()
{
if (receiveSocket==null) {
receiveSocket=new ReceiveSocket();
receiveSocket.execute("");
}
}
void stopReceiveUdp()
{
if (receiveSocket!=null) receiveSocket.cancel(true);
}
private class ReceiveSocket extends AsyncTask<String, String, String> {
DatagramSocket clientsocket;
@Override
protected String doInBackground(String... params) {
while (true) {
try {
publishProgress(receiveMessage());
if(isCancelled()) break;
} catch (Exception e) {
//
}
}
return "";
}
String[] receiveMessage(){
String[] rec_arr = null;
try {
int port = 8081;
if (clientsocket == null) clientsocket=new DatagramSocket(port);
byte[] receivedata = new byte[30];
DatagramPacket recv_packet = new DatagramPacket(receivedata, receivedata.length);
//Log.d("UDP", "S: Receiving...");
clientsocket.receive(recv_packet);
String rec_str = new String(recv_packet.getData()); //stringa con mesasggio ricevuto
rec_str= rec_str.replace(Character.toString ((char) 0), "");
//Log.d(" Received String ",rec_str);
//InetAddress ipaddress = recv_packet.getAddress();
//int port = recv_packet.getPort();
//Log.d("IPAddress : ",ipaddress.toString());
//Log.d(" Port : ",Integer.toString(port));
rec_arr=rec_str.split("\\|");
return rec_arr;
} catch (Exception e) {
Log.e("UDP", "S: Error", e);
}
return rec_arr;
}
@Override
protected void onPostExecute(String result) {
//
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(String... rec_arr) {
//ricevi la stringa,
//splittala
//esegui l'azione richiesta sulla GUI
if (rec_arr.length>1){
String clientType=rec_arr[0];
String command=rec_arr[1];
if(command.contentEquals("go")){
//press button go
startAction(null);
}
}
}
}
关于java - 如何在 android 的异步函数中连续接收 UDP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21439745/
如何检查一个元素是否立即隐藏。即如何通知元素的可见性。 在我的例子中,该元素是通过 slideUp 函数隐藏的。我应该立即收到有关该元素的可见性的通知。 我想到了使用bind()方法。但它没有类似 o
if (srcbloc == NULL) { fprintf(stderr, "warning!: memrip source is null!\n"); exit(1); } if
当我在数据库的旧 View 中清理一些问题时,我遇到了这个“奇怪”的连接条件: from tblEmails [e] join tblPersonEmails [pe]
如何水平对齐多张图像,一张一张地?它们不必适合宽度屏幕:相反,我希望它们超过后者的宽度,如果这有任何意义的话。 我已经检查了很多类似问题的答案,但找不到任何可以解决我的问题的答案。 HTML:
我知道 Cassandra 中的列有 TTL。但是也可以在一行上设置 TTL 吗?在每列上设置 TTL 并不能解决我的问题,如下面的用例所示: 在某些时候,一个进程想要删除一个带有 TTL 的完整行(
我有一个 NSTextField 和 Label,其值绑定(bind)到 View Controller 中的相同 NSString 这里的问题是标签只有在我按 Tab 时才会更新。 如何使其连续,以
例如。 1."abc"; ===>abc 2."ab c"; ===>ab_c 3."ab c"; ===>ab_c 4."ab c" ===>ab_c 对于多个连续空格也是如此。 我怎样
大家好,我想获取前一天或最后一天的信息,只有当我按下按钮时,它才会显示最后一天(星期六)的所有信息,如果我再次单击按钮,它将显示最后一天的信息(星期五)如果我再次点击它(星期四)谢谢你们帮助我 编辑:
我需要从实时音频流中提取ICY元数据,并正在使用mplayer进行此操作,因为它在播放音频流时会输出元数据。我欢迎其他方式执行此操作,目标是将更新的元数据(歌曲信息)保存到文本文件中,只要歌曲(或数据
语音识别有没有解决方案 只有几个字(2 个就够了,10 个就不错了。100 个就很棒了。不需要更多) 也在移动浏览器上运行(是否可以为此使用 flash(而不是 java)?) 可以安装在您自己的服务
我有一个单词列表, list1 = ['hello', 'how', 'are', 'you?', 'i', 'am', 'fine', 'thanks.', 'great!'] 我想加入, list
我正在开发一个程序,但我不断收到“对‘dosell’的 undefined reference ”,我不太明白发生了什么。这是函数的声明: void dosell(int *cash, int *nu
我无法提出执行我要做的事情所需的查询。 我有三个这样的表: client_files ----------------------- client_id file_id ---------
我一直在寻找一个插件/脚本,当到达底部时,它会从头开始继续滚动网站,就像一个连续的循环。 示例:http://unfold.no/和 http://www.aquiesdonde.com.ar/ 我尝
这个问题在这里已经有了答案: How to prevent scanf causing a buffer overflow in C? (6 个答案) 关闭 6 年前。 我一直在使用一个非常简单的程
给定一个整数数组,找到具有相同数量的 x 和 y 的连续子序列的总数。例如 x=1 和 y=2 的数组 [1,2,1] ans = 2 表示它的两个子数组 [1,2] 和 [2,1]。检查每个连续的子
所以,我有一个所有正自然数的数组。我得到了一个阈值。我必须找出总和小于给定阈值的数字(连续)的最大计数。 For example, IP: arr = {3,1,2,1} Threshold = 5
我制作了像内置相机一样的相机应用。 我想实现像内置相机一样的连续对焦功能。(此功能我不触摸屏幕,但相机会尝试自行对焦。) 因此,将其设置为 surfaceCreated : Camera.Pa
我有这样的数据: f x A 1.1 A 2.2 A 3.3 B 3.5 B 3.7 B 3.9 B 4.1 B 4.5 A 5.1 A 5.2 C 5.4 C 5.5 C 6.1 B 6.2 B
假设我有一个包含一组数据点的表,每个数据点由一个时间戳和一个值组成。如果至少有 N 个连续记录(按时间戳排序)高于给定值 X,我将如何编写返回 true (1) 的查询,否则返回 false (0)?
我是一名优秀的程序员,十分优秀!