我正在创建一个需要在网络上的多台计算机之间来回传输数据的应用程序。由于数据的发送方式,客户端计算机将运行套接字服务器,协调计算机将运行客户端套接字。
我创建了简单的类,这些类只是为了封装读取和写入这些套接字。但是,接收套接字不会输出任何内容,而是输出任何内容。我已确认客户端和服务器都有连接。
在以下Server
和Client
类中,Socket
仅用于调试目的。
public class Server {
public Socket client;
private DataInputStream inStr;
private PrintStream outStr;
public Server() throws UnknownHostException, IOException {this("localhost");}
public Server(String hostname) throws UnknownHostException, IOException {
client = new Socket(hostname, 23);
inStr = new DataInputStream(client.getInputStream());
outStr = new PrintStream(client.getOutputStream());
}
public void send(String data) {outStr.print(data); outStr.flush();}
public String recv() throws IOException {return inStr.readUTF();}
}
以下是我的Client
:
public class Client {
private ServerSocket serv;
public Socket servSock;
private DataInputStream inStr;
private PrintStream outStr;
public Client() throws IOException {
serv = new ServerSocket(23);
servSock = serv.accept();
inStr = new DataInputStream(servSock.getInputStream());
outStr = new PrintStream(servSock.getOutputStream());
}
public void send(String data) {outStr.print(data); outStr.flush();}
public String recv() throws IOException {return inStr.readUTF();}
}
实例化Client类,程序启动。然后,在一个单独的程序中,实例化并启动服务器:
Server s = new Server(); System.out.println(s.client.isConnected());
while(true) {System.out.println(s.recv()); Thread.sleep(200);}
Client c = new Client(); System.out.println(c.servSock.isConnected());
while(true) {c.send("Hello World!"); Thread.sleep(200);}
isConnected()
为客户端和服务器返回true
。
可能导致这种情况的原因是什么?我以前从未使用套接字。
答案 0 :(得分:2)
DataInputStream.readUTF()
期望前两个字节是要读取的字节数,但PrintStream.print(String)
会将字符串转换为字节并按原样写入。
DataOutputStream.writeUTF(String)
会写出readUTF()
期望的长度。