我的代码中的问题是减法和乘法不起作用,但加法工作正常...我至少得到一个结果,但是数字完全错误,因此将 3 个数字相乘得到 232。如果我更改运算符进行减法,结果是231。所以我猜它选择了错误的数字来计算? 我究竟做错了什么?或者是什么问题,为什么它不起作用?我尝试过调试,但它对我不起作用。
服务器:
public class server {
ServerSocket server = new ServerSocket(10);
server() throws IOException {
while ( true ) {
Socket client = server.accept();
InputStream input = client.getInputStream () ;
OutputStream output = client.getOutputStream () ;
int op = input.read();
int num1 = 0;
int num2 = 0;
int num3 = 0;
num1 = input.read();
num2 = input.read();
num3 = input.read();
switch(op) {
case 0:
output.write (num1 + num2 + num3);
break;
case 1:
output.write (num1 - num2 - num3);
break;
case 2:
output.write ((num1 * num2) * num3);
break;
}
output.flush();
input.close();
output.close();
}
}
public static void main (String[] args) {
try {
server server = new server() ;
} catch (IOException e) {
System.out.print(e);
}
}
}
客户代码:
public class Client {
Client() throws IOException {
Socket server = new Socket ("localhost", 10);
InputStream input = server.getInputStream();
OutputStream output = server.getOutputStream();
output.write(2);
output.write(5);
output.write(10);
output.write(20);
output.flush();
System.out.println(input.read());
server.close();
input.close();
output.close();
}
public static void main (String[] args) {
try {
Client client = new Client();
} catch (IOException e) {
System.out.print(e);
}
}
}
我认为使用 DataInputStream 和 DataOutputStream 类通过流写入 int、chars 和 Java 基本数据类型会有所帮助。
这是服务器的代码示例。
import java.net.*;
import java.io.*;
public class Server {
ServerSocket server = new ServerSocket(8080);
Server() throws IOException {
while (true) {
Socket client = server.accept();
DataInputStream input = new DataInputStream(new BufferedInputStream(client.getInputStream()));
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
int op = input.readInt();
int num1 = input.readInt();
int num2 = input.readInt();
int num3 = input.readInt();
switch (op) {
case 0:
output.writeInt(num1 + num2 + num3);
output.flush();
break;
case 1:
output.writeInt(num1 - num2 - num3);
output.flush();
break;
case 2:
output.writeInt(num1 * num2 * num3);
output.flush();
break;
}
input.close();
output.close();
client.close();
}
}
public static void main(String[] args) {
try {
Server server = new Server();
} catch (IOException e) {
System.out.print(e);
}
}
}
这是客户端的代码示例。
import java.net.*;
import java.io.*;
public class Client {
Client() throws IOException {
Socket socket = new Socket("localhost", 8080);
DataInputStream input = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
output.writeInt(1);
output.writeInt(5);
output.writeInt(10);
output.writeInt(20);
output.flush();
int response = input.readInt();
System.out.println(response);
input.close();
output.close();
socket.close();
}
public static void main(String[] args) {
try {
Client client = new Client();
} catch (IOException e) {
System.out.print(e);
}
}
}
现在我们可以将服务器作为后台进程运行,然后运行客户端。
% java Server.java &
% java Client.java
-25
您可以看到减法例程运行良好。
操作 5-10-20 返回 -25。
我认为 DataInputStream 和 DataOutputStream 类解决了很多可能发生但很难发现的问题。
例如,InputStream.read()方法无法读取负数,因为它返回0到255范围内的int。
https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read()
从输入流中读取下一个数据字节。值字节是 以 0 到 255 范围内的 int 形式返回。如果没有可用字节 因为已经到达流的末尾,所以值 -1 是 回。该方法会阻塞,直到输入数据可用为止, 检测到流,或者抛出异常。
这就是 DataInputStream 和 DataOutputStream 让跨流编写原语变得更容易的原因之一。
我使用示例中的代码测试了加法、减法和乘法例程。
该代码适用于所有三种情况。每个例程都会给出正确的结果。
OutputStream.write(int b)
和 InputStream.read()
发送/接收单个字节。一个字节只能保存 0 到 255 之间的值,而 5 * 10 * 20 = 1000。您必须将每个值作为几个字节发送。