移植后,无法相互通信?网络权限没有问题,IP也对的,手机和电脑是同一网段

移植后,无法相互通信?网络权限没有问题,IP也对的,手机和电脑是同一网段

debug能正常在MainActivity运行(第一张图,此时我没有运行,之前debug运行过),但到子线程(第二张图,图片没有运行状态,之前运行过)时就进不去了。

http://img1.sycdn.imooc.com//climg/5f35227709c18a5219201080.jpghttp://img1.sycdn.imooc.com//climg/5f352288096b6de119201080.jpg

我的代码:

package com.example.socketudp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.socketudp.biz.UdpClientBiz;

public class MainActivity extends AppCompatActivity {
   private EditText editText_msg;
   private Button btn_send;
   private TextView tv_content;
   private UdpClientBiz udpClientBiz = new UdpClientBiz();

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       initViews();
       PermissionUtils.verifySMSREADPermission(this);
       btn_send.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               String msg = editText_msg.getText().toString();
//                输入数据为空,返回
               if (TextUtils.isEmpty(msg)) {
                   Toast.makeText(MainActivity.this, "发送的数据不能为空", Toast.LENGTH_LONG).show();
                   return;
               }
//                把客户端当前数据(信息)显示在textview控件上
               appendMsgToContent("Client:"+msg);
//                向服务端发送数据,并通过监听器接收服务端数据
               udpClientBiz.sendMsg(msg, new UdpClientBiz.OnMsgReturnedListener() {
                   @Override
                   public void onMsgReturned(String msg) {
//                        显示服务端返回的数据到textview控件
                       appendMsgToContent("Server:"+msg);
                   }

                   @Override
                   public void onError(Exception ex) {
                       ex.printStackTrace();
                   }
               });
           }
       });
   }
//追加更新UI的TextView数据
   private void appendMsgToContent(final String msg) {
               tv_content.append(msg + "\n");

   }

   private void initViews() {
       editText_msg = findViewById(R.id.et_msg);
       btn_send = findViewById(R.id.btn_send);
       tv_content = findViewById(R.id.tv_content);
   }

   @Override
   protected void onDestroy() {
       super.onDestroy();
       udpClientBiz.onDestroy();
   }
}

package com.example.socketudp.biz;

import android.os.Handler;
import android.os.Looper;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//业务层,处理数据传输,实现客户端与服务端数据交互
public class UdpClientBiz {
   private String mServerIp = "192.168.1.7";
   private InetAddress mServerAddress;
   private int mServerPort = 7777;
   private DatagramSocket datagramSocket;
   //    定义一个Handler处理主线程业务
   private Handler mUIHandler = new Handler(Looper.getMainLooper());

   //构造函数
   public UdpClientBiz() {
       try {
           mServerAddress = InetAddress.getByName(mServerIp);//通过服务器IP获得地址
           datagramSocket = new DatagramSocket();//新建数据报套接字对象
//            System.in作为参数传递bai给Scanner的构造函数,使Scanner用键du盘作为输入,
//           然后用new在内存中实例化一个Scanner出来,使得其它变量能调用这块内存区。

       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   //    监听服务器是否发送数据
   public interface OnMsgReturnedListener {
       //        回调服务端数据
       void onMsgReturned(String msg);

       //异常错误回调
       void onError(Exception ex);
   }

   //    向服务器发送数据msg,并接收服务端数据
   public void sendMsg(final String msg, final OnMsgReturnedListener listener) {
//        开启子线程,完成网络数据传输
       new Thread() {
           public void run() {
               try {
                   /*(1)客户端输入数据并发送给服务器*/

                   byte[] clientMsgBytes = msg.getBytes();//输入数据转换成字节数组
//       新建客户端数据包,参数1:字节数组,参数2:字节数,参数3:服务器地址,参数4:服务端端口
                   DatagramPacket clientPacket = new DatagramPacket(clientMsgBytes, clientMsgBytes.length, mServerAddress, mServerPort);//客户端数据报文
                   datagramSocket.send(clientPacket);//通过数据报套接字发送客户端数据文
                   /*(2)客户端接收服务器数据,并打印*/
                   byte[] buf = new byte[1024];
                   DatagramPacket serverMsgPacket = new DatagramPacket(buf, buf.length);//新建服务端数据报文
                   datagramSocket.receive(serverMsgPacket);//数据报套接字接收服务端数据报文
//                提取服务端数据报文为字符串
                   final String serverMsg = new String(serverMsgPacket.getData(), 0, serverMsgPacket.getLength());
                   /* (3)   服务端报文数据回调出去给主线程*/
                   mUIHandler.post(new Runnable() {
                       @Override
                       public void run() {
                           listener.onMsgReturned(serverMsg);
                       }
                   });

               } catch (final Exception e) {
                   mUIHandler.post(new Runnable() {
                       @Override
                       public void run() {
                           listener.onError(e);//把错误回调出去,让客户端感知
                       }
                   });
               }
           }
       };
   }

   public void onDestroy() {
//        注销套接字报文
       if (datagramSocket != null) {
           datagramSocket.close();
       }
   }

}



(1)我是先启动服务端 再启动客户端 的(2)移植前可以运行(3)手机是没有sim卡的,所以没有4G(4)与电脑在同一网页,一个是192.168.1.7,手机是192.168.1.6 (5)网络权限已经获得,因为有log输出提示

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕雪 2020-08-14 10:38:41

1)测试一下手机能不能正常访问网络。记得把手机的wifi也关闭。 2)UdpClientBiz类里的sendMsg()new Thread() {}后缺少.start(),导致你的线程根本没有运行起来。祝:学习愉快

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师