2012-02-16 10 views
11

मेरे पास एक साधारण क्लाइंट सर्वर प्रोग्राम है। सर्वर एकाधिक ग्राहकों से कनेक्शन स्वीकार कर सकते हैं। वर्तमान में यह मेरे क्लाइंट में क्या हो रहा है।
1) ग्राहक में सूची टाइप करें। सर्वर क्लाइंट को वर्तमान निर्देशिका में सभी फाइलें वापस भेज देगा। 2) क्लाइंट में "हैलो" टाइप करें। सर्वर को "हैलो" वापस भेजना चाहिए। हालांकि, ग्राहक में ग्राहक खाली पढ़ता है।
मैं ग्राहक में "QUIT" दर्ज करता हूं। मैं केवल सर्वर से हैलो संदेश वापस देखता हूं।
मैं यह नहीं समझ सकता कि ग्राहक सर्वर द्वारा वापस भेजे जाने के बाद हैलो संदेश क्यों नहीं पढ़ता है।क्लाइंट सॉकेट सर्वर सॉकेट से डेटा के लिए प्रतीक्षा कैसे करें

क्लाइंट कोड

import java.net.*; // Contains Socket classes 
import java.io.*; // Contains Input/Output classes 
import java.nio.CharBuffer; 

class ClntpracticeSandbox{ 

    public static void main(String argv[]){ 


    try{ 
//  
     Socket client=new Socket("localhost", 7777); 
     System.out.println("Connected to server " + client.getInetAddress() 
      + ": " + client.getPort()); 
     System.out.println("local port is " + client.getLocalPort()); 

     BufferedReader kbreader; 
     BufferedWriter writer; 
     BufferedReader reader; 

     kbreader = new BufferedReader(new InputStreamReader(System.in)); 
     writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
     reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     String data = "", datakb, line=null; 

     do{ 
      System.out.print("Text to the server? "); 
      datakb = kbreader.readLine(); 
      writer.write(datakb); 
      writer.newLine(); 
      writer.flush(); 

      System.out.print("Received from the Server: "); 
      line = reader.readLine(); 
      while (line.equals("")==false){ 
       System.out.println(line); 
       line = reader.readLine(); 
      } 
     } while (datakb.trim().equals("QUIT")==false);   
     client.close(); 
     System.exit(0); 

     }catch(Exception e){ 
      System.err.println("Exception: " + e.toString()); 
     } 
    } 
} 

सर्वर कोड

import java.net.*; // Contains Socket classes 
import java.io.*; // Contains Input/Output classes 
import java.nio.file.*; 

class SrvrpracticeSandbox{ 
    public static void main(String argv[]) throws IOException { 
     ServerSocket s = new ServerSocket(7777); 

     System.out.println("Server waiting for client on port " + s.getLocalPort()); 
     int count = 0; 
     do { 
      count = count + 1; 
      Socket connected = s.accept(); 
      new clientThread(connected, count).start(); 
     } while (true); 

    } 
} 

class clientThread extends Thread { 

    Socket myclientSocket = null; 
    int mycount; 
    DataInputStream is = null; 
    PrintStream os = null; 


    public clientThread(Socket clientSocket, int count) { 
     this.myclientSocket = clientSocket; 
     this.mycount = count; 
    } 

    public void run() { 
     try { 

      System.out.println("New connection accepted " + myclientSocket.getInetAddress() + ": " + myclientSocket.getPort()); 

      BufferedReader reader; 
      BufferedWriter writer; 

      reader = new BufferedReader(new InputStreamReader(myclientSocket.getInputStream())); 
      writer = new BufferedWriter(new OutputStreamWriter(myclientSocket.getOutputStream())); 

      String data; 
      String testdirectory = "file1.txt\nfile2.txt\nfile3.txt"; 
      do{ 
       data = reader.readLine(); 
       System.out.println("Received from " +mycount + ":" + data); 
       if (data.equals("LIST")) { 
        writer.write(mycount + "\n"+"150 - Transfer Initiated."+"\n"+ 
          "DATA " +returnDirectoryList().getBytes().length + "\n" + 
          returnDirectoryList() + "\r\n"); 
       } else { 
        writer.write("Server Echos to " + mycount + ":"+ data + "\n"+"This is a new line."+"\r\n"); 
       }     
       writer.newLine(); 
       writer.flush(); 

      }while (data.equals("QUIT") == false); 

      myclientSocket.close(); 
      System.exit(0); 
     } catch (IOException ex) { 
     } 
    } 
    private String returnDirectoryList() 
    { 
     String files = ""; 
     Path dir = Paths.get("."); 
     try { 
      DirectoryStream<Path> stream = 
      Files.newDirectoryStream(dir); 
      for (Path file: stream) { 
       files = files + file.getFileName() +"\n"; 
      } 
     } catch (IOException | DirectoryIteratorException x) { 
      System.err.println("returnDirectoryList "+x.toString()); 
     } 
     return files;   
    } 
} 

उत्तर

0

आप सर्वर से सभी आदेश भेजने और अपने सर्वर केवल "सूची" के लिए लग रहा है एक विशेष आदेश के रूप में, बाकी सब द्वारा नियंत्रित किया जाएगा भाग "गूंज"।

if (data == null) { 
    continue; 
} 
if (data.equals("LIST")) { 
    writer.write(mycount + "\n" + "150 - Transfer Initiated." + "\n" + 
    "DATA " + returnDirectoryList().getBytes().length + "\n" + 
    returnDirectoryList() + "\r\n"); 
} else { 
    writer.write("Server Echos to " + mycount + ":" + data + "\n" + "This is a new line." + "\r\n"); 
} 

मैं अपने कोड के साथ की कोशिश की और इसके बाद के संस्करण छोटे परिवर्तन (के बाद से मैं एनपीई मिला) और आउटपुट लग रहा है

तरह

serverside:

Server waiting for client on port 7777 
New connection accepted /127.0.0.1: 52889 
Received from 1:peter 
Received from 1:LIST 

क्लाइंट साइड:

Connected to server localhost/127.0.0.1: 7777 
local port is 52889 
Text to the server? peter 
Received from the Server: Server Echos to 1:peter 
This is a new line. 
Text to the server? LIST 
Received from the Server: 1 
150 - Transfer Initiated. 
DATA 6 
Files 
Text to the server? 

क्या अपेक्षित व्यवहार नहीं है?

+0

हैलो पीटर मैं चाहता हूं कि क्लाइंट क्लाइंट से प्रसंस्करण अनुरोध जारी रखे जब तक क्लाइंट QUIT भेजता है। जब क्लाइंट सर्वर से अनुरोध पढ़ता है तो मुख्य मुद्दा ग्राहक पक्ष पर होता है। क्लाइंट से भेजे गए QUIT को छोड़कर अनुरोध के लिए क्लाइंट सर्वर से "" पढ़ता है। – shresthaal

+0

ऊपर कोड और आउटपुट देखें –

-1

System.exit(0);clientThread की रन विधि में कथन समस्या है।

यह एक ग्राहक की सेवा के बाद सिस्टम से बाहर निकलने का कारण बन रहा है।

8

क्षमा करें, मैं अंग्रेजी नहीं बोलता, यह मेरा पहला जवाब है। सर्वर प्रतिक्रिया का इंतजार करने का प्रयास करें:

do{ 
     System.out.print("Text to the server? "); 
     datakb = kbreader.readLine(); 
     writer.write(datakb); 
     writer.newLine(); 
     writer.flush(); 

     System.out.print("Received from the Server: "); 

     DataInputStream dataInputStream = new DataInputStream(client.getInputStream()); 

     int attempts = 0; 
     while(dataInputStream.available() == 0 && attempts < 1000) 
     { 
      attempts++; 
      Thread.sleep(10) 
     } 

     reader = new BufferedReader(dataInputStream); 
     line = reader.readLine(); 

     while (line.equals("")==false){ 
      System.out.println(line); 
      line = reader.readLine(); 
     } 
    } while (datakb.trim().equals("QUIT")==false);   
    client.close(); 
    System.exit(0); 

    }catch(Exception e){ 
     System.err.println("Exception: " + e.toString()); 
    } 
    ... 
संबंधित मुद्दे