Java InputDataStream 什么都不显示
Java InputDataStream shows nothing
Whosebug 社区,您好!现在我正在开发 2D 多人赛车游戏。我遇到的问题是,客户端将汽车详细信息发送到服务器,服务器成功读取它们并尝试将它们发回,但客户端无法读取。此外,客户端事件似乎没有 运行() 与 DataInputStream 的缺陷。谁能给我一些建议吗?
客户代码:
private Socket socket;
private int playerID;
private ReadFromServer rfsRunnable;
private WriteToServer wtsRunnable;
private void connectToServer(){
try{
socket = new Socket("localhost",5000);
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
playerID = in.readInt();
System.out.println("You are Player#" + playerID);
if (playerID==1){
System.out.println("Waiting for Player #2 to connect");
}
rfsRunnable = new ReadFromServer(in);
wtsRunnable = new WriteToServer(out);
rfsRunnable.waitForStartMessage();
}catch (IOException ex){
System.out.println("IOException from connect to server");
}
}
private class ReadFromServer implements Runnable{
private DataInputStream dataIn;
public ReadFromServer(DataInputStream in){
dataIn = in;
System.out.println("Read from server runnable");
}
public void run(){
try{
while (true){
if (foreignKart != null){
foreignKart.locationX=dataIn.readInt();
foreignKart.locationY=dataIn.readInt();
foreignKart.speed = dataIn.readInt();
foreignKart.currentImage = dataIn.readInt();
foreignKart.ready = dataIn.readBoolean();
System.out.println("test");
}
}
}catch (IOException ex){
System.out.println("IOException from RFS run");
}
}
public void waitForStartMessage(){
try{
String startMessage = dataIn.readUTF();
System.out.println("Message form server" + startMessage);
Thread readThread = new Thread(rfsRunnable);
Thread writeThread = new Thread(wtsRunnable);
readThread.start();
writeThread.start();
}catch (IOException ex){
System.out.println("IOException form waiting message");
}
}
}
private class WriteToServer implements Runnable{
private DataOutputStream dataOut;
public WriteToServer(DataOutputStream out){
dataOut = out;
System.out.println("Write to server runnable");
}
public void run(){
try{
while (true){
if (homeKart != null) {
dataOut.writeInt(homeKart.locationX);
dataOut.writeInt(homeKart.locationY);
dataOut.writeInt(homeKart.speed);
dataOut.writeInt(homeKart.currentImage);
dataOut.writeBoolean(homeKart.ready);
dataOut.flush();
}
try{
Thread.sleep(25);
}catch(InterruptedException ex){
System.out.println("Interrupted exception from WTS run");
}
}
} catch (IOException ex){
System.out.println("IOException from WTS run");
}
}
}
和服务器代码:
import java.io.*;
import java.net.*;
public class RaceServer {
private ServerSocket ss;
private int numberPlayers;
private int maxPlayers;
private Socket p1Socket;
private Socket p2Socket;
private ReadFromClient p1ReadRunnable;
private ReadFromClient p2ReadRunnable;
private WriteToClient p1WriteRunnable;
private WriteToClient p2WriteRunnable;
private int pl1X, pl1Y, pl1speed, pl1currentImage;
private int pl2X, pl2Y, pl2speed, pl2currentImage;
private boolean ready1, ready2;
public RaceServer() {
System.out.println("------RACE GAME SERVER-----");
numberPlayers = 0;
maxPlayers = 2;
pl1X = 425;
pl1Y = 550;
pl1speed = 0;
pl1currentImage = 12;
ready1 = false;
pl2X = 425;
pl2Y = 500;
pl2speed = 0;
pl2currentImage = 12;
ready2 = false;
try {
ss = new ServerSocket(5000);
} catch (IOException ex) {
System.out.println("IOException from Race Server Constructor");
}
}
private class ReadFromClient implements Runnable {
private int playerID;
private DataInputStream dataIn;
public ReadFromClient(int pid, DataInputStream in){
playerID = pid;
dataIn = in;
System.out.println("Read From Client" + playerID + " Runnable created");
}
public void run(){
try{
while(true){
if (playerID == 1){
pl1X = dataIn.readInt();
pl1Y = dataIn.readInt();
pl1speed = dataIn.readInt();
pl1currentImage = dataIn.readInt();
ready1 = dataIn.readBoolean();
} else {
pl2X = dataIn.readInt();
pl2Y = dataIn.readInt();
pl2speed = dataIn.readInt();
pl2currentImage = dataIn.readInt();
ready2 = dataIn.readBoolean();
}
System.out.println("Player 1,IN X: "+pl1X);
System.out.println("Player 2,IN X: "+pl2X);
}
}catch (IOException ex){
System.out.println("Exception from RFC run");
}
}
}
private class WriteToClient implements Runnable {
private int playerID;
private DataOutputStream dataOut;
public WriteToClient(int pid, DataOutputStream out){
playerID = pid;
dataOut = out;
System.out.println("Write to client " + playerID + " Runnable created");
}
public void run(){
try{
while(true){
if (playerID == 1){
dataOut.writeInt(pl2X);
dataOut.writeInt(pl2Y);
dataOut.writeInt(pl2speed);
dataOut.writeInt(pl2currentImage);
dataOut.writeBoolean(ready2);
} else {
dataOut.writeInt(pl1X);
dataOut.writeInt(pl1Y);
dataOut.writeInt(pl1speed);
dataOut.writeInt(pl1currentImage);
dataOut.writeBoolean(ready1);
}
dataOut.flush();
try {
Thread.sleep(25);
} catch (InterruptedException ex){
System.out.println("InterruptedException from WTC run");
}
System.out.println("Player 1, OUT X: "+pl1X);
System.out.println("Player 2, OUT X: "+pl2X);
}
}catch (IOException ex){
System.out.println("IOException from WTC run");
}
}
public void sendStartMessage(){
try{
dataOut.writeUTF("We now have two players");
}catch (IOException ex){
System.out.println("IOException from sendStartMessage");
}
}
}
public void acceptConnections(){
try{
System.out.println("Waiting for connections");
while (numberPlayers < maxPlayers){
Socket s = ss.accept();
DataInputStream in = new DataInputStream(s.getInputStream());
DataOutputStream out = new DataOutputStream(s.getOutputStream());
numberPlayers++;
out.writeInt(numberPlayers);
System.out.println("Player #" + numberPlayers + " has connected");
ReadFromClient rfc = new ReadFromClient(numberPlayers, in);
WriteToClient wtc = new WriteToClient(numberPlayers, out);
if (numberPlayers == 1){
p1Socket = s;
p1ReadRunnable = rfc;
p1WriteRunnable = wtc;
} else {
p2Socket = s;
p2ReadRunnable = rfc;
p2WriteRunnable = wtc;
p1WriteRunnable.sendStartMessage();
p2WriteRunnable.sendStartMessage();
Thread readThread1 = new Thread(p1ReadRunnable);
Thread readThread2 = new Thread(p2ReadRunnable);
readThread1.start();
readThread2.start();
Thread writeThread1 = new Thread(p1WriteRunnable);
Thread writeThread2 = new Thread(p2WriteRunnable);
writeThread1.start();
writeThread2.start();
}
}
System.out.println("No longer accepting connections");
}catch (IOException ex){
System.out.println("IOException from Accept Connections");
}
}
public static void main(String[] args){
RaceServer rs = new RaceServer();
rs.acceptConnections();
}
}
rfsRunnable = new ReadFromServer(in);
线程并不神奇。这没有任何作用。
您要找的是:
Thread readThread = new Thread(new ReadFromServer(in));
readThread.start();
start()
方法启动一个线程。该线程一旦启动,就会在提供的 Runnable 的 运行() 方法处开始执行。
Whosebug 社区,您好!现在我正在开发 2D 多人赛车游戏。我遇到的问题是,客户端将汽车详细信息发送到服务器,服务器成功读取它们并尝试将它们发回,但客户端无法读取。此外,客户端事件似乎没有 运行() 与 DataInputStream 的缺陷。谁能给我一些建议吗?
客户代码:
private Socket socket;
private int playerID;
private ReadFromServer rfsRunnable;
private WriteToServer wtsRunnable;
private void connectToServer(){
try{
socket = new Socket("localhost",5000);
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
playerID = in.readInt();
System.out.println("You are Player#" + playerID);
if (playerID==1){
System.out.println("Waiting for Player #2 to connect");
}
rfsRunnable = new ReadFromServer(in);
wtsRunnable = new WriteToServer(out);
rfsRunnable.waitForStartMessage();
}catch (IOException ex){
System.out.println("IOException from connect to server");
}
}
private class ReadFromServer implements Runnable{
private DataInputStream dataIn;
public ReadFromServer(DataInputStream in){
dataIn = in;
System.out.println("Read from server runnable");
}
public void run(){
try{
while (true){
if (foreignKart != null){
foreignKart.locationX=dataIn.readInt();
foreignKart.locationY=dataIn.readInt();
foreignKart.speed = dataIn.readInt();
foreignKart.currentImage = dataIn.readInt();
foreignKart.ready = dataIn.readBoolean();
System.out.println("test");
}
}
}catch (IOException ex){
System.out.println("IOException from RFS run");
}
}
public void waitForStartMessage(){
try{
String startMessage = dataIn.readUTF();
System.out.println("Message form server" + startMessage);
Thread readThread = new Thread(rfsRunnable);
Thread writeThread = new Thread(wtsRunnable);
readThread.start();
writeThread.start();
}catch (IOException ex){
System.out.println("IOException form waiting message");
}
}
}
private class WriteToServer implements Runnable{
private DataOutputStream dataOut;
public WriteToServer(DataOutputStream out){
dataOut = out;
System.out.println("Write to server runnable");
}
public void run(){
try{
while (true){
if (homeKart != null) {
dataOut.writeInt(homeKart.locationX);
dataOut.writeInt(homeKart.locationY);
dataOut.writeInt(homeKart.speed);
dataOut.writeInt(homeKart.currentImage);
dataOut.writeBoolean(homeKart.ready);
dataOut.flush();
}
try{
Thread.sleep(25);
}catch(InterruptedException ex){
System.out.println("Interrupted exception from WTS run");
}
}
} catch (IOException ex){
System.out.println("IOException from WTS run");
}
}
}
和服务器代码:
import java.io.*;
import java.net.*;
public class RaceServer {
private ServerSocket ss;
private int numberPlayers;
private int maxPlayers;
private Socket p1Socket;
private Socket p2Socket;
private ReadFromClient p1ReadRunnable;
private ReadFromClient p2ReadRunnable;
private WriteToClient p1WriteRunnable;
private WriteToClient p2WriteRunnable;
private int pl1X, pl1Y, pl1speed, pl1currentImage;
private int pl2X, pl2Y, pl2speed, pl2currentImage;
private boolean ready1, ready2;
public RaceServer() {
System.out.println("------RACE GAME SERVER-----");
numberPlayers = 0;
maxPlayers = 2;
pl1X = 425;
pl1Y = 550;
pl1speed = 0;
pl1currentImage = 12;
ready1 = false;
pl2X = 425;
pl2Y = 500;
pl2speed = 0;
pl2currentImage = 12;
ready2 = false;
try {
ss = new ServerSocket(5000);
} catch (IOException ex) {
System.out.println("IOException from Race Server Constructor");
}
}
private class ReadFromClient implements Runnable {
private int playerID;
private DataInputStream dataIn;
public ReadFromClient(int pid, DataInputStream in){
playerID = pid;
dataIn = in;
System.out.println("Read From Client" + playerID + " Runnable created");
}
public void run(){
try{
while(true){
if (playerID == 1){
pl1X = dataIn.readInt();
pl1Y = dataIn.readInt();
pl1speed = dataIn.readInt();
pl1currentImage = dataIn.readInt();
ready1 = dataIn.readBoolean();
} else {
pl2X = dataIn.readInt();
pl2Y = dataIn.readInt();
pl2speed = dataIn.readInt();
pl2currentImage = dataIn.readInt();
ready2 = dataIn.readBoolean();
}
System.out.println("Player 1,IN X: "+pl1X);
System.out.println("Player 2,IN X: "+pl2X);
}
}catch (IOException ex){
System.out.println("Exception from RFC run");
}
}
}
private class WriteToClient implements Runnable {
private int playerID;
private DataOutputStream dataOut;
public WriteToClient(int pid, DataOutputStream out){
playerID = pid;
dataOut = out;
System.out.println("Write to client " + playerID + " Runnable created");
}
public void run(){
try{
while(true){
if (playerID == 1){
dataOut.writeInt(pl2X);
dataOut.writeInt(pl2Y);
dataOut.writeInt(pl2speed);
dataOut.writeInt(pl2currentImage);
dataOut.writeBoolean(ready2);
} else {
dataOut.writeInt(pl1X);
dataOut.writeInt(pl1Y);
dataOut.writeInt(pl1speed);
dataOut.writeInt(pl1currentImage);
dataOut.writeBoolean(ready1);
}
dataOut.flush();
try {
Thread.sleep(25);
} catch (InterruptedException ex){
System.out.println("InterruptedException from WTC run");
}
System.out.println("Player 1, OUT X: "+pl1X);
System.out.println("Player 2, OUT X: "+pl2X);
}
}catch (IOException ex){
System.out.println("IOException from WTC run");
}
}
public void sendStartMessage(){
try{
dataOut.writeUTF("We now have two players");
}catch (IOException ex){
System.out.println("IOException from sendStartMessage");
}
}
}
public void acceptConnections(){
try{
System.out.println("Waiting for connections");
while (numberPlayers < maxPlayers){
Socket s = ss.accept();
DataInputStream in = new DataInputStream(s.getInputStream());
DataOutputStream out = new DataOutputStream(s.getOutputStream());
numberPlayers++;
out.writeInt(numberPlayers);
System.out.println("Player #" + numberPlayers + " has connected");
ReadFromClient rfc = new ReadFromClient(numberPlayers, in);
WriteToClient wtc = new WriteToClient(numberPlayers, out);
if (numberPlayers == 1){
p1Socket = s;
p1ReadRunnable = rfc;
p1WriteRunnable = wtc;
} else {
p2Socket = s;
p2ReadRunnable = rfc;
p2WriteRunnable = wtc;
p1WriteRunnable.sendStartMessage();
p2WriteRunnable.sendStartMessage();
Thread readThread1 = new Thread(p1ReadRunnable);
Thread readThread2 = new Thread(p2ReadRunnable);
readThread1.start();
readThread2.start();
Thread writeThread1 = new Thread(p1WriteRunnable);
Thread writeThread2 = new Thread(p2WriteRunnable);
writeThread1.start();
writeThread2.start();
}
}
System.out.println("No longer accepting connections");
}catch (IOException ex){
System.out.println("IOException from Accept Connections");
}
}
public static void main(String[] args){
RaceServer rs = new RaceServer();
rs.acceptConnections();
}
}
rfsRunnable = new ReadFromServer(in);
线程并不神奇。这没有任何作用。
您要找的是:
Thread readThread = new Thread(new ReadFromServer(in));
readThread.start();
start()
方法启动一个线程。该线程一旦启动,就会在提供的 Runnable 的 运行() 方法处开始执行。