如何获取从服务器发送到Android的消息

时间:2014-09-30 04:42:07

标签: android main-activity

我已经制作了一个程序,用于从客户端向服务器发送消息(2个Android设备),但消息未被发送。

以下是客户端应用程序的代码:

package com.example.clientphone;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.*;



public class MainActivity extends ActionBarActivity {

    private EditText ipaddress , textfield;
    private Button send;
    private String ip , message;
    private Socket client;
    private PrintWriter printwriter;



   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       ipaddress = (EditText)findViewById(R.id.editText1);
       textfield = (EditText)findViewById(R.id.editText2);
       send = (Button) findViewById(R.id.button1);
       StrictMode.ThreadPolicy policy = new      StrictMode.ThreadPolicy.Builder().permitAll().build();// enabling strict mode and setting thread policy
    StrictMode.setThreadPolicy(policy);
    send.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            message = textfield.getText().toString();
            ip = ipaddress.getText().toString();// getting ip address
            textfield.setText(" ");
            try {

                client = new Socket(ip, 5200);// ip address is entered over here....
                printwriter = new PrintWriter(client.getOutputStream() , true);// getting the outputstream
                printwriter.write(message);// writing the message
                printwriter.flush();// flushing the printwriter
                printwriter.close();// closing printwriter
                client.close();// closing client




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

        }
    });
}



}

以下是服务器端应用程序的代码。我已选择端口5200连接。我希望用户输入其他设备的IP地址,而不是硬编码:

package com.example.serverphone;

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

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.*;


public class MainActivity extends ActionBarActivity {

TextView message;
private ServerSocket socket;
private Handler UpdateConversationHandler;
Thread ServerThread = null;
public static final int port = 5200;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    message = (TextView)findViewById(R.id.textView1);
    UpdateConversationHandler = new Handler();
    this.ServerThread = new Thread(new ServerThread());
    this.ServerThread.start();
}

@Override
protected void onStop() {
    super.onStop();
    try {

        socket.close();


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


class ServerThread implements Runnable{

@Override
public void run() {
    Socket socket2 = null;

    try {

        socket = new ServerSocket(port);




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

            e.printStackTrace();
        }
    }

}

   }

   class BufferedReaderThread implements Runnable{

   private Socket clientSocket;
   private BufferedReader input;

   public BufferedReaderThread(Socket clientSocket) {
       this.clientSocket = clientSocket;

       try {


           this.input = new BufferedReader(new  InputStreamReader(this.clientSocket.getInputStream()));




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









@Override
public void run() {
    while(!Thread.currentThread().isInterrupted()){// making sure the thread is not interrupted...
        try {

            String read = input.readLine();
                if(read != null){

                    UpdateConversationHandler.post(new updateUIConversation(read));
                }




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

    }


}


 }

   class updateUIConversation implements Runnable{

   private String msg;
   public updateUIConversation(String str){
       this.msg = str;
   }

@Override
public void run() {
    message.setText(message.getText().toString() + msg + "/n");

}


}  
}

1 个答案:

答案 0 :(得分:0)

在您的客户端中,您正在主线程上进行网络操作。在单独的线程中执行它们。不要默默地压制异常,你会在日志中看到。

new Thread(new Runnable() {
public void run() {
try {
  Socket client = new Socket(ip, 5200);
  PrintWriter = new PrintWriter(client.getOutputStream() , true);
  printwriter.write(message);// writing the message
  printwriter.flush();// flushing the printwriter
  printwriter.close();// closing printwriter
  client.close();// closing client
} catch (Exception x) { Log.e("CLIENT", "Exception " + x); }
}).start();
相关问题