我的服务器在线程中运行此代码,以便在我等待客户端连接时可以与GUI交互。(我目前只使用1个客户端和1个服务器。)
@Override
public void run() {
Socket client = null;
MessageListener listener = null;
try {
client = server.accept();
oos = new ObjectOutputStream(client.getOutputStream());
ois = new ObjectInputStream(client.getInputStream());
listener = new MessageListener(ois);
(new Thread(listener)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
我的客户端运行此代码一次以连接到服务器并修复输入/输出流:
try {
ois = new ObjectInputStream(server.getInputStream());
MessageListener listener = new MessageListener(ois);
oos = new ObjectOutputStream(server.getOutputStream());
(new Thread(listener)).start();
} catch (IOException e) {
e.printStackTrace();
}
MessageListener运行一个线程来检查是否有消息。
@Override
public void run() {
while (true) {
Message message = null;
try {
message = (Message) in.readObject();
if (message != null) {
System.out.println(message.getName());
}
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
然而,当我启动我的程序时,起初我只能从服务器发送到客户端而不是相反(我只是无法与客户端GUI交互)。 一旦我将第一条消息从服务器发送到客户端,我收到以下错误消息:
java.io.StreamCorruptedException: invalid type code: 6F
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.jale.chat.iohandling.MessageListener.run(MessageListener.java:25)
at java.lang.Thread.run(Unknown Source)
收到第一条错误消息后编辑,我只能从客户端发送到服务器(发送实际上有效),但错误消息不断向我的控制台发送垃圾邮件。
MessageListener的第25行:
message = (Message) in.readObject();
在google / Stack Overflow上没有找到任何内容,因为获得StreamCorruptedException
时的一般问题似乎是当人们为单个Socket打开多个InputStreams
或OutputStreams
时然而,我没有做。任何帮助将不胜感激。
答案 0 :(得分:1)
您正在构建ObjectOutputStreams
,然后将它们扔掉。它们应该像MessageListener
一样传递给ObjectInputStreams,
的构造函数,因此它有一些有效的每个客户端可以写入。您不可能像现在的代码一样正确地写入对等方。可能你正在某个地方重用ObjectOutputStream
错误的同伴。
您正在创建的ObjectInputStream
和ObjectOutputStream
变量应该是方法的本地变量,而不是周围类的成员。事实上,这些流应该在您即将开始的线程的run()
方法中构建,而不是在accept()
循环中内联。否则你可能会在错误的地方阻塞。并且ObjectOutputStream
应始终在ObjectInputStream
之前构建,以使死锁成为不可能。
答案 1 :(得分:1)
我认为您可能不止一次打开过输入/输出流。尝试检查connect-Function只被调用一次。
答案 2 :(得分:-1)
嗯,你必须为客户端/服务器端使用相同的类(带有id)。我将我的消息机制放入了在客户端/服务器项目中使用的库中。此外,如果我编译服务器/客户端,我会编译所有三个项目......也许这会有所帮助。