Android 服务器可以';t向客户端发送消息

Android 服务器可以';t向客户端发送消息,android,serversocket,Android,Serversocket,我想创建一个应用程序,服务器和客户端在其中相互通信。这里是代码 服务器端: public class MainActivity extends ActionBarActivity { private ServerSocket serverSocket; Handler updateConversationHandler; Thread serverThread = null; Socket clientSocket; private TextView text; EditText e

我想创建一个应用程序,服务器和客户端在其中相互通信。这里是代码

服务器端:

 public class MainActivity extends ActionBarActivity {

private ServerSocket serverSocket;
Handler updateConversationHandler;
Thread serverThread = null;
Socket clientSocket;
  private TextView text;
  EditText edit;
  Button b;
  public static final int SERVERPORT = 6000;
  String TimeStamp;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("inside onCreate");

        text = (TextView) findViewById(R.id.textView1);

        updateConversationHandler = new Handler();
        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

        TimeStamp = new java.util.Date().toString();

        b=(Button)findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                try 
                {
                    EditText et = (EditText) findViewById(R.id.editText1);
                    String str = et.getText().toString();
                    text.setText(text.getText().toString()+"Me: "+ str +" On "+TimeStamp+ "\n");

                /*
                    BufferedOutputStream bos=new BufferedOutputStream(socket.getOutputStream());
                    OutputStreamWriter osw= new OutputStreamWriter(bos,"US-ASCII");
                    osw.write(str+" "+TimeStamp);
                    osw.flush();
                    */
                    if(clientSocket==null)
                        Toast.makeText(MainActivity.this, "null socket", Toast.LENGTH_SHORT).show();
                    else
                    {
                    PrintWriter out = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(clientSocket.getOutputStream())),
                            true);
                    out.println(str);
                    out.flush();
                    et.setText("");
                    }
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });
    }

    @Override
    protected void onStop() 
    {
        super.onStop();
        try 
        {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
     }

 class ServerThread implements Runnable 
 {
     public void run() 
     {
         Socket socket = null;
         try 
         {
             serverSocket = new ServerSocket(SERVERPORT);
             serverSocket.setReuseAddress(true);
         } catch (IOException e) {
          e.printStackTrace();
     }

     while (!Thread.currentThread().isInterrupted()) 
     {
        try 
        {
            socket = serverSocket.accept();
            CommunicationThread commThread = new CommunicationThread(socket);
              new Thread(commThread).start();
        } catch (IOException e) {
            e.printStackTrace();
        }

     }
     }
   }
    class CommunicationThread implements Runnable 
    {
        //private Socket clientSocket;
        private BufferedReader input;
        public CommunicationThread(Socket aclientSocket) 
        {
            //this.aclientSocket = clientSocket;
            clientSocket=aclientSocket;
            try {
                //this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
                this.input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                } catch (IOException e) {
                e.printStackTrace();
            }

        }
        public void run() 
        {
            while (!Thread.currentThread().isInterrupted()) 
            {
                try 
                {
                    String read = input.readLine();
                    updateConversationHandler.post(new updateUIThread(read));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class updateUIThread implements Runnable 
    {
        private String msg;
        public updateUIThread(String str) 
        {
            this.msg = str;
        }

        @Override
        public void run() 
        {
            text.setText(text.getText().toString()+"Client: "+ msg +" On "+TimeStamp+ "\n");
        }
    }
}

从客户端发送的消息正确地接收到服务器,现在来自服务器的消息写入套接字,但无法在客户端读取

这里是客户端:

public class MainActivity extends ActionBarActivity {

private Socket socket;
Handler updateConversationHandler;
private static final int SERVERPORT = 5000;
private static final String SERVER_IP = "10.0.2.2";
TextView text;
Button c;
String TimeStamp;

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

      new Thread(new ClientThread()).start();
      TimeStamp = new java.util.Date().toString();


      c=(Button)findViewById(R.id.button1);
      text = (TextView) findViewById(R.id.textView1);
     c.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try 
            {
                EditText et = (EditText) findViewById(R.id.editText1);
                String str = et.getText().toString();
                text.setText(text.getText().toString()+"Me: "+ str +"On "+TimeStamp+ "\n");
                PrintWriter out = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())),
                        true);
                out.println(str);
                out.flush();
                et.setText("");
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

}

class ClientThread implements Runnable 
    {

        @Override
        public void run()
        {
            try 
            {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);
                CommunicationThread commThread = new CommunicationThread(socket);
                  new Thread(commThread).start();
            } catch (UnknownHostException e1) {
               e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

class CommunicationThread implements Runnable 
{
    private Socket clientSocket;
    private BufferedReader input;
    public CommunicationThread(Socket clientSocket) 
    {
        this.clientSocket = clientSocket;
        try {
            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
            } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public void run() 
    {
        while (!Thread.currentThread().isInterrupted()) 
        {
            try 
            {
                String read = input.readLine();
                Log.d("msg","readString"+read);
                updateConversationHandler.post(new updateUIThread(read));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class updateUIThread implements Runnable 
{
    private String msg;
    public updateUIThread(String str) 
    {
        this.msg = str;
        System.out.println("message in updateThread "+msg);
    }

    @Override
    public void run() 
    {
        System.out.println("message "+msg);
        text.setText(text.getText().toString()+"Server: "+ msg +"On "+TimeStamp+ "\n");
    }
}

}
日志显示:

D/gralloc_goldfish(1777): Emulator without GPU emulation detected.
W/System.err(1777): java.lang.NullPointerException 
W/System.err(1777):     at    com.example.socketservereg.MainActivity$1.onClick(MainActivity.java:67)
W/System.err(1777):     at android.view.View.performClick(View.java:4240)

W/System.err(1777):     at android.view.View$PerformClick.run(View.java:17721)

W/System.err(1777):     at android.os.Handler.handleCallback(Handler.java:730)

W/System.err(1777):     at android.os.Handler.dispatchMessage(Handler.java:92)

W/System.err(1777):     at android.os.Looper.loop(Looper.java:137)

W/System.err(1777):     at android.app.ActivityThread.main(ActivityThread.java:5103)

W/System.err(1777):     at java.lang.reflect.Method.invokeNative(Native Method)
06-17 W/System.err(1777):位于java.lang.reflect.Method.invoke(Method.java:525)

我是一个初学者,任何帮助都将不胜感激

在您使用的服务器中

socket.getOutputStream()
但应该是这样

clientSocket.getOutputStream()

问题是什么?当您在主ui线程上输出时,客户端发送的消息不应到达服务器。请告知您是否使用模拟器/设备。解释设置。正在使用哪个Android版本?来自客户端的消息应该到达服务器,但服务器到客户端不显示。am通过端口转发进行仿真,比如Android 4.3上的“redir add tcp:5000:6000”和am在仿真上的工作,这一点尚不清楚。你使用两个模拟器吗?一个用于服务器,一个用于客户机?您能解释一下所有这些应该如何工作吗?是的,两个模拟器,首先运行服务器应用程序,然后在另一个上运行客户机。两者都使用相同的方法进行对话,它在客户端工作,而不是在服务器端。这一行使客户端无法运行,即一条消息“不幸的是,客户端已停止工作”,这是服务器的代码。发生了什么事?在哪一时刻/动作/代码行会发生这种情况?您没有在此处修改服务器代码。请展示你所做的。请发布logcat和stacktraces。实际上没有错误消息。如果我按下服务器端的发送按钮,消息将显示在服务器gui上,但在客户端上没有显示(我希望它像聊天一样)。我认为问题在于'onClick()'方法,这里的'PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);out.println(str);out.flush();et.setText(“”;'似乎不起作用,因为如果消息发送成功,editText将设置为null。但当我跑步时,什么也不会发生,也不会出错。是的,我以前见过。您正在使用socket.getOutputStream。它应该是clientSocket.getOutputstream。我不是说过吗?如果你现在要尝试,那么请调整你的代码,这样我们就可以看到你在做什么。我用logcat更新,但我不明白为什么会出现空指针异常,因为我在客户端也这样做
clientSocket.getOutputStream()