2011-08-28 47 views
1

我有套接字编程应用“服务器”这个代码,我有这样的例外java.net.SocketException在这行代码下面的代码行26:“我的Runnable”类中的“java.net.SocketException:Connection reset”,为什么?

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传递给它”,你是什么意思?你能举一个例子吗? – Adham

+0

作为'A'类'Runnable'对象,尝试'新线程(new A())。run()'。 –

1

要避免SocketException尝试添加wait()或类似的东西作为客户端应用程序run()方法中的最后一条语句。

相关问题