Java 通过流为我的项目发送对象不是';t工作,插座闭合
服务器:Java 通过流为我的项目发送对象不是';t工作,插座闭合,java,networking,stream,Java,Networking,Stream,服务器: public Server() throws IOException { socket = new ServerSocket(PORT); while (true) { Socket client = socket.accept(); Spooker.get().getWindow().append(client.getInetAddress().getHostAddress() + " has connected.");
public Server() throws IOException {
socket = new ServerSocket(PORT);
while (true) {
Socket client = socket.accept();
Spooker.get().getWindow().append(client.getInetAddress().getHostAddress() + " has connected.");
if (inetAddrFound(client.getInetAddress().getHostName())) {
System.out.println("Address found.");
Thread thread = new Thread(new SpookerClient(client));
threads.put(client, thread);
thread.start();
}
}
}
private class SpookerClient implements Runnable {
Socket sock;
ObjectInputStream ois;
ObjectOutputStream oos;
public SpookerClient(Socket socket) {
System.out.println("Creating Spooker client.");
this.sock = socket;
try {
this.oos = new ObjectOutputStream(socket.getOutputStream());
oos.flush();
this.ois = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
Client client;
try {
Spooker.get().getWindow().append("Finding object.");
System.out.println("Finding object.");
while ((client = (Client) ois.readObject()) != null && !Thread.currentThread().isInterrupted()) {
System.out.println("Object found.");
Spooker.get().getWindow().append("Object found.");
if (keyFound(client.getKEY()) && idFound(client.getID())) {
Spooker.get().getWindow().append("Writing object.");
System.out.println("Writing object.");
oos = new ObjectOutputStream(sock.getOutputStream());
oos.writeObject(Spooker.get().getConfiguration());
oos.flush();
threads.remove(sock);
Thread.currentThread().interrupt();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户:
public ClientConnection() {
try {
socket = new Socket(decode(ADDR), Integer.parseInt(decode(PORT)));
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
oos.writeObject(new Client());
oos.flush();
oos.close();
Thread thread = new Thread(new IncomingSpookerConfiguration());
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private class IncomingSpookerConfiguration implements Runnable {
SpookerConfiguration configuration;
@Override
public void run() {
System.out.println("Trying..");
try {
while ((configuration = (SpookerConfiguration) ois.readObject()) != null && !Thread.currentThread().isInterrupted() && Spooker.get().getConfiguration() == null) {
System.out.println("Configuration loaded.");
Spooker.get().setConfiguration((SpookerConfiguration) ois.readObject());
Thread.currentThread().interrupt();
System.out.println(Spooker.get().getConfiguration().getX());
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
我得到的错误是套接字已关闭。我不明白为什么
我想做的就是这样
客户端向服务器发送一个包含唯一标识符(CPUID)的客户端类。服务器检查客户机是否已注册-例如,其cpuid是否在数据库中
如果cpuid在数据库上,服务器将发回一个“SpookerConfiguration”类,该类本质上是一个包含客户端用于创建GUI的值的类(例如大小、标题、默认关闭操作等)
我做错了什么
编辑:
服务器错误:
java.net.SocketException:
Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain
(ObjectOutputStream.java:1877)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode
(ObjectOutputStream.java:1786)
at java.io.ObjectOutputStream.writeFatalException
(ObjectOutputStream.java:1580)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:351)
at com.spooker.server.Server$SpookerClient.run(Server.java:65)
at java.lang.Thread.run(Thread.java:745)
socketclosed
表示您关闭了套接字,然后继续使用它。解决方法:不要readObject()
在流的末尾不返回null。它抛出EOFEException
。您的读取循环不正确请在你的帖子中包括完整的堆叠痕迹;首先,您要编写相当复杂、难以阅读的代码。它从以下内容开始:为什么要创建新的对象流;虽然您已经在类的ctor中创建了一些?为什么要将UI工作与此代码混合?问题是:您努力编写代码,擅长隐藏它真正在做什么。你现在希望其他人了解你的代码在做什么,这并不奇怪…@GhostCat我正在混合UI工作,这样人们就更难破解我的软件-这样,如果他们“删除”身份验证过程(连接到服务器),软件就不会有GUI值(字符串、整数、布尔值等)创造自己。“只是一个安全措施。”JimGarrison说。
java.net.SocketException:
Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain
(ObjectOutputStream.java:1877)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode
(ObjectOutputStream.java:1786)
at java.io.ObjectOutputStream.writeFatalException
(ObjectOutputStream.java:1580)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:351)
at com.spooker.server.Server$SpookerClient.run(Server.java:65)
at java.lang.Thread.run(Thread.java:745)