首页 > 解决方案 > 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)

任何建议表示赞赏。

标签: javaandroidtcp

解决方案


推荐阅读