Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的客户机-服务器应用程序_Java_Sockets_Serialization_Client_Server - Fatal编程技术网

Java中的客户机-服务器应用程序

Java中的客户机-服务器应用程序,java,sockets,serialization,client,server,Java,Sockets,Serialization,Client,Server,我有一个用Java编写的服务器应用程序,其中包含一个Student对象列表(实现可序列化)。客户端应用程序发送一条消息,其中包含要获取的Student对象的整数索引。然后将所选学生发送到客户端,客户端修改其值并发回。然而,应用程序在某个时候会冻结,这可能是我在下面代码中强调的行的问题 服务器: public class Server { public static void main(String[] arg) { ArrayList <Student> s

我有一个用Java编写的服务器应用程序,其中包含一个Student对象列表(实现可序列化)。客户端应用程序发送一条消息,其中包含要获取的Student对象的整数索引。然后将所选学生发送到客户端,客户端修改其值并发回。然而,应用程序在某个时候会冻结,这可能是我在下面代码中强调的行的问题

服务器:

public class Server {

    public static void main(String[] arg) {
        ArrayList <Student> studentList = new ArrayList <Student> ();
        studentList.add(new Student(170435, "justyna", "kaluzka", new ArrayList <Float>()));
        studentList.add(new Student(170438, "michal", "szydlowski", new ArrayList <Float>()));
        studentList.add(new Student(170436, "marek", "polewczyk", new ArrayList <Float>()));
        studentList.add(new Student(170439, "jakub", "szydlowski", new ArrayList <Float>()));
        studentList.add(new Student(170430, "anna", "majchrzak", new ArrayList <Float>()));
        studentList.add(new Student(170425, "krzysztof", "krawczyk", new ArrayList <Float>()));
        studentList.add(new Student(170445, "adam", "szydlowski", new ArrayList <Float>()));
        studentList.add(new Student(170415, "karol", "chodkiewicz", new ArrayList <Float>()));
        studentList.add(new Student(170465, "artur", "schopenhauer", new ArrayList <Float>()));

        ServerSocket socketConnection = null;
        ObjectInputStream serverInputStream = null;
        ObjectOutputStream serverOutputStream = null;

        try {
            socketConnection = new ServerSocket(11111);
            System.out.println("Server Waiting");

            Socket pipe = socketConnection.accept();

            serverOutputStream = new ObjectOutputStream( pipe.getOutputStream());
            serverInputStream = new ObjectInputStream( pipe.getInputStream());

            int index = serverInputStream.readInt();
            System.out.println(index);

            //  HERE'S WHEN THE PROBLEM STARTS
            serverOutputStream.writeObject(studentList.get(index));
            Student student = (Student) serverInputStream.readObject();

            System.out.println(student.toString());
        } catch (IOException e) {
            System.out.println(e);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                serverInputStream.close();
                serverOutputStream.close();
                socketConnection.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
我对客户机-服务器套接字的了解很模糊,所以这很可能是一个简单的错误。有什么想法吗

编辑: 学生班

public class Student implements Serializable {
    private static final long serialVersionUID = -5169551431906499332L;
    private int indexNumber;
    private String name;
    private String familyName;
    private ArrayList<Float> marks;
    private float average;

    public Student(int indexNumber, String name, String familyName,
            ArrayList<Float> marks) {
        this.indexNumber = indexNumber;
        this.name = name;
        this.familyName = familyName;
        this.marks = marks;
        this.average = 0;
        generateMarks();
        calculateAverage();
    }

    public int getIndexNumber() {
        return indexNumber;
    }

    public void setIndexNumber(int indexNumber) {
        this.indexNumber = indexNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    public float getAverage() {
        return average;
    }

    public void setAverage(float average) {
        this.average = average;
    }

    /**
     * Calculates average of all Student's marks.
     */
    public void calculateAverage() {
        float sum = 0;
        for (int i = 0; i < marks.size(); i++) {
            sum += marks.get(i);
        }
        this.average = sum / marks.size();
    }

    /**
     * Generates a random set of marks for the student.
     */
    public void generateMarks() {

        for (int i = 0; i < 10; i++) {
            addMark(new Random().nextFloat() * 5);
        }

    }

    /**
     * Mark getter
     * 
     * @return String representation of marks
     */
    public String getMarks() {
        String marksstr = "";
        for (int i = 0; i < marks.size(); i++) {
            marksstr += marks.get(i).toString() + "   ";
        }
        return marksstr;
    }

    /**
     * Adds a mark to the list.
     * 
     * @param mark
     */
    public void addMark(float mark) {
        marks.add(mark);
    }

    @Override
    public String toString() {
        return "Index number:" + indexNumber + "\tName:" + name
                + "\tFamily name:" + familyName + "\t\tAverage:" + getAverage()
                + "\n";
    }
}
公共类学生实现可序列化{
私有静态最终长serialVersionUID=-5169551431906499332L;
私有整数指数;
私有字符串名称;
私有字符串familyName;
私有数组列表标记;
私人浮动平均线;
公立学生(int索引编号、字符串名称、字符串家庭名称、,
ArrayList标记){
this.indexNumber=indexNumber;
this.name=名称;
this.familyName=familyName;
这个。标记=标记;
这个平均值=0;
生成标记();
计算频率();
}
public int getIndexNumber(){
返回索引编号;
}
公共无效setIndexNumber(int indexNumber){
this.indexNumber=indexNumber;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getFamilyName(){
返回家庭名称;
}
public void setFamilyName(字符串familyName){
this.familyName=familyName;
}
公共浮动平均值(){
收益率平均值;
}
公共平均值(浮动平均值){
这个平均数=平均数;
}
/**
*计算所有学生分数的平均值。
*/
公众假期{
浮点数和=0;
对于(int i=0;i
在服务器上的
ObjectInputSteam
之前初始化
ObjectOutputStream

初始化
ObjectInputStream
时,它会等待“header”数据。您的服务器正在等待该标头数据。您需要首先初始化
ObjectOutputStream
(发送头数据),然后初始化
ObjectInputStream

您可以在中找到更多关于此的信息



写入int后,必须刷新
ObjectOutputStream
。将数据写入流时,它会写入缓冲区。只有当流的缓冲区已满时,才会发送来自该缓冲区的数据。int不能填充它,因此您必须
flush()
它才能从缓冲区手动发送数据。

在服务器上的
objectinputstream
之前初始化
ObjectOutputStream

初始化
ObjectInputStream
时,它会等待“header”数据。您的服务器正在等待该标头数据。您需要首先初始化
ObjectOutputStream
(发送头数据),然后初始化
ObjectInputStream

您可以在中找到更多关于此的信息



写入int后,必须刷新
ObjectOutputStream
。将数据写入流时,它会写入缓冲区。只有当流的缓冲区已满时,才会发送来自该缓冲区的数据。int不能填充它,因此您必须
flush()
it才能从缓冲区手动发送数据。

我假设您的对象是可序列化的?在
之后“问题开始了”
您能走多远?到下面的
println
两行?不,我只在服务器端得到“服务器等待”,在客户端没有得到任何结果。ofc是可序列化的。在这一行之前,它工作正常:student=(student)clientInputStream.readObject();这就是它开始不响应的时候了。我假设您的对象是可序列化的?在
之后“问题就从这里开始”
您走了多远?到下面的
println
两行?不,我只在服务器端得到“服务器等待”,在客户端没有得到任何结果。ofc是可序列化的。在这一行之前,它工作正常:student=(student)clientInputStream.readObject();这就是它开始不响应的时候。@markspace假设您没有遵守严格的协议。此外,即使在使用不同线程进行读/写操作时,有些人也喜欢将初始化保持在中心位置,以便于管理。最好是以正确的方式进行,了解问题的原因。但你是对的;在不同线程上初始化也可以解决这个问题好的,诀窍是:我想从客户端到服务器发送一个整数,然后从服务器到客户端发送一个对象,让客户端修改它,然后将它发送回服务器。只需创建两个可运行文件(一个用于读取,一个用于写入)并启动两个线程就可以了吗?@user4359659是的,但您需要两个线程吗?我不这么认为,我也不建议这样做(如果可能的话,尽量避免并发,这样你就不必担心了)
public class Student implements Serializable {
    private static final long serialVersionUID = -5169551431906499332L;
    private int indexNumber;
    private String name;
    private String familyName;
    private ArrayList<Float> marks;
    private float average;

    public Student(int indexNumber, String name, String familyName,
            ArrayList<Float> marks) {
        this.indexNumber = indexNumber;
        this.name = name;
        this.familyName = familyName;
        this.marks = marks;
        this.average = 0;
        generateMarks();
        calculateAverage();
    }

    public int getIndexNumber() {
        return indexNumber;
    }

    public void setIndexNumber(int indexNumber) {
        this.indexNumber = indexNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    public float getAverage() {
        return average;
    }

    public void setAverage(float average) {
        this.average = average;
    }

    /**
     * Calculates average of all Student's marks.
     */
    public void calculateAverage() {
        float sum = 0;
        for (int i = 0; i < marks.size(); i++) {
            sum += marks.get(i);
        }
        this.average = sum / marks.size();
    }

    /**
     * Generates a random set of marks for the student.
     */
    public void generateMarks() {

        for (int i = 0; i < 10; i++) {
            addMark(new Random().nextFloat() * 5);
        }

    }

    /**
     * Mark getter
     * 
     * @return String representation of marks
     */
    public String getMarks() {
        String marksstr = "";
        for (int i = 0; i < marks.size(); i++) {
            marksstr += marks.get(i).toString() + "   ";
        }
        return marksstr;
    }

    /**
     * Adds a mark to the list.
     * 
     * @param mark
     */
    public void addMark(float mark) {
        marks.add(mark);
    }

    @Override
    public String toString() {
        return "Index number:" + indexNumber + "\tName:" + name
                + "\tFamily name:" + familyName + "\t\tAverage:" + getAverage()
                + "\n";
    }
}