求助,为啥socket收不到ack信息

oyymiko 2016-05-09 05:37:28
求助:按下按钮后,会socket送出一个讯息给服务器,服务器收到之后,会回复一个ack!
用putty可以看到服务器是有回复的,但为啥客户端收不到,哪错了?求解~
奉上程序码:

按钮事件
public void onClick(View v) {
if (v == recmac)
{

String hgcmd;
hgcmd = "RsrS@H=1=FFFFFF=4=2=2=0=0D=0A=WIFI=1234";
/*send cmd*/
startService(
new Intent(this, NotificationService.class)
.setAction(NotificationService.ACTION_SENT)
.putExtra(NotificationService.EXTRA_PARAM_TARGET_ADDR, "192.168.168.254")
.putExtra(NotificationService.EXTRA_PARAM_TARGET_PORT, 12098)
.putExtra(NotificationService.EXTRA_PARAM_TARGET_DATA, hgcmd));
//recv ack;
handler.postDelayed(new Runnable() {
@Override
public void run() {
startService(new Intent(MainActivity.this, NotificationService.class)
.setAction(NotificationService.ACTION_RECV_MPRMAC));
}
},1000L);
}
}


NotificationService.class
private static ConcurrentLinkedQueue<Map<String, Object>> mQueueSend = new ConcurrentLinkedQueue<>();

private static Thread mThreadConn = null;
private static Thread mthreadRecvMpr = null;
private static Thread mthreadRecvData = null;

private static final Lock mMutexSocket = new ReentrantLock(true);
private static final Lock mMutexTxData = new ReentrantLock(true);
private static final Lock mMutexRxData = new ReentrantLock(true);

private static InetSocketAddress address = new InetSocketAddress(MPR_TARGET_ADDR_DEF, TARGET_PORT_DEF);

private static Socket socket = null;
private static BufferedWriter writer = null;
private static BufferedReader reader = null;


    public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(this.getClass().getSimpleName(), "socket:onStartCommand~~~");
if ( null != intent && null != intent.getAction() ) {
Map<String, Object> map = new HashMap<>();
if ( ACTION_SENT.equals(intent.getAction()) ) {
if ( true == intent.hasExtra(EXTRA_PARAM_TARGET_ADDR) &&
true == intent.hasExtra(EXTRA_PARAM_TARGET_PORT) &&
true == intent.hasExtra(EXTRA_PARAM_TARGET_DATA) ) {
mMutexSocket.lock();
address = new InetSocketAddress(
intent.getStringExtra(EXTRA_PARAM_TARGET_ADDR),
intent.getIntExtra(EXTRA_PARAM_TARGET_PORT, TARGET_PORT_DEF));
mMutexSocket.unlock();
mThreadConn = new Thread(mRunnableConnDev);
mThreadConn.start();
map.put(EXTRA_PARAM_TARGET_ADDR, intent.getStringExtra(EXTRA_PARAM_TARGET_ADDR));
map.put(EXTRA_PARAM_TARGET_PORT, intent.getIntExtra(EXTRA_PARAM_TARGET_PORT, TARGET_PORT_DEF));
map.put(EXTRA_PARAM_TARGET_DATA, intent.getStringExtra(EXTRA_PARAM_TARGET_DATA));

mMutexTxData.lock();
mQueueSend.add(map);
mMutexTxData.unlock();
}
}

if ( ACTION_RECV_MPRMAC.equals(intent.getAction()) ) {
mthreadRecvMpr = new Thread(mRunnableRecvMPRMAC);
mthreadRecvMpr.start();
}
}
return super.onStartCommand(intent, flags, startId);
}


public final Runnable mRunnableRecvMPRMAC = new Runnable() {
@Override
public void run() {
try{
mMutexRxData.lock();
socket = new Socket ("192.168.168.254", 12098);
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
System.out.println("reader");
if (reader.readLine() == null)
{
System.out.println("recv null");
}else
{
System.out.println(reader.readLine());
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
mMutexRxData.unlock();
}
}
};

private static final Runnable mRunnableConnDev = new Runnable() {
public void run() {
try {
mMutexSocket.lock();
socket = new Socket("192.168.168.254", 12098);
writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
Map<String, Object> map = null;
if (false == mQueueSend.isEmpty()) {
map = mQueueSend.peek();
try {
mMutexTxData.lock();
final byte[] bytes = map.get(EXTRA_PARAM_TARGET_DATA).toString().getBytes();
String cmd = new String(bytes, StandardCharsets.UTF_8);
writer.write(cmd + "\n");
writer.flush();
} catch (IOException e) {
} finally {
mMutexTxData.unlock();
}
mQueueSend.poll();
}
} catch (SocketException e) {
Log.d(this.getClass().getSimpleName(), "new Socket ---> NG!");
} catch (UnknownHostException e) {
Log.d(this.getClass().getSimpleName(), "new Socket ---> Exception!");
} catch (IOException e) {
Log.d(this.getClass().getSimpleName(), "new Socket ---> Exception!");
} finally {
mMutexSocket.unlock();
}
}
};



程序只会停在System.out.println("reader");
Putty 画面可看得服务器是有送出讯息,后面的讯息不会显示,不知为什么会这样,求解

...全文
628 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyymiko 2016-05-11
  • 打赏
  • 举报
回复
各位大大,由于负责伺服端socket的人员,目前休长假,所以无法立刻得知伺服端的socket发送的讯息是否有无加 \n 或\r\n ,请问有什么办法可以解决的吗? 因为目前手机的应用就是会一直卡着不动,不是当机,就是像是在等候数据一样…
蒲锦_up 2016-05-10
  • 打赏
  • 举报
回复
引用 5 楼 Rampage_SS 的回复:
我是根据函数名称叫readline。自己理解的,你看看有没有不阻塞的API,这样对方发什么也就无关紧要了。
reader.readLine() 是阻塞的吧 。取字节应该没问题。。。。。
淘豆豆么 2016-05-10
  • 打赏
  • 举报
回复
作为后台服务请选择主机屋,好用,用了好久了, 主机屋网址:www.zhujiwu.com
Rampage_SS 2016-05-10
  • 打赏
  • 举报
回复
我是根据函数名称叫readline。自己理解的,你看看有没有不阻塞的API,这样对方发什么也就无关紧要了。
oyymiko 2016-05-10
  • 打赏
  • 举报
回复
恩~谢谢你的回答。 因为我负责的是手机端socket的发送和收ack,服务器端的送ack是不同单位的人负责的,所以我不能确定是否是送ack时未加\n或\r\n,我只能先就我的部份做处理,就怕是自己的部份写错!
Rampage_SS 2016-05-10
  • 打赏
  • 举报
回复
那就是阻塞。看看阻塞的条件是不是要收到什么\r\n之类的结束符。才判断一包数据。你发的数据也带上这个就行了。
oyymiko 2016-05-10
  • 打赏
  • 举报
回复
那为何连System.out.println都印不出来呢? 主要是想收下这个ack之后,再存到SharedPreferences里面。求解
节操在此 2016-05-10
  • 打赏
  • 举报
回复

public final Runnable mRunnableRecvMPRMAC = new Runnable() {
        @Override
        public void run() {
            try{
                mMutexRxData.lock();
                socket = new Socket ("192.168.168.254", 12098);
                reader = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                System.out.println("reader");
                if (reader.readLine() == null)
                {
                    System.out.println("recv null");
                }else
                {
                    System.out.println(reader.readLine());
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                mMutexRxData.unlock();
            }
        }
    };
socket.setTimeout,最简单的办法设置超时吧,不过这样你的代码逻辑得改改
oyymiko 2016-05-10
  • 打赏
  • 举报
回复
引用 6 楼 yueqinglkong 的回复:
[quote=引用 5 楼 Rampage_SS 的回复:] 我是根据函数名称叫readline。自己理解的,你看看有没有不阻塞的API,这样对方发什么也就无关紧要了。
reader.readLine() 是阻塞的吧 。取字节应该没问题。。。。。[/quote] 请问如何取字节
Rampage_SS 2016-05-09
  • 打赏
  • 举报
回复
mRunnableRecvMPRMAC 这是实现里面调用的reader.readLine()这个函数估计不是阻塞。即你执行完这个程序线程就退出了。收不到数据没什么奇怪的。

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧