网络Java从数据流切换到对象流
我正在开发一款4人网络扑克游戏。我首先创建一个运行游戏的游戏对象。它创建一个服务器对象。服务器对象产生4个线程,每个线程负责不同的socket连接。然后,游戏对象生成4个玩家对象。每个玩家对象都有关于玩家的数据,但现在我只存储他们的输入和输出对象。播放器对象分别创建一个OFCTable
,并向它们传递输入和输出连接信息。OFCTable
对象是我的客户机。它们连接到服务器并来回发送信息。当我使用DataInputObjects
/DataOutputObjects
时,这个例子是有效的,但现在我已经将它们切换到了ObjectInputObjects
/ObjectOutputObjects
,它产生了我的两个客户机(OFCTable
),然后抛出和AC异常。我知道我发送数据的方式有很多问题,我想在我能够发送对象之后解决这个问题。我已经尝试过在输入对象之前创建输出对象,但它给出了相同的错误。谢谢你的帮助
输出:
Starting server...
Connecting...
Server Started...
Connection successful
Connection from:/127.0.0.1
Connecting...
Connection successful
Connection from:/127.0.0.1
Connection from:/127.0.0.1
Connecting...
Connection successful
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.refill(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(Unknown Source)
at java.io.ObjectInputStream.readUTF(Unknown Source)
at OFCTable.run(OFCTable.java:785)
at java.lang.Thread.run(Unknown Source)
游戏课 公开课游戏{
public static void main(String[] args) throws Exception {
Server server = new Server();
Thread thread = new Thread(server);
thread.start();
Player[] Players = new Player[4];
for(int i=0; i<4; i++ )
Players[i] = new Player(i+1);
}
}
服务器类
public class Server implements Runnable{
static ServerSocket serverSocket;
static Socket socket;
static ObjectOutputStream out;
static ObjectInputStream in;
static Users[] user = new Users[4];
public Server() throws Exception{
}
public void run() {
System.out.println("Starting server...");
try {
serverSocket= new ServerSocket(7777);
System.out.println("Server Started...");
while(true){
socket = serverSocket.accept();
for(int i =0;i<4;i++){
System.out.println("Connection from:" +socket.getInetAddress());
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
if(user[i]==null){
user[i]=new Users(out,in,user,i+1);
Thread thread = new Thread(user[i]);
thread.start();
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Users implements Runnable{
static private Deck cards = new Deck();
ObjectOutputStream out;
ObjectInputStream in;
Users[] user = new Users[4];
int Player;
public Users(ObjectOutputStream out, ObjectInputStream in,Users[] user,int Player){
this.out = out;
this.in = in;
this.user = user;
this.Player = Player;
cards.Shuffle();
}
public void run(){
while(true){
try {
String message = in.readUTF();
switch (message) {
case "1":
message = in.readUTF();
for(int i=0;i<4;i++){
if(user[i]!=null){
user[i].out.writeUTF("View");
user[i].out.writeUTF(message);
}
}
cards.Draw();
message = cards.getCurrent().toString();
break;
case "2":
message = "updatenow";
break;
case "Player":
message = "Player";
in.readUTF();
message = "" + Player;
break;
case "CC":
message = "CC";
for(int i=0;i<4;i++){
if(user[i]!=null){
user[i].out.writeUTF(message);
}
}
message = cards.getCurrent().toString();
break;
default:
break;
}
for(int i=0;i<4;i++){
if(user[i]!=null){
user[i].out.writeUTF(message);
}
}
} catch (IOException e) {
e.printStackTrace();
this.in = null;
this.out = null;
}
}
}
}
球员级别
public class Player {
Deck deck = new Deck();
ObjectInputStream in;
ObjectOutputStream out;
Socket socket;
int Player=0;
public Player(int play) throws Exception{
this.Player = play;
System.out.println("Connecting...");
socket=new Socket("localhost",7777);
System.out.println("Connection successful");
//in = new ObjectInputStream(socket.getInputStream());
//out = new ObjectOutputStream(socket.getOutputStream());
OFCTable input = new OFCTable(socket,Player);
Thread thread = new Thread(input);
thread.start();
}
}
OFCTable类(缩短为仅列出需要知道的信息)
public class OFCTable extends javax.swing.JFrame implements MouseListener, Runnable {
ObjectInputStream in;
ObjectOutputStream out;
String message;
String CurrentCard;
private int Player = 0;
private int turn = 1;
public OFCTable(Socket soc,int play) throws IOException {
this.in = new ObjectInputStream(soc.getInputStream());
this.out = new ObjectOutputStream(soc.getOutputStream());
this.Player = play;
//this.ObjOut = out;
initComponents();
setVisible(true);
createComponentMap();
}
public OFCTable(ObjectInputStream in,ObjectOutputStream out,int play) {
System.out.println("here");
this.in = in;
this.out = out;
this.Player = play;
initComponents();
setVisible(true);
createComponentMap();
}
public void run() {
try {
out.writeUTF("CC");
} catch (IOException e1) {
e1.printStackTrace();
}
while(true){
try {
String message = in.readUTF();
switch (message) {
case "updatenow":
CurrentCard = message;
Update();
break;
case "View":
message = in.readUTF();
setComponentByName(message.split(" ")[1],message.split(" ")[0]);
message = in.readUTF();
CurrentCard = message;
turn = (turn + 1) % 5;
if (turn == 0) turn = 1;
Update();
break;
case "CC":
message = in.readUTF();
CurrentCard = message;
Update();
break;
case "Player":
message = in.readUTF();
CurrentCard = message;
Update();
break;
default:
CurrentCard = message;
Update();
break;
}
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}
共 (0) 个答案