一个简单的单线程OJ判题端(java实现)

来源:互联网 发布:mac系统怎么剪切文件 编辑:程序博客网 时间:2024/06/01 08:53

前言

最近准备用java做一个OJ的判题端,现在的想法还是不太成熟,实现的也十分简单,贴出来希望能和大家一同交流~

实现的大体思路

首先,前台的用户将代码提交后,假设将代码保存在服务器中。那么,判题端应该如何去做呢?(1)判题端根据提交文件的类型,用不同的编译器去进行编译;(2)服务器启动线程去执行编译后的文件;(3)根据执行结果将结果写回数据库。

实现的简单功能

这里我主要实现了启动一个线程去执行编译后的java文件。(1)在执行前将标准的输入重定向到1.in(测试输入数据);(2)然后,通过反射生成Class对象并执行它的main方法;

遇到的坑

关于执行测试数据的问题?    因为测试数据有多组,所以就有两种处理方式:    (1)提交的代码要求循环输入;    (2)将提交的代码执行多次      *如果这样处理的话,那么,每组测试数据需要单独的放在一个文件中,因为重定向的文件中的数据会被当成一次输入。。

代码实现

package com.oj;import java.io.FileInputStream;import java.lang.reflect.Method;/** * Created by leeezm on 17-7-18. */public class Main implements Runnable{    @Override    public void run() {        try {            FileInputStream fis=new FileInputStream("1.in文件的路径");            //将1.in作为标准输入            System.setIn(fis);            //后面参数的类名必须为全限定类名(添加完整包名)            Class clazz = Class.forName("com.oj.Test");            //获取main方法            Method mainMethod = clazz.getMethod("main", String[].class);            //第一个参数是执行该方法的主调,后面是执行该方法时传入的实参            mainMethod.invoke(null, (Object) new String[] { "" });            fis.close();        } catch (Exception e) {            e.printStackTrace();        }    }    public static void main(String[] args){        Main main=new Main();        new Thread(main).start();    }}
package com.oj;import java.util.Scanner;/** * Created by leeezm on 17-7-18. */public class Test {    public static void main(String[] args){        //提交的代码,循环进行输入        Scanner scan=new Scanner(System.in);        while(scan.hasNext()) {            int a = scan.nextInt();            int b = scan.nextInt();            System.out.println(a + b);        }    }}
原创粉丝点击