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();
}
}
}
}
}
二、服务器项目结构。
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”抢答。
- 答题。
四:运行结果。