Java网络斗地主小程序

Java 网络斗地主

项目要求:
运用多线程知识构建一个多客户端的斗地主程序,斗地主功能完善,利用Socket实现客户端和服务器端的信息交互。

未完成 进展:
客户端:
MainJFrame类

public class MainFrame extends JFrame{
    public MyPanel myPanel;
    public String uname;
    public Socket socket;

    public SendThread sendThread;

    public MainFrame(String uname, Socket socket){
        this.uname = uname;
        this.socket = socket;

        //设置窗口属性
        this.setSize(1200,700);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //添加Mypanel
        myPanel = new MyPanel();
        myPanel.setBounds(0,0,1200,700);
        this.add(myPanel);

        //启动发消息的线程
        sendThread = new SendThread(socket,uname);
        sendThread.start();
    }
}

MyPanel类

public class MyPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        Image image = new ImageIcon("images/bg/bg1.png").getImage();
        g.drawImage(image,0,0,this.getWidth(),this.getHeight(),null);
    }
}

Login类

public class Login extends JFrame {
    private JLabel uanmeJLabel;
    private JTextField unameJTextField;
    private JButton btnJButton;

    public Login(){
        this.uanmeJLabel = new JLabel("登录名:");
        this.unameJTextField = new JTextField();
        this.btnJButton = new JButton("登录");

        this.setSize(500,200);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setLayout(new GridLayout(1,3));

        this.add(uanmeJLabel);
        this.add(unameJTextField);
        this.add(btnJButton);

        //创建我们的监听器对象 绑定到按钮上
        MyEvent myEvent = new MyEvent();
        this.btnJButton.addActionListener(myEvent);
    }

    //创建事件监听器
    class MyEvent implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            //获取用户名
            String uname = unameJTextField.getText();
            //创建一个socket连接服务器
            try {
                Socket socket = new Socket("127.0.0.1",6666);

                //跳转到主窗口
                new MainFrame(uname,socket);
            } catch (IOException e1) {
                e1.printStackTrace();
            }


        }
    }
}

SendThread类

public class SendThread extends Thread {
    private Socket socket;
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    public SendThread(){

    }

    public SendThread(Socket socket){
        this.socket = socket;
    }
    public SendThread(Socket socket,String msg){
        this.socket = socket;
        this.msg = msg;
    }

    public void run(){
        //字节流
        //转换   数据流  数据的输入输出流可以写任何类型的数据

        DataOutputStream dataOutputStream ;
        try {
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            while (true) {
                //如果消息不为空
                if (msg != null) {
                    //发送消息
                    dataOutputStream.writeUTF(msg);
                    //之后清空消息
                    msg = null;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //wirteUTF  写出UTF格式的字符串



    }
}

服务器端

MainJFrame类

public class MainFrame {
    //创建玩家列表
    public List<Player> players = new ArrayList<Player>();
    public int index = 0;

    //全部扑克的列表
    public List<Poker> allPokers = new ArrayList<Poker>();

    public MainFrame() {
        //创建扑克列表
        createPoker();
        try {
            //创建服务器端的Socket
            ServerSocket serverSocket = new ServerSocket(6666);

            //需要一直接收加一个while
            while (true) {
                //接收客户端的Socket
                Socket socket = serverSocket.accept();
                //开启线程,处理客户端的Socket

                AcceptThread acceptThread = new AcceptThread(socket);
                acceptThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //创建一个内部线程
    class AcceptThread extends Thread{
        Socket socket;
        public AcceptThread(Socket socket){
            this.socket = socket;
        }
        public void run(){
            try {
                //和客户端对应也是用的数据流
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());

                while (true){
                    String msg = dataInputStream.readUTF();
                    //创建一个player对象
                    Player player = new Player(index++,msg);
                    player.setSocket(socket);
                    players.add(player);
                    System.out.println("这是客户端传来的消息:"+ msg + "上线了");

                    System.out.println("上线人数:"+players.size());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //创建所有扑克
    public void createPoker(){

    }
}

poker类

//扑克类
public class Poker {

    private int id;//扑克id
    private String name;//扑克名称
    private int num;//扑克数量
    private boolean isOut;//是否打出

    public Poker() {
    }


    public Poker(int id, String name, int num) {
        this.id = id;
        this.name = name;
        this.num = num;
    }

    public boolean isOut() {
        return isOut;
    }

    public void setOut(boolean out) {
        isOut = out;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNamr() {
        return name;
    }

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

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

player类

//玩家类
public class Player {

    private int id;//玩家id
    private String name;//玩家名称
    private Socket socket;//玩家对应的Socket
    private List<Poker> pokers = new ArrayList<>();//玩家的扑克

    public Player() {
    }

    public Player(int id) {
        this.id = id;
    }

    public Player(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Player(int id, String name, Socket socket, List<Poker> pokers) {
        this.id = id;
        this.name = name;
        this.socket = socket;
        this.pokers = pokers;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    public List<Poker> getPokers() {
        return pokers;
    }

    public void setPokers(List<Poker> pokers) {
        this.pokers = pokers;
    }
}

暂时效果:
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40469797/article/details/107662883