Java 尝试实现多线程时,服务器/客户端程序不工作

Java 尝试实现多线程时,服务器/客户端程序不工作,java,multithreading,server,client,Java,Multithreading,Server,Client,在我尝试在服务器上实现多线程之前,我正在创建一个服务器客户端程序。我不确定是什么导致了这个问题。客户端在选择上载或下载选项并发送文件的第一行后连接到服务器,然后客户端崩溃,出现以下异常: java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.readSh

在我尝试在服务器上实现多线程之前,我正在创建一个服务器客户端程序。我不确定是什么导致了这个问题。客户端在选择上载或下载选项并发送文件的第一行后连接到服务器,然后客户端崩溃,出现以下异常:

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at Client.upload(Client.java:66)
    at Client.main(Client.java:99)
多线程前的服务器代码

import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;

public class Server 
{
    private static ServerSocket server;
    private static int port = 8001;

    public static void upload(String fileName)
    {
        try {
            System.out.println("File Uploading");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), 
            "utf-8"));
            System.out.println("Created " + fileName);
            while(true)
            {
                System.out.println("Waiting for next line");
                Socket socket = server.accept();
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                String message = (String) ois.readObject();
                if(message.equalsIgnoreCase("%end%"))break;
                out.write(message + "\n");
                System.out.println("Message Received: " + message);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("Server Received: " + message);
                ois.close();
                oos.close();
                socket.close();
            }
            out.close();
            System.out.println("Shutting down Socket server!!");
            server.close();
        }
        catch(IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void download(String fileName)
    {
        try {
            Socket socket = null;
            System.out.println("Selected Download");
            System.out.println(fileName + " Downloading");

            BufferedReader in = new BufferedReader(new FileReader(fileName));
            ObjectOutputStream oos = null;
            String line = null;
            while((line = in.readLine()) != null)
            {
                try
                {
                    socket = server.accept();
                    oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(line);
                    System.out.println("Line " + line + " sent to client");
                    oos.close();
                    Thread.sleep(100);
                } 
                catch(InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }
            System.out.println("Sending end of file");
            Socket endSocket = server.accept();
            ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
            end.writeObject("%end%");
            end.close();
            in.close();
            System.out.println("Shutting down Socket server!!");
            server.close();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) throws IOException, ClassNotFoundException
    {
        while(true)
        {
            try {
                server = new ServerSocket(port);
                System.out.println("Waiting for upload or download request from client");
                Socket socketUpDown = server.accept();

                ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
                String upDown = (String)request.readObject();
                if(upDown.equals("Upload"))
                {
                    upload((String)request.readObject());
                }

                else if(upDown.equals("Download"))
                {
                    download((String)request.readObject());
                }
                socketUpDown.close();
            }
            catch(IOException | ClassNotFoundException e){
                e.printStackTrace();
            }
        }
    }
}
import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;

public class Server 
{
    private static ServerSocket server;
    private static int port = 8001;

    public static void main(String args[]) throws IOException, ClassNotFoundException
    {
        try
        {
            server = new ServerSocket(port);
            int counter = 0;
            System.out.println("Server Started ....");
            while(true)
            {
                counter++;
                Socket serverClient = server.accept();
                System.out.println("A new client is connected : " + serverClient);
                ServerClientThread sct = new ServerClientThread(serverClient, counter);
                sct.start();
            }
        }catch(Exception e){
              e.printStackTrace();
        }
    }
    private static class ServerClientThread extends Thread 
    {
        private int clientNo;
        public ServerClientThread(Socket socket, int clientNo)
        {
            this.clientNo = clientNo;
        }

        public void run()
        {
            try {
                System.out.println("Waiting for upload or download request from client");
                Socket socketUpDown = server.accept();

                ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
                String upDown = (String)request.readObject();
                if(upDown.equals("Upload"))
                {
                    upload((String)request.readObject());
                }

                else if(upDown.equals("Download"))
                {
                    download((String)request.readObject());
                }
                socketUpDown.close();
            }
            catch(IOException | ClassNotFoundException e){
                e.printStackTrace();
            }
            finally{
                System.out.println("Client -" + clientNo + " exit!! ");
            }
        }

        public static void upload(String fileName)
        {
            try {
                System.out.println("File Uploading");
                Writer out = new BufferedWriter(new OutputStreamWriter(new 
                FileOutputStream(fileName), "utf-8"));
                System.out.println("Created " + fileName);
                while(true)
                {
                    System.out.println("Waiting for next line");
                    Socket socket = server.accept();
                    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                    String message = (String) ois.readObject();
                    if(message.equalsIgnoreCase("%end%"))break;
                    out.write(message + "\n");
                    System.out.println("Message Received: " + message);
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject("Received" + message);
                    ois.close();
                    oos.close();
                    socket.close();
                }
                out.close();
                System.out.println("Shutting down Socket server!!");
                server.close();
            }
            catch(IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

        public static void download(String fileName)
        {
            try {
                Socket socket = null;
                System.out.println("Selected Download");
                System.out.println(fileName + " Downloading");

                BufferedReader in = new BufferedReader(new FileReader(fileName));
                ObjectOutputStream oos = null;
                String line = null;
                while((line = in.readLine()) != null)
                {
                    try{
                        socket = server.accept();
                        oos = new ObjectOutputStream(socket.getOutputStream());
                        oos.writeObject(line);
                        System.out.println("Line " + line + " written to file");
                        oos.close();
                        Thread.sleep(100);
                        } 
                    catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                   }
                System.out.println("Sending end of file");
                Socket endSocket = server.accept();
                ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
                end.writeObject("%end%");
                end.close();
                in.close();
                System.out.println("Shutting down Socket server!!");
                server.close();
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}
多线程后的服务器代码

import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;

public class Server 
{
    private static ServerSocket server;
    private static int port = 8001;

    public static void upload(String fileName)
    {
        try {
            System.out.println("File Uploading");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), 
            "utf-8"));
            System.out.println("Created " + fileName);
            while(true)
            {
                System.out.println("Waiting for next line");
                Socket socket = server.accept();
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                String message = (String) ois.readObject();
                if(message.equalsIgnoreCase("%end%"))break;
                out.write(message + "\n");
                System.out.println("Message Received: " + message);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("Server Received: " + message);
                ois.close();
                oos.close();
                socket.close();
            }
            out.close();
            System.out.println("Shutting down Socket server!!");
            server.close();
        }
        catch(IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void download(String fileName)
    {
        try {
            Socket socket = null;
            System.out.println("Selected Download");
            System.out.println(fileName + " Downloading");

            BufferedReader in = new BufferedReader(new FileReader(fileName));
            ObjectOutputStream oos = null;
            String line = null;
            while((line = in.readLine()) != null)
            {
                try
                {
                    socket = server.accept();
                    oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(line);
                    System.out.println("Line " + line + " sent to client");
                    oos.close();
                    Thread.sleep(100);
                } 
                catch(InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }
            System.out.println("Sending end of file");
            Socket endSocket = server.accept();
            ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
            end.writeObject("%end%");
            end.close();
            in.close();
            System.out.println("Shutting down Socket server!!");
            server.close();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) throws IOException, ClassNotFoundException
    {
        while(true)
        {
            try {
                server = new ServerSocket(port);
                System.out.println("Waiting for upload or download request from client");
                Socket socketUpDown = server.accept();

                ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
                String upDown = (String)request.readObject();
                if(upDown.equals("Upload"))
                {
                    upload((String)request.readObject());
                }

                else if(upDown.equals("Download"))
                {
                    download((String)request.readObject());
                }
                socketUpDown.close();
            }
            catch(IOException | ClassNotFoundException e){
                e.printStackTrace();
            }
        }
    }
}
import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;

public class Server 
{
    private static ServerSocket server;
    private static int port = 8001;

    public static void main(String args[]) throws IOException, ClassNotFoundException
    {
        try
        {
            server = new ServerSocket(port);
            int counter = 0;
            System.out.println("Server Started ....");
            while(true)
            {
                counter++;
                Socket serverClient = server.accept();
                System.out.println("A new client is connected : " + serverClient);
                ServerClientThread sct = new ServerClientThread(serverClient, counter);
                sct.start();
            }
        }catch(Exception e){
              e.printStackTrace();
        }
    }
    private static class ServerClientThread extends Thread 
    {
        private int clientNo;
        public ServerClientThread(Socket socket, int clientNo)
        {
            this.clientNo = clientNo;
        }

        public void run()
        {
            try {
                System.out.println("Waiting for upload or download request from client");
                Socket socketUpDown = server.accept();

                ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
                String upDown = (String)request.readObject();
                if(upDown.equals("Upload"))
                {
                    upload((String)request.readObject());
                }

                else if(upDown.equals("Download"))
                {
                    download((String)request.readObject());
                }
                socketUpDown.close();
            }
            catch(IOException | ClassNotFoundException e){
                e.printStackTrace();
            }
            finally{
                System.out.println("Client -" + clientNo + " exit!! ");
            }
        }

        public static void upload(String fileName)
        {
            try {
                System.out.println("File Uploading");
                Writer out = new BufferedWriter(new OutputStreamWriter(new 
                FileOutputStream(fileName), "utf-8"));
                System.out.println("Created " + fileName);
                while(true)
                {
                    System.out.println("Waiting for next line");
                    Socket socket = server.accept();
                    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                    String message = (String) ois.readObject();
                    if(message.equalsIgnoreCase("%end%"))break;
                    out.write(message + "\n");
                    System.out.println("Message Received: " + message);
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject("Received" + message);
                    ois.close();
                    oos.close();
                    socket.close();
                }
                out.close();
                System.out.println("Shutting down Socket server!!");
                server.close();
            }
            catch(IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

        public static void download(String fileName)
        {
            try {
                Socket socket = null;
                System.out.println("Selected Download");
                System.out.println(fileName + " Downloading");

                BufferedReader in = new BufferedReader(new FileReader(fileName));
                ObjectOutputStream oos = null;
                String line = null;
                while((line = in.readLine()) != null)
                {
                    try{
                        socket = server.accept();
                        oos = new ObjectOutputStream(socket.getOutputStream());
                        oos.writeObject(line);
                        System.out.println("Line " + line + " written to file");
                        oos.close();
                        Thread.sleep(100);
                        } 
                    catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                   }
                System.out.println("Sending end of file");
                Socket endSocket = server.accept();
                ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
                end.writeObject("%end%");
                end.close();
                in.close();
                System.out.println("Shutting down Socket server!!");
                server.close();
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}

您正在调用
accept()
两次,并丢弃了第一个结果。谢谢,我发现多次使用accept存在问题。我重新构建了代码以提高效率。我不太明白accept方法到底做了什么,它接受套接字形式的客户端连接。您将第一个接受的套接字传递给
ServerClientThread
构造函数,然后将其丢弃,而不是将其存储到类成员中。
run()
方法不应再次调用
accept()
,它应使用该类成员。