2012-05-14 62 views
0

我正在嘗試使服務器向所有連接的客戶端發送任何已收到的輸入。我正在使用創建它的服務啓動一個線程。向所有客戶端發送輸入SocketServer Android

public void onCreate() 
{  
    Thread fst = new Thread(new ServerThread()); 
    fst.start(); 
} 

這裏是主題

public void run() 
     { 
     try 
      {           
         serverSocket = new ServerSocket(SERVERPORT); 
      while (true) 
       { 
        // listen for incoming clients 
        Socket client = serverSocket.accept(); 
        mclients = new Vector<Socket>(); 
        mclients.add(client); 
        boolean finished = false; 
        try        
         { 
         for(int i=0; i<mclients.size(); i++)  { 
          DataInputStream in = new DataInputStream(mclients.get(i).getInputStream()); 
          PrintStream out = new PrintStream(mclients.get(i).getOutputStream()); 
          // Print a message: 
          System.out.println("Client from : " + mclients.get(i).getInetAddress() + " port " + mclients.get(i).getPort()); 
          // now get the input from the socket... 
          while(!finished) 
          { 
           String st = in.readLine(); 
           // Send the same back to client 
           out.println(st); 
           // Write it to the screen as well 
           System.out.println(st); 
           // If the input was "quit" then exit... 
           if (st.equals("quit")) { finished = true; System.out.println("Thread exiting..."); } 
          } 
                    } 
           handler.post(new Runnable() {@Override public void run() {}});         

         } 
        catch (final Exception e) {handler.post(new Runnable() {@Override public void run() {}});e.printStackTrace();} 
       } 

它僅適用於誰發送的輸入客戶端。輸入不回顯到所有clients.Can任何人幫我出this.I認爲我的客戶端代碼是錯誤的,但我不能想通這out.Here是我的客戶端代碼:

public class Client extends Activity implements OnClickListener{ 

private EditText serverIp; 
private static EditText data; 
private TextView receivedata, answer1 ,answer2, answer3, answer4; 
private Button connectPhones, send; 
private String serverIpAddress = ""; 
private boolean connected = false; 

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


    serverIp = (EditText) findViewById(R.id.server_ip); 
    receivedata = (TextView) findViewById(R.id.textView1); 
    answer1 = (TextView) findViewById(R.id.txtans1); 
    answer2 = (TextView) findViewById(R.id.txtans2); 
    answer3 = (TextView) findViewById(R.id.txtans3); 
    answer4 = (TextView) findViewById(R.id.txtans4); 
    data = (EditText) findViewById(R.id.data); 
    connectPhones = (Button) findViewById(R.id.connect_phones); 
    send = (Button) findViewById(R.id.send); 
    connectPhones.setOnClickListener(this); 
    send.setOnClickListener(this); 
} 


    @Override 
    public void onClick(View v) {   
     if(v == send) 
     { 
      if (!connected) 
      { 
       serverIpAddress = serverIp.getText().toString(); 
       if (!serverIpAddress.equals("")) 
       { 
        Thread cThread = new Thread(new ClientThread()); 
        cThread.start(); 
       } 
      } 
     } 
           } 
    public class ClientThread implements Runnable 
    {   
     String line; 
     String[] answers = new String[5]; 
      final Handler handler = new Handler(); 
      final Runnable updateUI = new Runnable() { 
       public void run() { 
        receivedata.setText(line); 
        //answer1.setText(answers[1]); 
        //answer2.setText(answers[2]); 
        //answer3.setText(answers[3]); 
        //answer4.setText(answers[4]); 
            } 
                 }; 
     public void run() 
     { 
      try 
      { 
       InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: SENDING..."); 
       Socket socket = new Socket(serverAddr, 5000); 
       connected = true; 
       while(connected) 
       { 
        try 
        {       
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));       
        PrintStream out = new PrintStream(socket.getOutputStream());            
        out.println(data.getText());         
        line = in.readLine();  // read server 
        System.out.println("Echo: " + line);       
        handler.post(updateUI); 
        in.close();      // Close stream 
        out.close(); 
        }      
        catch (Exception e) 
         { 
          Log.e("ClientActivity", "S: Error", e);        
         }          
         connected = false; 
       } 
          Log.d("ClientActivity", "C: Closed."); 
      } catch (Exception e) 
         { 
          Log.e("ClientActivity", "C: Error", e); 

         } 
     }   
     }} 

- ---編輯------
我應該使用不同的線程來處理客戶端,否則會出現問題?我該怎麼做?

回答

0

由於具有快速(非常快)看看我相信你的問題似乎是run()的

mclients =新的向量()內將以下代碼;

您每次運行程序時都會創建一個新的矢量對象。

我建議將其移出run(),並確保您的mClients是在您啓動偵聽傳入連接的線程之前創建的。

但是注意:在android手機上運行服務器是一個壞主意!手機有限制,如電池壽命有限,處理,內存和互聯網連接不一致,還有其他方式來處理此類通信。例如考慮消息傳遞,c2dm,xmpp等。

+0

沒有它沒有工作。我使mclients成爲靜態的,但它不工作; – dothedos

1

我看到你也在實例化循環內的ServerSocket本身。 你不需要爲每個連接創建一個新的serversocket,你只需要一個服務器套接字,然後循環接受連接並添加連接(已經在oncreate()中已經實例化)列表。看下面的例子。

如果這仍然不起作用,那麼我們將不得不看到代碼的其餘部分。 我想再次強調,這不會總是在Android上工作,因爲android也可以殺死你的服務和應用程序來獲取資源,並且每次wifi,3G或任何在手機上都失去連接,你的套接字可能會失敗。

ArrayList<Socket> mCLients; 
ServerSocket serverSocket; 

public void onCreate() 
{  
    mCLients; = new ArrayList<Socke>(); 
    serverSocket = new ServerSocket(SERVERPORT); 
    Thread fst = new Thread(new ServerThread()); 
    fst.start(); 
} 

// .....

private Static void send(final String message){ 
    Thread thread = new Thread(){ 
     for(Socket socket: mClients){ 
     // send message to the socket 
     } 
    } 
    thread.start(); 
} 

// ....

public void run(){ 

      while (true) 
       { 
        // listen for incoming clients 
        Socket client = serverSocket.accept(); 
        mclients.add(client); 
        //Read client input 
        MyService.send(message); 
       } 

} 

注意此代碼是沒有辦法的最好辦法,我只是給你一個你應該如何處理這個問題的快速例子。

+0

serverSocket = new ServerSocket(SERVERPORT);在while循環之外 – dothedos

+0

我也編輯了客戶端部分。 iT是完整的代碼 – dothedos

相關問題