java 网络编程(网络编程作业-简单抢答器)

一、客户端项目结构。

java 网络编程(网络编程作业-简单抢答器)

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();

}

}

}

}

}


二、服务器项目结构。


java 网络编程(网络编程作业-简单抢答器)

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);

}

}


三:使用步骤。

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

四:运行结果。

java 网络编程(网络编程作业-简单抢答器)