2011-08-28 3 views
1

나는 소켓 프로그래밍 응용 프로그램에서 "서버"에 대한이 코드를 가지고 있고, 나는 코드 줄에 다음 코드의 라인 (26)이 예외 java.net.SocketException 있습니다"java.net.SocketException : Connection reset"내 Runnable 클래스에서, 왜?

while((line=bReader.readLine())!=null){ 

문제는이 예외를 발생은 무엇입니까?

서버 :

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
public class Server implements Runnable{ 
    final public int PORT=1212; 
    private Socket client; 
    private ServerSocket server; 
    private BufferedReader bReader; 
    private PrintWriter pWriter; 
    public void run(){ 
     try { 
      System.out.println("Start server ..."); 
      server=new ServerSocket(PORT); 
      while(true){ 
       System.out.println("Start listening on PORT "+PORT+" ..."); 
       client=server.accept(); 
       System.out.println("Connection with client["+client.getInetAddress().getHostName()+"]"); 
       bReader=new BufferedReader(new InputStreamReader(client.getInputStream())); 
       pWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true); 
        String line=""; 
        while((line=bReader.readLine())!=null){ 
         RecoginzeMessage(line); 
        } 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally{ 
      try { 
       client.close(); 
      // server.close(); 
       bReader.close(); 
       pWriter.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
    public void RecoginzeMessage(String msg){ 
     String msg_params[]=msg.split(":"); 
     switch(Integer.parseInt(msg_params[0])){ 
     case 0:// Authetication process 
      System.out.println("Authentication new client"); 
      AuthenticateUser(msg_params[1],msg_params[2]); 
      break; 
     } 
    } 
    public void AuthenticateUser(String username, String password){ 
     if(username.equals("adham")&&password.equals("adham")){ 
      pWriter.println("1"); 
      pWriter.flush(); 
     } 
     else{ 
      pWriter.println("0"); 
      pWriter.flush(); 
     } 
    } 
} 

와 "클라이언트"에 대한이 코드 ..

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Scanner; 
public class Client implements Runnable { 
    public final String SERVER_IP="127.0.0.1"; 
    public final int PORT=1212; 
    private Socket client; 
    private BufferedReader bReader; 
    private PrintWriter pWriter; 
    Scanner sc=new Scanner(System.in); 
    public Client(){ 
     if(client==null) 
      try { 
       client=new Socket(SERVER_IP,PORT); 
       bReader=new BufferedReader(new InputStreamReader(client.getInputStream())); 
       pWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true); 

      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


    } 
    public void run(){ 

      System.out.print("Enter username: "); 
      String username=sc.nextLine(); 

      System.out.print("Enter password: "); 
      String password=sc.nextLine(); 

      if(login(username,password)){ 
       System.out.print(">logged in successfuly");    
      }else{ 
       System.out.print(">Inavlied username or password");        
      } 

    } 
    private boolean login(String username, String password){ 
     try{ 
      pWriter.println("0:"+username+":"+password); 
      pWriter.flush(); 
      while(true){ 
       String line=""; 
       while((line=bReader.readLine())!=null){ 
        if(line.equals("1")) 
         return true; 
        else 
         return false; 
       } 

      } 
     }catch(Exception ex){ 
      return false; 
     } 
    } 
} 

편집 : 클라이언트 스레드를 실행하는 클래스

public class RunClient {  
    public static void main(String args[]){ 
     Client cThread=new Client(); 
     cThread.run(); 
    } 
} 

편집 : 클래스는 실행 서버 스레드

public class RunServer { 
    public static void main(String args[]){ 
     Server sThread=new Server(); 
     sThread.run(); 
    } 
} 
+0

투표를 종료하고 폐회하는 사람에게 질문을 편집했습니다. 당신이 그것을하기 전에 당신이 코멘트에있는 질문에 당신의 문제가 무엇인지 보여줄 수있는 캠 !!! – Adham

답변

1

클라이언트가 스레드에 의해 실행되는 것 같지만 Runnable을 구현하는 것이 정확하지 않은 경우 Thread을 만들고 Runnable을 전달해야합니다. 클라이언트가 무기한 실행하지 않으므로 클라이언트 이 완료되면을 암시 적으로 닫고 (JVM) 소켓과 서버는 (클라이언트가 소켓을 닫음을 나타 내기 위해)이 예외를받습니다.

+0

나는 – Adham

+0

라는 질문을 편집했다. "당신은 스레드를 만들고 그것으로 Runnable을 전달해야합니다.", 당신은 무엇을 의미합니까? 당신은 plz 예제를 보여줄 수 있습니까? – Adham

+0

클래스'A'가''Runnable'' 객체이기 때문에,'new Thread (new A()). run()'을 시도해보십시오. –

1

SocketException을 피하려면 wait() 또는 클라이언트 응용 프로그램의 run() 메서드의 마지막 문과 비슷한 것을 사용하십시오.

관련 문제