2017-04-07 13 views
1

私はクライアント/サーバーJavaアプリケーションを構築しています。問題は、writeInt()でIntegerを送信すると、readInt()でブロックされることがあることです。ソケットreadIntは常に動作しない

クライアント

PrintWriter socketOut = new PrintWriter(sock.getOutputStream()); 
DataOutputStream d = new DataOutputStream(sock.getOutputStream()); 
String s = "User"; 
socketOut.println(s); 
socketOut.flush(); 
d.writeInt(data[0]); 
d.flush(); 
d.writeInt(data[1]); 
d.flush(); 

サーバー

while(true){ 
     System.out.println("Listening for clients..."); 
     clientSock = serverSock.accept(); 
     Scanner in = new Scanner(clientSock.getInputStream()); 

     String clientType = in.nextLine(); 

     switch(clientType){ 
      case "Resource": 
       new Thread(new ResourceService(clientSock)).start(); 
       break; 
      case "User": 
       new Thread(new UserService(clientSock)).start(); 
       break; 
     } 

    } 

ユーザスレッド

@Override 
    public void run(){ 
     try{ 
     DataInputStream input = new DataInputStream(user.getInputStream()); 
     int i = 0; 
     int a = input.readInt(); // Sometimes it blocks here. 
     int b = input.readInt(); 
     System.out.println(a); 
     System.out.println(b); 
     ... 

私がサーバーに送信された最初の文字列に基づいてクライアントを区別しようとしています。ときどき、サーバーがintを読み込み、時にはそれをブロックします。 出力の例です:

Listening for clients... 
Listening for clients... 
Listening for clients... 
Listening for clients... 
Listening for clients... 
1      // here the server didn't block 
100000 
Listening for clients... 

答えて

2

おそらくないのDataInputStream/DataOutputStreamのを使用するのは良いアイデアは、スキャナとのPrintWriterと一緒に混合しました。スキャナとPrintWriterは、ユーザーとのやりとりのためにもっと推奨されます。

DataOutputStreamとDataInputStreamだけを使用してください。

クライアント

DataOutputStream d = new DataOutputStream(sock.getOutputStream()); 
String s = "User"; 
d.writeUTF(s); 
d.writeInt(data[0]); 
d.flush(); 
d.writeInt(data[1]); 
d.flush(); 

サーバー

DataInputStream input = new DataInputStream(clientSock.getInputStream()); 
String clientType = input.readUTF(); 

switch(clientType){ 
    case "Resource": 
     new Thread(new ResourceService(input)).start(); 
     break; 
    case "User": 
     new Thread(new UserService(input)).start(); 
     break; 

ユーザースレッド

int a = input.readInt(); 
int b = input.readInt(); 
System.out.println(a); 
System.out.println(b); 

注1:DataInputStreamを/ DataOutputStreamを、使用する必要を書きません/ UTF文字列を読み取るために独自のプロトコルを使用します回線終端。

注2:PrintWriterのメソッドはI/O例外をスローしません。checkError(おそらくここでは問題ありません)を呼び出してチェックする必要があります。

+1

これで動作します。ありがとう! –

関連する問題