java - Android 编程 TCP-Server 连接
问题描述
我正在尝试开发一个项目,我想在其中获取字符串输入,将其作为参数传递到我的 MainActivity 文件中应用程序的函数中。
我已经用 Java 编写了 TCP 服务器初始化,计划是在我的桌面上启动服务器,然后从我的 Android 应用程序本地获取上述字符串输入的命令。
但问题是,即使服务器似乎启动了,我的模拟器上的应用程序也会启动,只要有一些输入要发送,应用程序就会崩溃。
服务器代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
try {
serverSocket = new ServerSocket(8888);
System.out.println("Listening :8888");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
socket = serverSocket.accept();
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
System.out.println("ip: " + socket.getInetAddress());
System.out.println("message: " + dataInputStream.readUTF());
dataOutputStream.writeUTF("Hello!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if( socket!= null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if( dataInputStream!= null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if( dataOutputStream!= null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
这是来自Android的功能。
public void sendData(String text) {
// TODO Auto-generated method stub
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket("/*IPv4 Address*/", 8888);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
//dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(text);
//textIn.setText(dataInputStream.readUTF());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if (socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
我认为问题存在于函数中,而不是其余的 android 代码,因为没有它一切都运行正常
这是我得到的例外
> E/AndroidRuntime: FATAL EXCEPTION: main
> Process: com.github.chagall.notificationlistenerexample, PID: 8957
> java.lang.RuntimeException: Error receiving broadcast Intent { act=com.github.chagall.notificationlistenerexample flg=0x10 (has
> extras) } in
> com.github.chagall.notificationlistenerexample.MainActivity$ImageChangeBroadcastReceiver@ef6eb1d
> at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52166(LoadedApk.java:1327)
> at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown
> Source:4)
> at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0)
> at android.os.Handler.handleCallback(Handler.java:789)
> at android.os.Handler.dispatchMessage(Handler.java:98)
> at android.os.Looper.loop(Looper.java:164)
> at android.app.ActivityThread.main(ActivityThread.java:6938)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
> Caused by: android.os.NetworkOnMainThreadException
> at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
> at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:355)
> at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
> at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
> at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
> at java.net.Socket.connect(Socket.java:616)
> at java.net.Socket.connect(Socket.java:565)
> at java.net.Socket.<init>(Socket.java:445)
> at java.net.Socket.<init>(Socket.java:217)
> at com.github.chagall.notificationlistenerexample.MainActivity.sendData(MainActivity.java:217)
> at com.github.chagall.notificationlistenerexample.MainActivity.changeInterceptedNotificationImage(MainActivity.java:118)
> at com.github.chagall.notificationlistenerexample.MainActivity.access$000(MainActivity.java:48)
> at com.github.chagall.notificationlistenerexample.MainActivity$ImageChangeBroadcastReceiver.onReceive(MainActivity.java:178)
> at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52166(LoadedApk.java:1317)
> at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown
> Source:4)
> at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown
> Source:0)
> at android.os.Handler.handleCallback(Handler.java:789)
> at android.os.Handler.dispatchMessage(Handler.java:98)
> at android.os.Looper.loop(Looper.java:164)
> at android.app.ActivityThread.main(ActivityThread.java:6938)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
任何建议表示赞赏。
解决方案
推荐阅读
- string - 查找构成单词的所有单词组合
- docker - 将 docker 搬回家后,容器中的权限被拒绝
- css - CSS 属性不能通过类应用于 img 项目
- angular - 如何从服务中调用组件(模态弹出窗口)?
- typescript - 在本地存储中存储对象时出错
- php - eBay API 总是在生产中返回 invalid_client 但沙盒工作正常
- vaadin - 为什么自定义实现的 VaadinServiceInitListener 不在 vaadin 13.0.2 中监听?
- symfony - Symfony Locale 基于子域修改
- cassandra - Cassandra 更改表以添加新列将 null 添加为文本
- performance - 如何测量 dynamodb 的性能?