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

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

移植后,无法相互通信?网络权限没有问题,IP也对的,手机和电脑是同一网段。我核对了老师的代码,和我的是一样的。debug无法进入子线程,看不到问题所在。

这是MainActivity():

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();
       }
   }

}

以下是UdpClientBiz:

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

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

1回答
好帮手慕雪 2020-08-13 14:27:11

从以下几个方面进行排查:1)你得先启动服务端再启动客户端。 2)没移植前是可以运行的吗?然后移植后就运行不了了?那还是网络问题,不要用手机的4G,5G之类的网络,把手机自身的网络关闭,把手机连接电脑,这样能保证用的是同一个网段才能访问。像慕课网,百度等,你的手机是可以访问的,怎么就访问不了自己电脑呢?那是因为慕课网,百度都是在公网上,你得保证是同一个大的局域网才能访问,而你本机内容并不是公网,所以你也得保证服务器与客户端处于同一个局域网内。3)debug不进去,应该是两者根本就没有建立起连接吧。你也可以打log试一下。祝:学习愉快

  • 提问者 慕运维0750787 #1
    我使用了Log在子线程里,证明无法互通。因为Log没有打出来。
    2020-08-13 19:39:28
  • 好帮手慕雪 回复 提问者 慕运维0750787 #2
    那就证明这块的代码根本没有执行,是网络的问题。你看一下第2条的内容,进行一下排查
    2020-08-14 09:36:29
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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