2012-05-04 13 views
0

私は、Javaアプリケーションの開発の初心者です。私はアンドロイドでチャットアプリケーションを作っています。私は入ってくるクライアントにサービスを提供するためにスレッドを使用しますが、クライアントがサーバに接続しているときはソケットに含まれるデータを取得できませんが、クライアント接続が失われたときにデータが表示されます。 ReadLineメソッドを使用して、ソケットからデータを読み取ります。 これは、サーバ側のプログラムコードです:プログラムの起動時にサーバー側の表示の下にソケットからデータを取得できません

package server; 
import java.net.*; 
import java.io.*; 
import java.util.Vector; 

import com.sun.org.apache.bcel.internal.generic.NEW; 

public class Server {  

public static void main(String[] args)throws IOException, InstantiationException, 
IllegalAccessException {    

    ServerSocket servsocket = null; 
    Socket sock = null; 
    byte[] bytebuffer = new byte[512]; 

    try { 
     System.out.println("SERVER IS RUNNING..."); 
     servsocket = new ServerSocket(28000); 
     while(true){ 
     sock = servsocket.accept(); 
     System.out.println(servsocket.isBound()); 
     System.out.println("Port "+servsocket+" Ready!!!"); 
     System.out.println("Accept connection requests from " + sock); 
     System.out.println("From CLIENT "+sock.getInetAddress()+ " and PORT " + 
      sock.getPort()); 
     ChatThread thread = new ChatThread(sock); 
     System.out.println("Thread is running"); 
     thread.run();  


     } 
    } catch (IOException ioe) { 
     System.out.println(ioe); 
    } 
    finally{ 
      try { 
       servsocket.close(); 
       } catch (IOException ioe) { 
        System.out.println(ioe); 
       } 
      }  
    } 
    } 

class ChatThread extends Thread{ 
    static Vector<ChatThread> chatthread = new Vector<ChatThread>(10); 
    private Socket sock; 
    private BufferedReader in ; 
    private PrintWriter out; 

    public ChatThread (Socket socket) throws IOException { 
     this.sock = socket; 
     in = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 
     out = new PrintWriter(
       new OutputStreamWriter(socket.getOutputStream())); 

     byte[] bytebuffer = new byte[512]; 
     int receivemssg; 

    } 

    public void run(){ 
     int recvMsgSize; 
     byte[] bytebuffer = new byte[512]; 
     String readsocket; 
     try { 
      readsocket = in.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
      } 
       } 

。私はクライアント側から "こんにちは...."という言葉を送ろうとしました。スレッドが実行されていないことがわかります。

サーバが実行中... true ポートServerSocket [addr = 0.0.0.0/0.0.0.0、port = 0、localport = 28000] Ready !!! 受け入れる接続がfromSocketを要求[ADDR =/172.17.231.254、ポート= 3567、次に、localport = 28000]クライアントから /172.17.231.254とPORT 3567 スレッドが実行される...

私は上のReadLineメソッドを置き換える

getInputStreamを持つスレッド。クライアントからスレッドを実行すると、メッセージを表示できます。これは前に使用したreadlineメソッドを置き換えるスレッドに入るコードです。次のように

public ChatThread (Socket socket) throws IOException { 
     this.sock = socket; 
     in = sock.getInputStream(); 
     out = sock.getOutputStream(); 
     byte[] bytebuffer = new byte[512]; 
     int receivemssg; 

    } 

    public void run(){ 
     int recvMsgSize; 
     byte[] bytebuffer = new byte[512]; 

     System.out.println("Thread is Running..."); 
     String masuk = new String(bytebuffer); 

     System.out.println(bytebuffer); 
     System.out.println(in.toString()); 
     System.out.println("thread successfully executed !!!"); 

     synchronized (chatthread) { 
      chatthread.addElement(this); 
     } 

     try { 
      while ((recvMsgSize = in.read(bytebuffer)) != -1) { 
        out.write(bytebuffer, 0, recvMsgSize); 
        System.out.println("The length of a character is received and returned "+bytebuffer.length); 
       } 
     } catch (IOException e) { 

      System.out.println(e); 
     } 
        } 
        } 

が、次の問題は、私が表示され、文字列/テキストでソケットの内容を持ち出すことができないでは、次のとおりです。

ポートのServerSocket [ADDR = 0.0.0.0/0.0.0.0、ポート= 0、ローカルポート= 28000] Siap !!! @ 7c6768 java.net.SocketInputStream @ B [ ...接続がfromSocket [ADDR =/172.17.231.254、ポート= 3577、次に、localport = 28000] は、スレッドが実行される3577 CLIENT /172.17.231.254とPORTからの要求受け入れ1690726 スレッドが正常に実行されました! 文字の長さは、受信し

512は私を助けてください返され、感謝:) GBUみんな...

答えて

1

は、開発者のdocmentation

公共最後の文字列のreadLine() をするので参照してください。 APIレベル1

このストリームから利用可能な次のテキスト行を含む文字列を返します。 行は0以上の文字で構成され、その後に '\ n'、 '\ r'、 '\ r \ n' またはストリームの終わりが続きます。文字列に改行シーケンスは含まれません。

のreadLine()は、接続が失われたときに何が起こるか、おそらくである、そのような改行文字としてのend-of-line状態を見て、またはストリームの終わりに達しているのどちらかまで戻りブロックしません。 。

readLine()を使用する場合は、 "Hello .... \ n"を送信するか、readLine()の終端文字を追加する必要があります。

+0

返信いただき、ありがとうございます:) –

関連する問題