Java套接字连接->;写入服务器时发生奇怪的崩溃
我最近制作了一个2D平台,并尝试实现一些在线2播放器功能。有一个服务器程序,当然还有客户端。它的工作原理是这样的:您的客户机可以在ID 1和ID 2之间进行选择,并且ID直接发送到服务器,因此服务器可以决定接收哪些数据以及将哪些数据发送回您(客户机1需要客户机2的坐标,例如) 现在的问题是,发送的数据以某种方式被操纵,并且存在错误的值。此外,如果我发送了一个真正的布尔值,我的客户机将在我发送布尔值的行中停止,并且不会继续运行代码 我在一个新的客户端程序中重新构建了“连接”方法,与gameclient的问题完全相同 谢谢你的建议!经过长时间的谷歌搜索,似乎没有人遇到同样的问题:-( 来自(重建的)客户端的代码: 所以你可以看到收到的每个值都是错误的,除了布尔值。现在,如果我进入我的客户机代码,将“攻击”布尔值设置为true,输出结果如下:Java套接字连接->;写入服务器时发生奇怪的崩溃,java,sockets,networking,server,Java,Sockets,Networking,Server,我最近制作了一个2D平台,并尝试实现一些在线2播放器功能。有一个服务器程序,当然还有客户端。它的工作原理是这样的:您的客户机可以在ID 1和ID 2之间进行选择,并且ID直接发送到服务器,因此服务器可以决定接收哪些数据以及将哪些数据发送回您(客户机1需要客户机2的坐标,例如) 现在的问题是,发送的数据以某种方式被操纵,并且存在错误的值。此外,如果我发送了一个真正的布尔值,我的客户机将在我发送布尔值的行中停止,并且不会继续运行代码 我在一个新的客户端程序中重新构建了“连接”方法,与gameclie
Connecting...
X: 5 / Y: 10 / Attacked: true /
因此,我假设代码只是停止了,而没有继续执行代码(这发生在我的客户身上,当时甚至停止了滴答声)
很抱歉发了这么长的帖子,我希望我的代码足以让你们检查一下!非常感谢!您忘记了在您的客户机
案例
和服务器中的案例3
和案例4
中的中断h处理布尔值的案例4
。
这可能不是奇怪数值的来源,但我很确定这是布尔错误的原因。
尝试添加所有的break
语句,这样它就不会在执行时执行一些意外的疯狂字节操作。首先:谢谢你的建议!现在甚至没有奇怪的值,服务器总是得到正确的值、坐标和布尔值!但是现在客户端不知怎么地不会收到数据!我猜是这样的t break;语句也会中断for循环,因此客户端不会读取所有数据。这里没有“崩溃”的证据。
package me.server.lel;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.net.SocketException;
import javax.swing.JFrame;
public class ServerThread extends Canvas implements Runnable {
Socket incoming; //the client socket so to say
public int id;
public int x1 = 0,y1 = 0,x2 = 0,y2 = 0;
public boolean attacked1 = false, attacked2 = false;
public ServerThread(Socket incoming, int id) {
this.incoming = incoming;
this.id = id;
}
@Override
public void run() {
try {
//Reading the input and saving it in global variables
DataInputStream in = new DataInputStream(incoming.getInputStream());
byte index;
int byteAmount = 4;
for(int i = 0; i < byteAmount; i++ ){
index = in.readByte();
switch(index) {
case 1:
id = in.readInt();
break;
case 2:
if(id == 1) {
x1 = in.readInt();
} else if(id == 2) {
x2 = in.readInt(); ;
}
break;
case 3:
if(id == 1) {
y1 = in.readInt();
} else if(id == 2) {
y2 = in.readInt();
}
case 4:
if(id == 1) {
attacked1 = in.readBoolean();
} else if(id == 2) {
attacked2 = in.readBoolean();
}
default:
}
}
//Writing back the values of the opposite player
DataOutputStream out = new DataOutputStream(incoming.getOutputStream());
if(id == 1) {
out.writeByte(1);
out.writeInt(x2);
out.flush();
out.writeByte(2);
out.writeInt(y2);
out.flush();
out.writeByte(3);
out.writeBoolean(attacked2);
out.flush();
} else if(id == 2) {
out.writeByte(1);
out.writeInt(x1);
out.flush();
out.writeByte(2);
out.writeInt(y1);
out.flush();
out.writeByte(3);
out.writeBoolean(attacked1);
out.flush();
}
} catch(SocketException e) {
System.out.println("User Disconnected: " + incoming.getLocalAddress());
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Connecting...
X: 5 / Y: 10 / Attacked: false /
RECEIVED:x: 0 / Y: 33554432 / rAttacked: false /
rAttacked: false /
Connecting...
X: 5 / Y: 10 / Attacked: true /