2013-11-29 8 views
2

Здравствуйте, дорогие программисты. Мне нужно вашей помощи.Android Socket (Client-Server)

Я сделал очень очень простой проект java socket (client-server), что сработало хорошо. Но когда я использовал этот клиентский код, чтобы сделать его для android, он не работает, но я делаю только клиентский код для android, код сервера снова находится в Java (может быть, я тоже должен сделать код сервера в android?)

сервера (в Java)

public class DailyAdviceServer{ 
    public void go() { 
    try { 
     ServerSocket serverSock = new ServerSocket(16242, 50); 
     while (true) 
     { 
      Socket sock = serverSock.accept(); 

      PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
      String advice = getAdvice(); 
      writer.println(advice); 
      writer.close(); 
      System.out.println("smth"); 
     } 
    } catch (IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 



public static void main(String[] args) 
{ 
    DailyAdviceServer server = new DailyAdviceServer(); 
    server.go(); 
} 

}

Client (в Android)

public class MainActivity extends Activity { 


protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     try { 
      TextView tv = (TextView) findViewById(R.id.tv);  
      Socket s = new Socket("127.0.0.1", 4242); 
      InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
      BufferedReader reader = new BufferedReader(streamReader); 

      String advice = reader.readLine(); 

      tv.setText("Today you should: " + advice); 
      reader.close(); 
     } 
     catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 



} 
+0

Похоже, вы подключаетесь к Android стороне локальный - то, что вы имеете в виду, чтобы подключиться к IP-адрес вашего сервер (а не Android-устройство) – powerj1984

+0

Вы также не должны делать сетевые подключения ('' s Socket' и т. Читайте: https://developer.android.com/training/basics/network-ops/connecting.html – zapl

ответ

10

Вы не должны подключаться к сети в "onCreat()", и может использовать "AsyncTask"

Stirng advice = ""; 

class MySyncTask extends AsyncTask<Integer, Integer, String>{ 
@Override 
protected String doInBackground(Integer... params) { 
     Socket s = new Socket("127.0.0.1", 4242); 
     InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
     BufferedReader reader = new BufferedReader(streamReader); 

     String advice = reader.readLine(); 
     reader.close 

    } 

protected void onPostExecute(String result) { 
    tv.setText("Today you should: " + advice); 
} 
protected void onPreExecute() { 
    log.i("start"); 
}  

}

и добавьте этот код в вас OnCreate:

     MySyncTask asyncTask=new MySyncTask (tv,pbar); 
        asyncTask.execute(1000); 

Мои коды могут иметь некоторую ошибку, вы должны проверить;

Вы можете найти «AsyncTask» в google и иметь много информации для него. Это может быть полезно для вас.

Работы, которые требуют много времени, не могут вставлять в поток пользовательского интерфейса, мачту положить в фоновом режиме.

Я извиняюсь за мой плохой английский

Я сожалею, я modfied мои коды снова

+0

Большое спасибо, сейчас я бы попробовал эту версию. – user3050103

+0

Извините, я снова поправил свои коды –

+0

Еще раз спасибо, я новичок в StackOverflow, поэтому у меня нет репутации, иначе я бы проголосовал за ваш ответ, извините – user3050103

2

После того, как эти данные были отправлены, вам необходимо отправить flush. Вы можете сделать сервер на Android или Java, как работает fine.Try это:

writer.println(advice); 
writer.flush(); 

И не забывайте EOF для каждого данных вы посылаете так все это было бы:

writer.println(advice + System.getProperty("line.separator")); 
writer.flush(); 

Надеюсь это поможет.

+0

'println' добавляет EOL уже. – zapl

+0

Большое спасибо, но я ничего не понимаю. Почему один и тот же код работает для java-клиента, но не для Android-клиента (с тем же сервером и клиентом, и он работает для Java даже без него: writer.println (совет + System.getProperty («line.separator»)); writer.flush(); – user3050103

+0

@ user3050103 вы не можете подключиться к '127.0.0.1', если клиент и сервер запускаются на разных устройствах. Вам нужно поместить IP-адрес сервера в это место и подключиться через Wi-Fi, чтобы телефон мог достичь этого IP-адреса – zapl