2012-01-12 32 views
5

Bir echo sunucusundan ve aşağıdaki kodla bir android istemcisinden oluşan bir sınamayı çalıştırmayı denediğimde, her zaman "msn kapalı" özel durum mesajı alıyorum. Bu kod sadece sunucuya msg gönderebilir ve sunucudan msg alabilir, fakat aynı anda her ikisini de yapmak isterseniz, işe yaramıyor ... Neden bu tür bir soruna yol açacağını merak ediyorum. ve eğer ilk e-posta sunucusunaAndroid Socket Exception "soket kapalı"

'a msg göndermek ve sonra eko sunucusundan msg gönderebilmek için bunu nasıl düzeltmeliyim?

  // Server IP address 
      InetAddress serverIp; 

      // try to connect Server 
      try { 

       // set up server IP address 
       serverIp = InetAddress.getByName("192.168.17.1"); 

       // set up port 
       int serverPort=12345; 

       // initiate socket connection 
       Socket clientSocket=new Socket(serverIp,serverPort); 

       BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream()); 
       out.write("Send From Android1111, stitch ".getBytes()); 
       out.flush(); 

       //wait to receive Server's msg 
       BufferedReader br =new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

       total.toString();*/ 
      // Display received msg with Toast 
       Toast.makeText(getApplicationContext(), br.readLine(), Toast.LENGTH_SHORT).show(); 

      //close connection 
       clientSocket.close();    

//    out.close(); 
//    out = null; 
      } catch (IOException e) { 
       // display exception with Toast 
       Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show(); 
      } 

maalesef hala ... çalışmıyor Ben senin talimat takip ve kod değiştirin: Yardımcısı'nın kolaylık

  // set up Server IP address 
      serverIp = InetAddress.getByName("192.168.2.2"); 

      // set up Server port 
      int serverPort=12345; 

      // initiate socket connection 
      Socket clientSocket=new Socket(serverIp,serverPort); 

       // open input and output stream 
      OutputStream out = clientSocket.getOutputStream(); 
      InputStream in = clientSocket.getInputStream(); 

      //send msg 
      out.write("Send From Android1111, bitch ".getBytes()); 


       // receive msg from server 
      byte[] buffer = new byte[in.available()]; 
      in.read(buffer); 
      String rMsg = new String(buffer); 
      Toast.makeText(getApplicationContext(), rMsg, Toast.LENGTH_LONG).show(); 

      //close input and output stream 
      in.close(); 
      out.close(); 

      //關閉連線 
     clientSocket.close(); 
     } catch (IOException e) { 
      // 出錯後顯示錯誤訊息Toast 
      Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show(); 
     } 

, burada sunucu bölümü için kod yazılı piton : Hatalı sırada doğru şeyleri yaptığınızı farz ediyorum.

# Practice Echo Server Program written in Python 
import socket 

# host = '' means it binds to any available interface 
host = '' 
port = 12345 

# socket() function returns a socket object whose methods implement the various socket system calls. 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

# Bind the socket to address. 
s.bind((host,port)) 

# Listen for connections made to the socket. The backlog argument specifies 
# the maximum number of queued connections and should be at least 0; 
# the maximum value is system-dependent (usually 5), the minimum value is forced to 0. 
s.listen(5) 

# Accept a connection. The socket must be bound to an address and listening for 
# connections. The return value is a pair (conn, address) where conn is a new socket 
# object usable to send and receive data on the connection, and address is the address 
# bound to the socket on the other end of the connection. 
conn, addr = s.accept() 
print 'Connected by', addr 

# Receive data from the socket. The return value is a string representing the data received. 
# The maximum amount of data to be received at once is specified by bufsize. See the Unix 
# manual page recv(2) for the meaning of the optional argument flags; it defaults to zero. 
# Note For best match with hardware and network realities, the value of bufsize should be 
# a relatively small power of 2, for example, 4096. 

while 1: 
    data = conn.recv(1024) 
    if not data: break 
    print 'received data is : ', repr(data) 
    conn.send(data) 

conn.close() 
+3

yılında İNTERNET izni gerekiyor. Teşekkür ederim. Senin için düzelttim. – prolink007

cevap

5

Sunucu çok hızlı olabilir ve yanıtı okumaya çalıştığınızda zaten alınmış ve gitti. öğretici Reading from and Writing to a Socket

  1. aç soket
  2. Açık soketine bir giriş akışı ve çıkış akışı sunulan kuralları gereğince

    .

  3. Sunucunun protokolüne göre akıştan oku ve yaz.
  4. Akışları kapatın.
  5. Soketi kapatın.

Farkı görüyor musunuz? İlk önce Giriş ve Çıkış akışını açın ve ardından isteğinizi göndermeye başlayın.

Bu siparişe bağlı kalırsanız işe yarayacağından eminim.

+0

nope ... hala benim için çalışmıyor ... çok garip ... sadece bu seferki tost gösterisi boş dize ... garip ... – shanwu

+1

@ user1145976 Lütfen kodu cevap olarak göndermeyin. Sadece sorunuzu güncelleyin. Sadece belirli durumlarda çalışan _in.available() _ kullandığınız kodla ilgili. Bu yüzden kullanmayın. Sadece bir BufferedReader ve _readLine() _ ile sevdiğim örnek kodu kullanın. – Robert

-1

Başvurunuz burada yayınlarınızda "saldırgan" bir dil göndermek için çalışın AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/> 
+0

Yaptım, işe yaramıyor. – shanwu

+0

Bu, 'soket kapalı' istisnalara neden olmaz. – EJP