1

我在套接字编程应用程序中有“服务器”的代码,并且java.net.SocketException在这行代码的以下代码的第 26 行中有这个异常:

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

2 回答 2

1

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

于 2011-08-28T19:23:33.773 回答
1

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

于 2011-08-28T20:06:30.200 回答