我正在使用客户端 - 服务器架构实现Java项目。当通过套接字连接时,我的客户端进入无限循环。
EDIT1:我已将我的客户端和服务器程序更改为最小,完整和可验证的代码。出现问题的原因是在同一输入和输出流上有多个消费者(如下面的答案所示)。
这是我的服务器代码:
import java.net.*;
import java.io.*;
class Demo {
int a;
String b;
Demo() {
a = 10;
b = "Sample";
}
}
class Streamsample {
private ServerSocket serverSocket = null;
DataInputStream dis = null;
DataOutputStream dos = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
Streamsample() {
try{
serverSocket = new ServerSocket(3000);
Socket s = serverSocket.accept();
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
ois = new ObjectInputStream(s.getInputStream());
oos = new ObjectOutputStream(s.getOutputStream());
System.out.println(dis.readUTF());
Demo d = (Demo)ois.readObject();
System.out.print(d.a + " " + d.b);
dis.close();
dos.close();
ois.close();
oos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Streamsample ss = new Streamsample();
}
}
这是我的客户端代码:
import java.net.*;
import java.io.*;
class Demo {
int a;
String b;
Demo() {
a = 10;
b = "Sample";
}
}
class Streamclient {
private Socket s = null;
DataInputStream dis = null;
DataOutputStream dos = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
Streamclient() {
try{
s = new Socket("localhost",3000);
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
ois = new ObjectInputStream(s.getInputStream());
oos = new ObjectOutputStream(s.getOutputStream());
dos.writeUTF("Hello");
Demo d = new Demo();
oos.writeObject(d);
dis.close();
dos.close();
ois.close();
oos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Streamclient ss = new Streamclient();
}
}
我正在实施的系统要求我的客户发送和接收objects
以及String
s,int
s等。我正在尝试使用DataInputStream
和DataOutputStream
用于String
s,int
s和ObjectInputStream
,ObjectOutputStream
用于object
s。我的程序进入无限循环。那么我应该使用ObjectStream's for passing
Strings,
ints as well and completely omit
DataStream或者是否有可用的解决方法允许两个Streams在同一个套接字上使用?
您正在使用相同的流两次 - 它无法按设计工作。每个流只能有一个消费者,例如:
TicketBooking.oos = new ObjectOutputStream(s.getOutputStream());
TicketBooking.ois = new ObjectInputStream(s.getInputStream());
为什么每个输入和输出流都需要两个消费者?