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

问题描述:

我做了一个程序,从客户端发送消息到服务器(2个Android设备),但消息没有被发送。如何获取消息从服务器发送到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"); 

} 


} 
} 

在你的客户你在主线程上做网络操作。做他们在一个单独的线程。不要默默地抑制异常,你会在日志中看到。

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(); 
+0

请问您能否解释..对不起,我是菜鸟 – 2014-09-30 04:48:32

+0

更改上面的东西,就是把你的代码放在一个单独的线程中。 – 2014-09-30 04:57:20

+0

Thnx哥们。非常感谢您的帮助。保持良好的状态。它工作得很好。做一个新的线程永远不会打我的头....:p – 2014-09-30 05:33:22