Exception in thread "main" java.net.SocketException: socket closed
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at ServerApp.<init>(ServerApp.java:16)
at ServerApp.main(ServerApp.java:66)
是不是说我socket 已经关闭了?

解决方案 »

  1.   

    是的,估计InputStream OR OutputStream 不小心在哪里被关掉了!或者对方关闭了!
      

  2.   

    你做的是不是多先程的文件传输??
    用ECHO看看线程的返回值估计能找到错误所在
      

  3.   

    怎么用echo看?我把程序写上来,主要是实现多线程的
    server端的
    import java.io.*;
    import java.net.*;
    public class ServerApp {

    static final int PORT=9000;
    private ServerSocket serverSocket;
    private Socket socket;
    private BufferedReader netIn;
    private PrintWriter netOut;


    public ServerApp() throws IOException {
    serverSocket=new ServerSocket(PORT);
    System.out.println("server start");
    while(true){
    socket=serverSocket.accept();
    ServerThread st=new ServerThread(socket);
    new Thread(st).start();
    }
    }
    class ServerThread implements Runnable{
    private Socket socket;
    private int randomNumber;
    private int clientGuessNumber;
    public ServerThread(Socket s)throws IOException{
    socket=s;
    netIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    netOut=new PrintWriter(socket.getOutputStream());
    }
    public void run(){
    System.out.println("client"+socket.getInetAddress()+" is connect");
    randomNumber=(int)(Math.random()*100);
    System.out.println("random number is:"+randomNumber);
    try{
    clientGuessNumber=Integer.parseInt(netIn.readLine());
    System.out.println("client guess number is:"+clientGuessNumber);
    for(int i=3;i>0;i--){
    if (clientGuessNumber==randomNumber){
    netOut.println("恭喜,猜对了");
    ClientApp.finished=true;
    }
    else if(clientGuessNumber<randomNumber){
    netOut.println("您猜的数小了,您还有"+(i-1)+"次机会");
    ClientApp.finished=false;
    }
    else if(clientGuessNumber>randomNumber){
    netOut.println("您猜的数大了,您还有"+(i-1)+"次机会");
    ClientApp.finished=false;
    }
    clientGuessNumber=Integer.parseInt(netIn.readLine());
    }

    }catch(IOException e){}
    finally {
    try{
    netOut.close();
    netIn.close();
    serverSocket.close();
    socket.close();
    }catch(IOException ee){}
    }
    }

    }
    public static void main(String[] args)throws IOException{
    new ServerApp();
    }
    }client端的
    import java.io.*;
    import java.net.*;
    public class ClientApp {
    private Socket socket;
    private BufferedReader netIn;
    private PrintWriter netOut;
    private BufferedReader keyboardIn;
    static Boolean finished=false;
    public ClientApp() throws IOException{
    System.out.println("请输入服务器地址,连接本地服务器请输入localhost");
    keyboardIn=new BufferedReader(new InputStreamReader(System.in));
    try{
    if(keyboardIn.readLine().equalsIgnoreCase("localhost")){
    socket=new Socket(InetAddress.getLocalHost(),ServerApp.PORT);
    }
    else{
    socket=new Socket(InetAddress.getByName(keyboardIn.readLine()),ServerApp.PORT);
    }
    }catch(UnknownHostException e){
     System.err.println("连接不到服务器");
     System.exit(-1);
     }
    System.out.println("连接成功");
    while(!finished){
    System.out.println("请输入0-100之间的数字");
    netOut.println(keyboardIn.readLine());
    netIn.readLine();
    }
    netIn.close();
    netOut.close();
    keyboardIn.close();
    socket.close();
    }
    public static void main(String[] args)throws IOException{
    new ClientApp();
    }
    }
      

  4.   

    服务器端的import java.io.*;
    import java.net.*;
    public class ServerApp {

    static final int PORT=9000;
    private ServerSocket serverSocket;
    private Socket socket;
    private BufferedReader netIn;
    private PrintWriter netOut;


    public ServerApp() throws IOException {
    serverSocket=new ServerSocket(PORT);
    System.out.println("server start");
    while(true){
    socket=serverSocket.accept();
    ServerThread st=new ServerThread(socket);
    new Thread(st).start();
    }
    }
    class ServerThread implements Runnable{
    private Socket socket;
    private int randomNumber;
    private int clientGuessNumber;
    public ServerThread(Socket s)throws IOException{
    socket=s;
    netIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    netOut=new PrintWriter(socket.getOutputStream());
    }
    public void run(){
    System.out.println("client"+socket.getInetAddress()+" is connect");
    randomNumber=(int)(Math.random()*100);
    System.out.println("random number is:"+randomNumber);
    try{
    clientGuessNumber=Integer.parseInt(netIn.readLine());
    System.out.println("client guess number is:"+clientGuessNumber);
    for(int i=3;i>0;i--){
    if (clientGuessNumber==randomNumber){
    netOut.println("恭喜,猜对了");
    ClientApp.finished=true;
    }
    else if(clientGuessNumber<randomNumber){
    netOut.println("您猜的数小了,您还有"+(i-1)+"次机会");
    ClientApp.finished=false;
    }
    else if(clientGuessNumber>randomNumber){
    netOut.println("您猜的数大了,您还有"+(i-1)+"次机会");
    ClientApp.finished=false;
    }
    clientGuessNumber=Integer.parseInt(netIn.readLine());
    }

    }catch(IOException e){}
    finally {
    try{
    netOut.close();
    netIn.close();
    serverSocket.close();
    socket.close();
    }catch(IOException ee){}
    }
    }

    }
    public static void main(String[] args)throws IOException{
    new ServerApp();
    }
    }客户端的import java.io.*;
    import java.net.*;
    public class ClientApp {
    private Socket socket;
    private BufferedReader netIn;
    private PrintWriter netOut;
    private BufferedReader keyboardIn;
    static Boolean finished=false;
    public ClientApp() throws IOException{
    System.out.println("请输入服务器地址,连接本地服务器请输入localhost");
    keyboardIn=new BufferedReader(new InputStreamReader(System.in));
    try{
    if(keyboardIn.readLine().equalsIgnoreCase("localhost")){
    socket=new Socket(InetAddress.getLocalHost(),ServerApp.PORT);
    }
    else{
    socket=new Socket(InetAddress.getByName(keyboardIn.readLine()),ServerApp.PORT);
    }
    }catch(UnknownHostException e){
     System.err.println("连接不到服务器");
     System.exit(-1);
     }
    System.out.println("连接成功");
    while(!finished){
    System.out.println("请输入0-100之间的数字");
    netOut.println(keyboardIn.readLine());
    netIn.readLine();
    }
    netIn.close();
    netOut.close();
    keyboardIn.close();
    socket.close();
    }
    public static void main(String[] args)throws IOException{
    new ClientApp();
    }
    }
      

  5.   

    ServerThread
    里面,你为什么把ServerSocket也关掉了??
    } finally {
            try {
              netOut.close();
              netIn.close();
              // serverSocket.close();
              socket.close();
            } catch (IOException ee) {
            }
          }
      

  6.   

    你的程序还有几个问题,我一块调整了! 还有,这2段代码我收藏了!import java.io.*;
    import java.net.*;public class ServerApp {  static final int PORT = 9000;
      private ServerSocket serverSocket;
      private Socket socket;
      private BufferedReader netIn;
      private PrintWriter netOut;  public ServerApp() throws IOException {
        serverSocket = new ServerSocket(PORT);
        System.out.println("server start");
        while (true) {      socket = serverSocket.accept();
          ServerThread st = new ServerThread(socket);
          new Thread(st).start();    }
      }  class ServerThread implements Runnable {
        private Socket socket;
        private int randomNumber;
        private int clientGuessNumber;    public ServerThread(Socket s) throws IOException {
          socket = s;
          netIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          netOut = new PrintWriter(socket.getOutputStream());
        }    public void run() {
          System.out.println("client" + socket.getInetAddress() + " is connect");
          randomNumber = (int) (Math.random() * 100);
          System.out.println("random number is:" + randomNumber);
          try {
            clientGuessNumber = Integer.parseInt(netIn.readLine());
            System.out.println("client guess number is:" + clientGuessNumber);
            for (int i = 3; i > 0; i--) {
              if (clientGuessNumber == randomNumber) {
                netOut.println("恭喜,猜对了");
                ClientApp.finished = true;
              } else if (clientGuessNumber < randomNumber) {
                netOut.println("您猜的数小了,您还有" + (i - 1) + "次机会");
                ClientApp.finished = false;
              } else if (clientGuessNumber > randomNumber) {
                netOut.println("您猜的数大了,您还有" + (i - 1) + "次机会");
                ClientApp.finished = false;
              }
              netOut.flush(); // 这里得刷新
              clientGuessNumber = Integer.parseInt(netIn.readLine());
              if (ClientApp.finished) { // 这里得判断退出
                break;
              }
            }      } catch (IOException e) {
          } finally {
            try {
              netOut.close();
              netIn.close();
              // serverSocket.close(); // 这里去掉了
              socket.close();
            } catch (IOException ee) {
            }
          }
        }  }  public static void main(String[] args) throws IOException {
        new ServerApp();
      }
    }package test;import java.io.*;
    import java.net.*;public class ClientApp {
      private Socket socket;
      private BufferedReader netIn;
      private PrintWriter netOut;
      private BufferedReader keyboardIn;
      static Boolean finished = false;  public ClientApp() throws IOException {
        System.out.println("请输入服务器地址,连接本地服务器请输入localhost");
        keyboardIn = new BufferedReader(new InputStreamReader(System.in));
        try {
          if (keyboardIn.readLine().equalsIgnoreCase("localhost")) {
            socket = new Socket(InetAddress.getLocalHost(), ServerApp.PORT);
          } else {
            socket = new Socket(InetAddress.getByName(keyboardIn.readLine()), ServerApp.PORT);
          }
          netIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 这里得初始化
          netOut = new PrintWriter(socket.getOutputStream());// 这里得初始化
        } catch (UnknownHostException e) {
          System.err.println("连接不到服务器");
          System.exit(-1);
        }
        System.out.println("连接成功");
        while (!finished) {
          System.out.println("请输入0-100之间的数字");
          netOut.println(keyboardIn.readLine());
          netOut.flush(); // 这里的刷新
          System.out.println(netIn.readLine()); // 这里得输出服务器端的输出
        }
        netIn.close();
        netOut.close();
        keyboardIn.close();
        socket.close();
      }  public static void main(String[] args) throws IOException {
        new ClientApp();
      }
    }
      

  7.   

    最新的代码,我放在了 http://www.java2000.net/viewthread.jsp?tid=686
      

  8.   

    改了一下,能运行了。还有为什么serverSocket不能close()?