2014-09-30 3 views
0

클라이언트에서 서버 (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을 선택했습니다. 클라이언트에서

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"); 

} 


} 
} 

답변

0

메인 스레드에서 네트워크 작업을하고있다 : 나는 사용자가 다른 장치의 IP 주소를 입력하고이 하드 코딩 보관하지 싶습니다. 별도의 스레드에서 수행하십시오. 자동으로 예외를 억제하지 마십시오. 그러면 로그에 표시됩니다.

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

죄송합니다. 신참입니다 –

+0

코드를 별도의 스레드에 넣으십시오. 위와 같이 변경하십시오. –

+0

Thnx 버디. 도움을 주셔서 감사합니다. 좋은 일을 계속 지켜라. 완벽하게 잘 작동했습니다. 새로운 글을 쓰는 일은 결코 내 머리를 치지 못하게 .... : p –