2013-04-21 4 views
1

Я пытаюсь подключить два устройства Android через Wi-Fi и отправить некоторые данные. На стороне клиента отображается соединение, но сервер не продвигается вперед до принятия. Я даже не знаю, как это возможно. Ниже приведен код сервера и клиента. Я подключил оба устройства, используя точку доступа Wi-Fi на одном из устройств.Соединение с клиентом Android подключается, но серверный сокет не принимает?

Server Side:

try 
    { 
      ServerSocket servsock = new ServerSocket(4149); 

       Log.d("VR","Waiting"); 
       text.setText("waiting"); //code reaching upto here 



       Socket sock = servsock.accept(); 
       //System.out.println("Accepted connection11 : " + sock); 
       text.setText("this is acc"+servsock); 
       //Log.d("VR","Accepted"); 
       text.setText("accepted"); 


      // receive file 
       byte [] mybytearray = new byte [filesize]; 
       InputStream is = sock.getInputStream(); 
       FileOutputStream fos = new FileOutputStream("/sdcard/WebOffice.jpg"); // destination path and name of file 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       bytesRead = is.read(mybytearray,0,mybytearray.length); 
       current = bytesRead; 


       do { 
        bytesRead = 
         is.read(mybytearray, current, (mybytearray.length-current)); 
        if(bytesRead >= 0) current += bytesRead; 
       } while(bytesRead > -1); 

       bos.write(mybytearray, 0 , current); 
       bos.flush(); 

       long end = System.currentTimeMillis(); 
       System.out.println(end-start); 
       bos.close(); 



       sock.close(); 


       Log.d("VR","Socket closed"); 

        Log.d("VR","image should be loaded by now"); 
        text.setText("image should be loaded by now"); 


       Intent i = new Intent(this,ImageDisplay.class); 
       startActivity(i); 








    } 
    catch (Exception e) { 
     // TODO: handle exception 
    } 

стороне клиента:

попробовать {

    ThreadPolicy tp = ThreadPolicy.LAX; 
        StrictMode.setThreadPolicy(tp); 
        ip = et.getText().toString(); 
        sock = new Socket("192.168.43.182",4149); 

        status.setText("connecting"); 
        status.setText("connected"+sock); 

        System.out.println("Connecting..."); 

        // sendfile 
          File myFile = new File (selectedImagePath); 
          byte [] mybytearray = new byte [(int)myFile.length()]; 
          FileInputStream fis = new FileInputStream(myFile); 
          BufferedInputStream bis = new BufferedInputStream(fis); 
          bis.read(mybytearray,0,mybytearray.length); 
          OutputStream os = sock.getOutputStream(); 
          System.out.println("Sending..."); 
          os.write(mybytearray,0,mybytearray.length); 
          os.flush(); 

         sock.close(); 

         //Intent i = new Intent(Sender.this,ImageReceive.class); 
         //startActivity(i); 
       } catch (UnknownHostException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

ответ

0

Ваш собственный комментарий говорит, что код попадает в линию после того, принять, так что я не узнайте, о чем вы спрашиваете. Однако ваша копия петли все должны выглядеть следующим образом:

while ((count = in.read(buffer)) >= 0) 
{ 
    out.write(buffer, 0, count); 
} 

Там нет причин, чтобы ввести задержку и память отходов, читая все входные в огромный буфер, или ByteArrayInputStream, прежде чем писать какой-либо вывод. «буфер» может быть любым разумным размером, например. 2k.

+0

Hii, спасибо за ответ. . Это была ошибка ввода. Сервер почему-то не принимает подключения, поэтому я не могу понять, почему. Я также хотел бы добавить, что, когда один и тот же код запускается на компьютере как java-код, он работает. В android я добавил все разрешения, и код работает в рамках действия. Нет никакой нити. – nitinsh99

+0

@ nitinsh99 Если он «не принимает соединения», как он попадает в строку после вызова accept()? – EJP

0

Мне удалось решить проблему. Не было никакого IP-адреса сервера для начала. По какой-то причине андроид 4.2 не привязывает сокет к IP-адресу устройства ... когда я попытался запустить тот же код на имбирном работал. Я пришел к выводу, что jelly bean больше не поддерживает программирование сокетов. Может быть, Google заставляет нас использовать wifidirect api для достижения adhoc-сетей, а не для клиентского программирования сервера.

Смежные вопросы