开发者

"java.net.SocketException: Connection reset" in my Runnable class, why?

I have this code for "Server" in socket programming application, and I have this Exception java.net.SocketException in line 26 of the following code in this line of code:

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

What is the problem causing this exception?

Server:

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

and this code for "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;
        }
    }
}

Edit: The class to run Client thread

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

Edit: The class to run Server thread

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


The client seems to be executed by a thread, but just implementing Runnable is not correct, you need to create a Thread and pass the Runnableto it. The client not executes indefinitely, so the client finishes and closes implicitly (the JVM) the socket and the Server get this exception to indicate that (client closes the socket).


To avoid SocketException try out to add wait() or similar something as the last statement in run() method in the client app.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜