Программа на один запуск

Интерфейс, диалоги, темы, стили, меню
Ответить
scanick
Сообщения: 2
Зарегистрирован: 14 дек 2013, 17:02

Программа на один запуск

Сообщение scanick » 14 дек 2013, 17:20

Доброго времени суток. Ситуация такова - есть сервер-сокет на ява, запущенный на машине и есть клиент-сокет на андроиде, который соединяется/разъединяется с сервером, принимает/отсылает сообщения. Пока клиент запущен в виртуалке - всё работает хорошо, но когда ставлю клиент на смартфон, подключиться удается только один раз!!! Подскажите в чём может быть проблема.
Код клиента:

Код: Выделить всё

public class ClientActivity extends Activity 
{
	private static final String TAG = "myLogs";
	
	MyClient myClient;
	EditText etSendMessage;
	TextView tvReciveMessage;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	  {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		tvReciveMessage = (TextView) findViewById(R.id.tvTextIn);
		etSendMessage = (EditText) findViewById(R.id.etTextOut);
	  }
	
	public void onClick(View v) 
          {
	  switch (v.getId()) 
           {
	      case R.id.butConnect://
	        		myClient = new MyClient();
	        		myClient.execute();
	        		break;
	      case R.id.butSend://
	    	  		myClient.setMessage(etSendMessage.getText().toString());
	        		break;
	      case R.id.butDisConnect://
		  	  	myClient.setMessage("exit");
	  			break;
	      case R.id.butExit://
	    	  		myClient.setMessage("exit");
				try {TimeUnit.SECONDS.sleep(2);} 
				catch (InterruptedException e) {e.printStackTrace();}
	    	  		myClient.onCancelled();
	    	  		finish();
    	  			break;
        }
    }
	
	class MyClient extends AsyncTask<String, String, Void> 
	  {
	    private Socket socket = null;
	    private PrintWriter out = null;
	    private BufferedReader reader = null;
	    private String ip = "192.168.1.3";
	    private int port = 1984;
	    private boolean isConnect = false;
	    private String sendMessage = "";
	    
		@Override
		protected void onPreExecute() {super.onPreExecute();}
		
		private void connect()
          {
			try 
			  {
	            socket = new Socket(ip, port);
	            Log.i(TAG, "Соединение установлено");
	            publishProgress("Соединение установлено");
	            isConnect = true;
	            socket.setKeepAlive(true);
	            out = new PrintWriter(socket.getOutputStream(),true);
	            new Thread(new Runnable() 
	              {
	                public void run() 
	                  {
	                	try
	                	  {
	                		reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	                		while(true) 
		        			  {
	                			String str = new String();
	                			str = reader.readLine();
	                			if(str == null || str.equals("exit") )
	                			  {
	                				break;
	                			  }
	                			if(str.length() > 1)
	                				str = str.substring(0, str.length()-1);
	                			publishProgress("Принято сообщение" + str);
		        			  } 
		        		  }
	                	catch(Exception e){ Log.e(TAG, "Ошибка4 " + e.toString());} 
	                	finally
		        		  {
	                		try { reader.close();} catch (IOException e) { Log.e(TAG, "Ошибка5 " + e.toString());}
	                		disconnect();
		        		  }
	                  }
                  }).start();
              }
            catch (NumberFormatException e) { Log.e(TAG, "Ошибка1 " + e.toString()); } 
		    catch (UnknownHostException e) {Log.e(TAG, "Ошибка2 " + e.toString());}
            catch (IOException e) {Log.e(TAG, "Ошибка3 " + e.toString());}
          }
		
		private void setMessage(String message) {sendMessage = message;}

		private void writeMessage(String message)
          {            
			if (isConnect)
	          {
				out.println(message);
				out.flush();
				Log.i(TAG, "Отправлено сообщение: " + message);
	          }
          }
		
		private void disconnect()
	      {			
	        if (isConnect)
	          {
	            try{socket.close();} 
	            catch (IOException e) {Log.e(TAG, "Ошибка6 " + e.toString());}
	          }
	        if (out != null)
	          {
	            out.close();
	          }
	      }
		
		@Override
		protected void onPostExecute(Void result) 
		  {
			this.disconnect();
			super.onPostExecute(result);
		  }
		
		@Override
	    protected void onCancelled() 
	      {
	        this.disconnect();
	        super.onCancelled();
	      }

		@Override
		protected Void doInBackground(String... params) 
		  {
			this.connect();
			while (true)
              {
				if (sendMessage.length() > 0)
                  {                             
					this.writeMessage(sendMessage);
					sendMessage = "";   
                  } 
              }
		  }
		
		@Override
		protected void onProgressUpdate(String... values) 
		  {
			super.onProgressUpdate(values);
			tvReciveMessage.setText(values[0]);
		  }
	  }
}

Аватара пользователя
alexmedv
Сообщения: 29
Зарегистрирован: 29 май 2013, 12:55

Re: Программа на один запуск

Сообщение alexmedv » 14 дек 2013, 17:48

У тебя сервер может обслуживать только одного клиента ? Может дисконнект как-то криво происходит.

scanick
Сообщения: 2
Зарегистрирован: 14 дек 2013, 17:02

Re: Программа на один запуск

Сообщение scanick » 16 дек 2013, 12:26

Сервер обслуживает только одного клиента, при дисконнекте переходит в ожидание нового клиента. Судя по логам из виртуалки дисконнект происходит нормально, причём с обоих сторон.

Аватара пользователя
alexmedv
Сообщения: 29
Зарегистрирован: 29 май 2013, 12:55

Re: Программа на один запуск

Сообщение alexmedv » 16 дек 2013, 15:14

Давай код сервера, попробую скомпилировать и запустить у себя.

Ответить