A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

一、客户端项目结构。


1.1 Client.java

package com.jcj.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
        private Socket socket;
        private BufferedReader bis;
        private PrintWriter bos;

        public static void main(String[] args) {
                new Client().connect();
        }
        public void connect() {
                try {
                        socket = new Socket("127.0.0.1", 55533);
                        bos = new PrintWriter((socket.getOutputStream()));
                        bis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        new SendThread(socket, bos).start();
                        new GetThread(bis, socket).start();

                } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}

1.2 GetThread.java

package com.jcj.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;

public class GetThread extends Thread {

        private Socket socket;
        private BufferedReader br;
        String str="";
        public GetThread(BufferedReader br, Socket socket) {
                this.socket = socket;
                this.br = br;
        }
        public void run() {
                while(true){
                        str="";
                        try {
                                str=br.readLine().toString();
                                if(str.length()>0)
                                System.out.println(str);
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }
        }

}


1.3 SendThread.java


package com.jcj.client;



import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;



public class SendThread extends Thread {



        private Socket socket;

        private PrintWriter pw;

        private Scanner s = new Scanner(System.in);

        private String str = "";


        public SendThread(Socket socket, PrintWriter bw) {

                this.socket = socket;

                this.pw = bw;

        }

        public void run() {

                while (true) {

                        str = "";

                        while (s.hasNext()) {

                                str = s.nextLine();

                                if (str.equals("q")) {

                                        pw.println("xian");

                                        pw.flush();

                                } else {

                                        pw.println(str);

                                        pw.flush();

                                }

                        }

                }

        }


}

二、服务器项目结构。






2.1  ClientThread .java



package com.jcj.server;





import java.io.BufferedReader;


import java.io.IOException;


import java.io.InputStreamReader;


import java.io.OutputStreamWriter;


import java.io.PrintWriter;


import java.net.Socket;


import java.util.ArrayList;


import java.util.Scanner;





public class ClientThread extends Thread {


        private Socket socket;


        private int id;


        private BufferedReader bis;


        private PrintWriter bos;


        private String line;


        public static boolean flag = true;


        public static int QId = 0;





        public ClientThread(Socket socket, int i) {


                this.socket = socket;


                this.id = i;


        }





        public void send(String line) {


                try {


                        bos = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));


                        bos.println(line);


                        bos.flush();


                        System.out.println("正在向客户端写消息成功!");


                } catch (IOException e) {


                        e.printStackTrace();


                }


        }





        public void run() {


                System.out.println("run方法启动了!");


                try {


                        while (true) {


                                line = "";


                                bis = new BufferedReader(new InputStreamReader(socket.getInputStream()));


                                line = bis.readLine();


                                System.out.println("接收到消息");


                                int size = Server.clients.size();


                                if (line.equals("xian") && flag) {


                                        flag = false;


                                        QId = id;


                                        for (int i = 0; i < size; i++) {


                                                ClientThread c = Server.clients.get(i);


                                                if (i == id - 1) {


                                                        c.send("你抢到题!请回答!");


                                                } else {


                                                        c.send("第" + id + "号:抢到!请他答题!");


                                                }


                                        }


                                        new Thread(new Runnable() {


                                                @Override


                                                public void run() {


                                                        try {


                                                                Thread.sleep(10000);


                                                                if (!flag) {


                                                                        for (int i = 0; i < size; i++) {


                                                                                ClientThread c = Server.clients.get(i);


                                                                                c.send("超时,此题无效!下一题即将开始!");


                                                                                flag = true;


                                                                        }


                                                                }


                                                        } catch (InterruptedException e) {


                                                                // TODO Auto-generated catch block


                                                                e.printStackTrace();


                                                        }


                                                }


                                        }).start();





                                } else if (id == QId) {// 判断对错


                                        flag = true;


                                        ClientThread c;


                                        System.out.print("line:" + line);


                                        System.out.print("getAAnsers:" + ThreadHelper.getAAnsers());


                                        if (line.equals(ThreadHelper.getAAnsers())) {





                                                for (int i = 0; i < size; i++) {


                                                        c = Server.clients.get(i);


                                                        if (i == id - 1) {


                                                                c.send("恭喜你答对了!");


                                                        } else {


                                                                c.send("恭喜他" + id + "答对了!");


                                                        }


                                                }


                                        } else {


                                                for (int i = 0; i < size; i++) {


                                                        c = Server.clients.get(i);


                                                        c.send("打错了!此题作废!");


                                                }


                                        }


                                }


                        }


                } catch (IOException e) {


                        // TODO Auto-generated catch block


                        e.printStackTrace();


                }


        }



}



2.2  Server .java




package com.jcj.server;







import java.io.IOException;



import java.net.ServerSocket;



import java.net.Socket;



import java.util.ArrayList;



import java.util.List;







public class Server {







        static List<ClientThread> clients = new ArrayList<ClientThread>();



        private ThreadHelper threadHelper;







        public static void main(String[] args) {



                new Server().initia();



        }







        public void initia() {







                try {



                        ServerSocket serversocket = new ServerSocket(55533);



                        threadHelper = new ThreadHelper();



                        threadHelper.start();



                        while (true) {



                                Socket socket = serversocket.accept();



                                System.out.println("有外部客户端接入");



                                ClientThread currentClient = new ClientThread(socket, clients.size() + 1);



                                clients.add(currentClient);



                                currentClient.start();



                                System.out.println("客户端线程开始");



                        }



                } catch (IOException e) {



                        // TODO Auto-generated catch block



                        e.printStackTrace();



                }



        }




}




2.3  ThreadHelper .java





package com.jcj.server;









import java.util.ArrayList;




import java.util.List;




import java.util.Scanner;









public class ThreadHelper extends Thread {









        private Scanner scanner = new Scanner(System.in);




        private List<String> probles = new ArrayList();




        public static List<String> ansers = new ArrayList();




        public static int tempIndex = 0;




        private int flag = 0;









        public void run() {




                probles.add("1+1=?");




                probles.add("1+2=?");




                ansers.add("2");




                ansers.add("3");




                int size;




                while (true) {




                        while (scanner.hasNext()) {




                                flag = scanner.nextInt();




                                size = Server.clients.size();




                                if (flag != 0) {




                                        for (int i = 0; i < size; i++) {




                                                Server.clients.get(i).send(probles.get(tempIndex));




                                                ;




                                        }




                                        flag = 0;




                                        tempIndex++;




                                        System.out.print("已经发送完" + size + "条数据!");




                                        if (tempIndex == probles.size()) {




                                                System.out.println("所有的题都已经发送!");




                                        }




                                }




                        }




                }




        }




        public static String getAAnsers() {




                return ansers.get(tempIndex - 1);




        }




}

三:使用步骤。


  • 启动服务器,然后打开n个客户端。
  • 服务器输入任意非零数字,发送题目到客户端。
  • 客户端输入字符“q”抢答。
  • 答题。

四:运行结果。



【转载】原文博客地址:https://blog.csdn.net/qq_34467922/article/details/80790562


3 个回复

倒序浏览
回复 使用道具 举报
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马