我要编译两个文件:
Client.java
和
ClientHandler.java
。
我必须编译并在脚本中运行它们。这是我到目前为止编写的编译脚本:
del src\pack\*.class
set path="C:\Program Files\Java\jdk1.8.0_144\bin"
javac ClientHandler.java
javac Client.java
pause
Client
偶尔会创建ClientHandler
对象,并在命令行上引发错误。
C:\Users\maksg\Desktop\abc>set path="C:\Program Files\Java\jdk1.8.0_144\bin"
C:\Users\maksg\Desktop\abc>javac ClientHandler.java
C:\Users\maksg\Desktop\abc>javac Client.java
Client.java:44: error: cannot find symbol
Thread ch = new ClientHandler(s, din, dout, gracze);
^
symbol: class ClientHandler
1 error
C:\Users\maksg\Desktop\abc>pause
这是我运行程序的脚本:
set path="C:\Program Files\Java\jre1.8.0_144\bin"
start java Client gracz1 7000 7000 127.0.0.1
start java Client gracz2 6000 7000 127.0.0.1
start java Client gracz3 8000 6000 127.0.0.1
start java Client gracz4 9000 7000 127.0.0.1
但是,我什至无法检查正在运行的脚本是否正确,因为我无法编译这两个文件。
这是这两个类的源代码: 客户
package a;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class Client extends Thread{
static String nazwa;
static int portMoj;
static int portInnegoKlienta;
static String ip;
static HashMap<Integer, String> gracze;
static String liczbaPrzeciwnika;
static int portPrzeciwnika;
static Thread ch;
public Client(String[] args) {
gracze = new HashMap<>();
nazwa = args[0];
portMoj = Integer.parseInt(args[1]);
portInnegoKlienta = Integer.parseInt(args[2]);
ip = args[3];
}
public static void main(String[] args) {
new Client(args);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(portMoj);
while(true) {
Socket s = serverSocket.accept();
DataInputStream din = new DataInputStream(s.getInputStream());
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
Thread ch = new ClientHandler(s, din, dout, gracze);
ch.start();
}
}catch(Exception ex) {
System.out.println(ex);
ex.printStackTrace();
}
}
});
t.start();
try {
System.out.println("Uruchomiony Klient " + nazwa);
System.out.println("Moj port: " + args[1]);
System.out.println("Port klienta wpr.: " + args[2]);
gracze.put(Integer.parseInt(args[1]), nazwa);
Socket socket = null;
DataInputStream din = null;
DataOutputStream dout = null;
boolean skanuj=true;
while(skanuj){
try{
socket = new Socket(ip, portInnegoKlienta);
System.out.println("Nawiazywanie polaczenia z: " + portInnegoKlienta);
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
skanuj=false;
}
catch(Exception e){
System.out.println("Polaczenie nieudane, ponawiam polaczenie");
try{
Thread.sleep(2000);//co 2 sek
}
catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
System.out.println("Wysylam join do...: " + portInnegoKlienta);
dout.writeUTF("join " + nazwa + " " + portMoj+"");
dout.flush();
gracze.put(portMoj, nazwa);
socket = new Socket(ip, portInnegoKlienta);
System.out.println("Nawiazywanie polaczenia z: " + portInnegoKlienta);
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
Thread.sleep(1000);
String liczbaWylosowana = ((int)(Math.random()*10))+"";
String mojPortString = portMoj+"";
dout.writeUTF("game " + liczbaWylosowana + " " + mojPortString);
dout.flush();
socket = new Socket(ip, portInnegoKlienta);
System.out.println("Nawiazywanie polaczenia z: " + portInnegoKlienta);
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
Thread.sleep(1000);
} catch(Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}
和ClientHandler:
package a;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
class ClientHandler extends Thread{
DataInputStream din;
DataOutputStream dout;
Socket socket;
HashMap<Integer, String> gracze;
public ClientHandler(Socket socket, DataInputStream din, DataOutputStream dout, HashMap<Integer, String> gracze){
this.socket = socket;
this.din = din;
this.dout = dout;
this.gracze = gracze;
}
public void run() {
String[] komunikaty;
String msgin;
try {
msgin = din.readUTF();
komunikaty = msgin.split(" ");
if(komunikaty[0].equals("join")){
System.out.println("Uzyskalem komende join");
String nazwaPartnera = komunikaty[1];
String portPartnera = komunikaty[2];
System.out.println("Polaczyl sie ze mną: " + nazwaPartnera
+ ", na porcie: " + portPartnera);
gracze.put(Integer.parseInt(portPartnera), nazwaPartnera);
String wszyscyGracze = "aktywni ";
Set<Integer> set = gracze.keySet();
for(int i: set) {
wszyscyGracze += i + " " + gracze.get(i) + " ";
}
for(int i : set) {
Socket s = new Socket(socket.getInetAddress(), i);
dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF(wszyscyGracze);
dout.flush();
s.close();
}
}
if(komunikaty[0].equals("aktywni")) {
System.out.println("Uzyskalem komende aktywni");
System.out.println("Lista aktywnych graczy: ");
gracze.clear();
for(int i = 1; i < komunikaty.length-1; i+=2) {
gracze.put(Integer.parseInt(komunikaty[i]), komunikaty[i+1]);
}
Set<Integer> set = gracze.keySet();
for(int i : set) {
System.out.println(i + " " + gracze.get(i));
}
}
if(komunikaty[0].equals("game")) {
System.out.println("Uzyskalem komende game");
String liczbaGraczaWyzywajacego = komunikaty[1];
int portGraczaWyzywajacego = Integer.parseInt(komunikaty[2]);
String nazwaGraczaWyzywajacego = gracze.get(portGraczaWyzywajacego);
Set<Integer> set = gracze.keySet();
ArrayList<String> rezultatyMeczy = new ArrayList<>();
for(int i : set) {
Socket s = new Socket(socket.getInetAddress(), i);
dout = new DataOutputStream(s.getOutputStream());
if(!(i == portGraczaWyzywajacego)) {
int liczbaPrzeciwnika = (int)(Math.random()*10);
if(((Integer.parseInt(liczbaGraczaWyzywajacego)+liczbaPrzeciwnika)%2) == 0) {
rezultatyMeczy.add("Wygralem z " + gracze.get(i));
dout.writeUTF("challenged " + portGraczaWyzywajacego + " " + nazwaGraczaWyzywajacego + " 0");
dout.flush();
} else {
rezultatyMeczy.add("Przegralem z " + gracze.get(i));
dout.writeUTF("challenged " + portGraczaWyzywajacego + " " + nazwaGraczaWyzywajacego + " 1");
dout.flush();
}
}
s.close();
dout.close();
}
String wiadomoscZwrotnaDoWyzywajacego = "results ";
for(int i = 0; i < rezultatyMeczy.size(); ++i) {
wiadomoscZwrotnaDoWyzywajacego += rezultatyMeczy.get(i) + " ";
}
Socket zwrotny = new Socket(socket.getInetAddress(), portGraczaWyzywajacego);
dout = new DataOutputStream(zwrotny.getOutputStream());
dout.writeUTF(wiadomoscZwrotnaDoWyzywajacego);
dout.flush();
zwrotny.close();
dout.close();
}
if(komunikaty[0].equals("challenged")) {
System.out.println("Uzyskalem komende challenged");
System.out.println("Zostalem wyzwany przez: " + komunikaty[2]);
if(komunikaty[3].equals("0")) {
System.out.println("Przegralem");
} else {
System.out.println("Wygralem");
}
}
if(komunikaty[0].equals("results")) {
System.out.println("Uzyskalem komende results");
System.out.println("Moje mecze:");
for(int i = 1; i < komunikaty.length-1; i+=3) {
System.out.println(komunikaty[i] + " " + komunikaty[i+1] + " " + komunikaty[i+2] + " ");
}
}
socket.close();
din.close();
dout.close();
msgin = "";
komunikaty = null;
} catch (IOException e) {
//e.printStackTrace();
}
}
}
答案 0 :(得分:3)
好的,这些类在软件包中,但是您的命令行屏幕上并不指示您将它们放在与它们的软件包相对应的文件夹中。建议您不要从两个源文件中删除“ package”行,然后重试。
答案 1 :(得分:2)
您需要将两个文件都放在一个名为a
的目录中,以与软件包名称相匹配。
答案 2 :(得分:1)
好的,谢谢大家。我唯一要做的就是删除
package a;
在两个文件中的行。