⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 一个JAVA的课程设计 希望对大家会有帮助
💻 JAVA
字号:

import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.util.*;
public class Server extends JFrame{

    private ServerSocket server;//服务器套接字
    private BManager bMan=new BManager();
    private Random rnd= new Random();
    private JTextArea jtaLog;
    private JScrollPane scrollPane;
    public Server()
    {
        jtaLog = new JTextArea();

        scrollPane = new JScrollPane(jtaLog);//滚屏效果
        getContentPane().add(scrollPane, BorderLayout.CENTER);//将组件添加到窗口容器中

        setSize(300, 250);
        setTitle("五子棋服务器端");
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    void startServer()//监听客户端连接
    {
        try{
            server=new ServerSocket(8888);//创建了一个服务器对象
            /*
             *它会实现一个服务器socket。
             * 一个服务器socket会等待来自客户端的连接。
             * 一旦它接收到一个连接请求,它就会创建一个Socket实例来处理和客户端通讯的问题。 
             */
            jtaLog.append("时间:"+new Date() +'\n'+ "服务器套接字已被创建 监听端口》》》》》 " + 8888+ '\n');
            while(true){
                Socket socket=server.accept();//创建一个Socket对象
                five_Thread thread=new five_Thread(socket);//建立一线程
                thread.start();//启动线程
                bMan.add(thread);//线程添加至BManager对象
                jtaLog.append("连接数: "+bMan.size()+ '\n');
            }
        }catch(Exception e){
            System.out.println(e); 
        }
    }
    public static void main(String[] args)
    {
        Server server=new Server();
        server.startServer();//启动监听
    }
    class five_Thread extends Thread
    {
        private int roomNumber=-1;
        private String userName=null;
        private Socket socket;
        private boolean ready=false;
        //定义输入流和输出流
        private BufferedReader reader;
        private PrintWriter writer;//将格式化对象打印到一个文本输出流
        five_Thread(Socket socket)
        {
            this.socket=socket;
        }
        Socket getSocket()
        {
            return socket; 
        }
        int getRoomNumber()
        {
            return roomNumber;
        }
        String getUserName()
        {
            return userName;
        }
        boolean isReady()
        {
            return ready; 
        }
        /*
         *服务器通过数据输入流从客户端接收信息,
         *并且通过数据输出流把相应的标记发送给客户端。
         *游戏局一旦建立起来,服务器便于工作交替地从客户端那里接收数据。
         */
        public void run()//处理与客户端连接的数据
        {
            try{
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                writer=new PrintWriter(socket.getOutputStream(), true);//将格式化对象打印到一个文本输出流
                String msg;
                while((msg=reader.readLine())!=null){
                    if(msg.startsWith("[NAME]")){
                        userName=msg.substring(6);
                    }   
                    else if(msg.startsWith("[ROOM]")){//客户端要求进入房间号
                        int roomNum=Integer.parseInt(msg.substring(6));
                        if( !bMan.isFull(roomNum))
                        {
                            if(roomNumber!=-1)
                                bMan.sendTthreadhreadhers(this, "[EXIT]"+userName);
                            roomNumber=roomNum;
                            writer.println(msg);
                            writer.println(bMan.getNamesInRoom(roomNumber));
                            bMan.sendTthreadhreadhers(this, "[ENTER]"+userName);
                        }    
                        else writer.println("[FULL]");
                    }
                    else if(roomNumber>=1 && msg.startsWith("[STONE]"))
                        bMan.sendTthreadhreadhers(this, msg);
                    else if(msg.startsWith("[MSG]"))
                    {
                        if(msg.subSequence(5,6).equals("a"))
                        {
                            bMan.sendToAll("["+userName+"]"+"对大家说:"+msg.substring(6));
                        }
                        else
                        {
                            bMan.sendToRoom(roomNumber, "["+userName+"]: "+msg.substring(5));
                        }


                        jtaLog.append(userName+"说:"+ msg.substring(5)+'\n');
                    }

                    else if(msg.startsWith("[START]"))
                    {
                        ready=true;
                        if(bMan.isReady(roomNumber))
                        {
                            int a=rnd.nextInt(2);//产生随机数,分配棋子
                            if(a==0)
                            {
                                writer.println("[COLOR]BLACK");
                                bMan.sendTthreadhreadhers(this, "[COLOR]WHITE");
                            }  
                            else
                            {
                                writer.println("[COLOR]WHITE");
                                bMan.sendTthreadhreadhers(this, "[COLOR]BLACK");
                            }
                        }  
                    }
                    else if(msg.startsWith("[STOPGAME]"))
                        ready=false;
                    else if(msg.startsWith("[DROPGAME]"))
                    {
                        ready=false;
                        bMan.sendTthreadhreadhers(this, "[DROPGAME]");
                    }
                    else if(msg.startsWith("[WIN]"))
                    {
                        ready=false;
                        writer.println("[WIN]");
                        bMan.sendTthreadhreadhers(this, "[LOSE]");
                    }
                }
            }catch(Exception e){}
            finally{
                try{
                    bMan.remove(this);
                    if(reader!=null) reader.close();
                    if(writer!=null) writer.close();
                    if(socket!=null) socket.close();
                    reader=null; writer=null; socket=null;
                    jtaLog.append(userName+"已断线."+ '\n');
                    jtaLog.append("连接人数: "+bMan.size()+ '\n');
                    bMan.sendToRoom(roomNumber,"[DISCONNECT]"+userName);
                }catch(Exception e){}
            }
        }
    }
    class BManager extends Vector
    {
        BManager(){}
        void add(five_Thread thread)
        {
            super.add(thread);
        }
        void remove(five_Thread thread)
        {
            super.remove(thread);
        }
        five_Thread getthread(int i)// 得到一个five_Thread对象
        {
            return (five_Thread)elementAt(i);
        }
        Socket getSocket(int i)//返回第I个socket
        {
            return getthread(i).getSocket();
        }
        void sendTo(int i, String msg){//向客户端发送消息
            try{
                PrintWriter pw= new PrintWriter(getSocket(i).getOutputStream(), true);
                pw.println(msg);
            }catch(Exception e){}  
        }
        int getRoomNumber(int i)//获得房间号
        {
            return getthread(i).getRoomNumber();
        }
        synchronized boolean isFull(int roomNum)//是否为满,大于两个人
        {
            if(roomNum==0)return false;
            int count=0;
            for(int i=0;i<size();i++)
                if(roomNum==getRoomNumber(i))count++;
            if(count>=2)return true;
            return false;
        }

        //群发消息
        void sendToAll(String msg)
        {
            for(int i=0;i<size();i++)
            {
                sendTo(i,msg);
            }
        }
        //发送聊天消息
        void sendToRoom(int roomNum, String msg)
        {
            for(int i=0;i<size();i++)
                if(roomNum==getRoomNumber(i))
                    sendTo(i, msg);
        }
        // 发送各种指令
        void sendTthreadhreadhers(five_Thread thread, String msg)
        {
            for(int i=0;i<size();i++)
                if(getRoomNumber(i)==thread.getRoomNumber() && getthread(i)!=thread)
                    sendTo(i, msg);
        }
        synchronized boolean isReady(int roomNum)//是否能开始游戏
        {
            int count=0;
            for(int i=0;i<size();i++)
                if(roomNum==getRoomNumber(i) && getthread(i).isReady())
                    count++;
            if(count==2)return true;
            return false;      
        }
        String getNamesInRoom(int roomNum)//得到房间内用户名
        {
            StringBuffer sb=new StringBuffer("[PLAYERS]");
            for(int i=0;i<size();i++)
                if(roomNum==getRoomNumber(i))
                    sb.append(getthread(i).getUserName()+"\t");
            return sb.toString();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -