2017-05-02 25 views
-3

我一直在试图学习一些android开发,我一直在尝试进入某种联网,以便我可以创建一个应用程序基于Web。无论如何,我开始试图制作一个使用手机或笔记本电脑作为客户端的聊天程序,并在我的笔记本电脑上运行服务器。我的问题是,只要我尝试发送消息到服务器,我的应用程序就会关闭。我在考虑可能性,但我不确定实际发生了什么。聊天程序自动关闭

反正这里的机器人代码:

package com.example.android.chatprogram; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 


public class MainActivity extends AppCompatActivity { 

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

    public void sendMessage() 
    { 
     try { 

      TextView inp = (TextView) findViewById(R.id.msg_box); 
      TextView receive = (TextView) findViewById(R.id.chat_window); 
      Socket clientSocket = new Socket("localhost", 9002); //99.228.211.122 
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

      String msg = inp.getText().toString(); 
      outToServer.writeBytes(msg + '\n'); 
      receive.append(inFromServer.readLine()); 
      clientSocket.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 


} 

这里的服务器代码(在我的笔记本电脑上运行):

import java.io.*; 
import java.net.*; 

public class server { 
    public static void main(String args[]) throws Exception { 
     String clientSentence; 
     String capitalizedSentence; 
     ServerSocket welcomeSocket = new ServerSocket(9001); 

     while(true) { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      System.out.println(clientSentence); 
      capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
      outToClient.writeBytes(capitalizedSentence); 
     } 
    } 

预先感谢您!

编辑:我终于找到了堆栈跟踪!

05-0121:48:04.74828076-28076/com.example.android.chatprogramE/AndroidRuntime: 
FATALEXCEPTION:main 
Process:com.example.android.chatprogram,PID:28076 
java.lang.IllegalStateException:Couldnotexecutemethodforandroid:onClick 
atandroid.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
atandroid.view.View.performClick(View.java:5623) 
atandroid.view.View$PerformClick.run(View.java:22433) 
atandroid.os.Handler.handleCallback(Handler.java:751) 
atandroid.os.Handler.dispatchMessage(Handler.java:95) 
atandroid.os.Looper.loop(Looper.java:154) 
atandroid.app.ActivityThread.main(ActivityThread.java:6247) 
atjava.lang.reflect.Method.invoke(NativeMethod) 
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 
Causedby:java.lang.reflect.InvocationTargetException 
atjava.lang.reflect.Method.invoke(NativeMethod) 
atandroid.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
atandroid.view.View.performClick(View.java:5623)  
atandroid.view.View$PerformClick.run(View.java:22433)  
atandroid.os.Handler.handleCallback(Handler.java:751)  
atandroid.os.Handler.dispatchMessage(Handler.java:95)  
atandroid.os.Looper.loop(Looper.java:154)  
atandroid.app.ActivityThread.main(ActivityThread.java:6247)  
atjava.lang.reflect.Method.invoke(NativeMethod)  
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)  
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)  
Causedby:android.os.NetworkOnMainThreadException 
atandroid.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303) 
atjava.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:333) 
atjava.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196) 
atjava.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178) 
atjava.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) 
atjava.net.Socket.connect(Socket.java:586) 
atjava.net.Socket.connect(Socket.java:535) 
atjava.net.Socket.<init>(Socket.java:427) 
atjava.net.Socket.<init>(Socket.java:210) 
atcom.example.android.chatprogram.MainActivity.sendMessage(MainActivity.java:29) 
atjava.lang.reflect.Method.invoke(NativeMethod)  
atandroid.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
atandroid.view.View.performClick(View.java:5623)  
atandroid.view.View$PerformClick.run(View.java:22433)  
atandroid.os.Handler.handleCallback(Handler.java:751)  
atandroid.os.Handler.dispatchMessage(Handler.java:95)  
atandroid.os.Looper.loop(Looper.java:154)  
atandroid.app.ActivityThread.main(ActivityThread.java:6247)  
atjava.lang.reflect.Method.invoke(NativeMethod)  
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)  
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)  
+1

'我的应用程序刚刚关闭'你是什么意思?如果它崩溃,然后添加您的错误日志! –

+0

我想弄清楚如何得到错误日志。每当我使用像LogCat这样的应用程序时,我只会得到一个永无止境的文字墙。 @AtefHares – Cameron

+0

这在这里解释太多了,我担心(我猜这对你更好),你必须搜索谷歌如何处理logcat。我几乎可以肯定你会找到很多教程和视频。 –

回答

0

首先,当您发生崩溃时,请始终发布堆栈跟踪。它告诉你什么是失败,为什么,在哪里。

在这种情况下,它将成为NetworkOnMainThreadException。所有的网络调用都必须在另一个线程上完成。