移植后,无法相互通信?网络权限没有问题,IP也对的,手机和电脑是同一网段
debug能正常在MainActivity运行(第一张图,此时我没有运行,之前debug运行过),但到子线程(第二张图,图片没有运行状态,之前运行过)时就进不去了。
我的代码:
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
- 参与学习 人
- 提交作业 116 份
- 解答问题 1012 个
本阶段是提升项目经验的必备,除Android开发的高级控件,还有Android官方大力推荐的开发语言Kotlin,未来Android发展的方向,最后使用Kotlin来开发热门电商项目。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星