我的Runnable类中的“java.net.SocketException:Connection reset”,为什么?

时间:2011-08-28 19:13:27

标签: java sockets socketexception

我在套接字编程应用程序中有“Server”的代码,我在这行代码中的以下代码的第26行中有此异常java.net.SocketException

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();
        }
    }
}

此代码为“client”..

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();
    }
}

2 个答案:

答案 0 :(得分:1)

客户端似乎是由一个线程执行的,但只是实现Runnable不正确,您需要创建一个Thread并将Runnable传递给它。客户端无法无限期执行,因此客户端完成关闭隐式(JVM)套接字和服务器获取此异常以指示(客户端关闭套接字)。 / p>

答案 1 :(得分:1)

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