gpt4 book ai didi

android - Android Socket Client未发送并自行关闭

转载 作者:行者123 更新时间:2023-11-30 03:51:34 25 4
gpt4 key购买 nike

我对android和java编程很陌生,需要您的帮助。我想在PC(Windows 7)上创建一个Android客户端和一个服务器。我用腻子(一个模仿客户端的程序(没有编程错误^^))检查了我的服务器是否编程正确。因此,我认识到我的服务器已正确编程。

在这里,您可以看到我运作良好的服务器:

  public class MyServer {
public static void main (String[] args) throws IOException {

ServerSocket serverSocket = null;

try {
serverSocket = new ServerSocket(4449);
System.out.println("Listening on port: 4449");
} catch (IOException e){
System.err.println("Could not listen on port 4449.");
System.exit(1);
}

Socket clientSocket = null;

try {
clientSocket = serverSocket.accept();
System.out.println("Got connection.");
} catch (IOException e) {
System.err.println("Accept failed: 4449.");
System.exit(1);
}

BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

out = new PrintWriter(clientSocket.getOutputStream(), true);
} catch (IOException e) {
System.err.println("Read failed");
e.printStackTrace();
}


try {

System.out.println("message: " + in.readLine());
out.println("hab was bekommen!");
} catch (IOException e) {
System.err.println("Can't get a message from Client.");
e.printStackTrace();

}
}
}

我也尝试为此服务器创建一个Android客户端,但是我没有对其进行管理。

这是我的主要 Activity :
public class AndroidClient extends Activity {

EditText textOut;
TextView textIn;
TextView problems;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_android_client);

textOut = (EditText)findViewById(R.id.textout);
Button buttonSend = (Button)findViewById(R.id.send);
textIn = (TextView)findViewById(R.id.textin);
problems = (TextView)findViewById(R.id.problems);
buttonSend.setOnClickListener(buttonSendOnClickListener);
}

Button.OnClickListener buttonSendOnClickListener
= new Button.OnClickListener() {


@Override
public void onClick(View arg0) {
//TODO Auto-generated method stub
Socket client = null;


BufferedReader in = null;
PrintWriter out = null;

try {
client = new Socket("192.168.2.107", 4449);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (UnknownHostException e) {
problems.setText("Unknown host: 192.168.2.107");
} catch (IOException e) {
// System.out.println("No Input/Output.");
problems.setText("No Input/Output.");
}

try {
out.println("Hallo.");
textIn.setText(in.readLine());
} catch (IOException e) {
problems.setText("Can't send/ get message.");
}
}
};



@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_android_client, menu);
return true;
}
}

到目前为止,一切都很好。当我在android智能手机上启动我的应用程序时,该应用程序启动没有任何问题。然后,在我的EditText字段“textOut”中键入内容,然后按下“Send”按钮。然后我的屏幕变黑,应用程序自行关闭。我还将该权限粘贴在AndroidManifest.xml中,以进入Internet并使用访问Wifi。

我希望有人可以帮助我,因为我已经解决了2天,但尚未找到任何解决方案。我主要使用了这一方面(http://android-er.blogspot.de/2011/01/simple-communication-using.html),当然也使用了其他方面,但是我得到了最多的信息。此外,我的源代码中没有显示出任何错误。

亲切的问候,

卢卡斯5060

编辑:这是我的LogCat:

12-28 20:21:55.929:I/dalvikvm(698):threadid = 3:对信号3使用react
12-28 20:21:56.039:I/dalvikvm(698):将堆栈跟踪写入'/data/anr/traces.txt'
12-28 20:21:56.259:I/dalvikvm(698):threadid = 3:对信号3使用react
12-28 20:21:56.299:I/dalvikvm(698):将堆栈跟踪写入'/data/anr/traces.txt'
12-28 20:21:56.741:D/gralloc_goldfish(698):未检测到GPU仿真的仿真器。
12-28 20:21:56.771:I/dalvikvm(698):threadid = 3:对信号3使用react
12-28 20:21:56.789:I/dalvikvm(698):将堆栈跟踪写入'/data/anr/traces.txt'
12-28 20:23:58.430:D/AndroidRuntime(698):关闭VM
12-28 20:23:58.430:W/dalvikvm(698):threadid = 1:线程以未捕获的异常退出(group = 0x409c01f8)
12-28 20:23:58.470:E/AndroidRuntime(698):致命异常:主要
12-28 20:23:58.470:E/AndroidRuntime(698):android.os.NetworkOnMainThreadException
12-28 20:23:58.470:E/AndroidRuntime(698):位于android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
12-28 20:23:58.470:E/AndroidRuntime(698):位于libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
12-28 20:23:58.470:E/AndroidRuntime(698):位于libcore.io.IoBridge.connectErrno(IoBridge.java:127)
12-28 20:23:58.470:E/AndroidRuntime(698):位于libcore.io.IoBridge.connect(IoBridge.java:112)
12-28 20:23:58.470:E/AndroidRuntime(698):位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
12-28 20:23:58.470:E/AndroidRuntime(698):位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
12-28 20:23:58.470:E/AndroidRuntime(698):位于java.net.Socket.startupSocket(Socket.java:566)
12-28 20:23:58.470:E/AndroidRuntime(698):位于java.net.Socket.tryAllAddresses(Socket.java:127)
12-28 20:23:58.470:E/AndroidRuntime(698):位于java.net.Socket。(Socket.java:177)
12-28 20:23:58.470:E/AndroidRuntime(698):位于java.net.Socket。(Socket.java:149)
12-28 20:23:58.470:E/AndroidRuntime(698):在net.ibasic.AndroidClient $ 1.onClick(AndroidClient.java:50)
12-28 20:23:58.470:E/AndroidRuntime(698):位于android.view.View.performClick(View.java:3511)
12-28 20:23:58.470:E/AndroidRuntime(698):在android.view.View $ PerformClick.run(View.java:14105)
12-28 20:23:58.470:E/AndroidRuntime(698):位于android.os.Handler.handleCallback(Handler.java:605)
12-28 20:23:58.470:E/AndroidRuntime(698):位于android.os.Handler.dispatchMessage(Handler.java:92)
12-28 20:23:58.470:E/AndroidRuntime(698):位于android.os.Looper.loop(Looper.java:137)
12-28 20:23:58.470:E/AndroidRuntime(698):位于android.app.ActivityThread.main(ActivityThread.java:4424)
12-28 20:23:58.470:E/AndroidRuntime(698):at java.lang.reflect.Method.invokeNative( native 方法)
12-28 20:23:58.470:E/AndroidRuntime(698):at java.lang.reflect.Method.invoke(Method.java:511)
12-28 20:23:58.470:E/AndroidRuntime(698):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
12-28 20:23:58.470:E/AndroidRuntime(698):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-28 20:23:58.470:E/AndroidRuntime(698):在dalvik.system.NativeStart.main( native 方法)
12-28 20:23:59.070:I/dalvikvm(698):线程ID = 3:对信号3作出 react
12-28 20:23:59.100:I/dalvikvm(698):将堆栈跟踪写入'/data/anr/traces.txt'
12-28 20:24:02.420:I/Process(698):发送信号PID:698 SIG:9

最佳答案

好的,我的猜测是问题在于您在主ui线程中执行此操作,建议不要这样做。相反,您应该做的是 checkout AsyncTask,这是进行此类操作(从文件或Web以及其他内容中读取)的首选方式。

这比听起来像您需要做的事情要简单得多(请注意,这只是为了让您感觉一下它的外观):

private class CreateSocketTask extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... urls) {
//Do the socket stuff here...
}

@Override
protected void onPostExecute(String result) {
//This is called when doInBackground has finished
//From here you'd call a method in the main ui class.
}
}

继承人 android doc

网上有很多教程,因此您可以立即启动并运行。

关于android - Android Socket Client未发送并自行关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com