Java client/server 计算器不工作
Java client/server calculator not working
我正在尝试使用套接字创建一个简单的计算器,但是当我向服务器发送数字时遇到问题:例如,如果我想添加 2 个数字 x=13 和 y=2,服务器接收到 x= 64 和 y=42,结果是 106。我认为问题出在 write 方法上,我对字符串没有问题,但对数字我不知道如何工作。我是初学者,谢谢帮助。
服务器
package calcolatrice;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
ServerSocket server;
Socket msocket;
BufferedReader in;
DataOutputStream out;
public Socket attendi() {
try {
//creo il server sulla porta ****
System.out.println("Server in esecuzione..");
server = new ServerSocket(1122);
//accetto eventuale connessione da parte del client
msocket = server.accept();
System.out.println("Client connesso con successo! ");
//chiudo la connessione per evitare altre connessioni
server.close();
//inizializzo gli stream per consentire la comunicazione
out = new DataOutputStream(msocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(msocket.getInputStream()));
} catch (IOException e) {
System.out.println(e.getMessage());
System.out.println("Errore durante l'istanza del server");
System.exit(1);
}
return msocket;
}
public void calcola(){
try{
double x;
double y;
double risultato=0;
//leggo la scelta e in base a quella eseguo le operazioni
int scelta = in.read();
//accetto prima i numeri
x = in.read();
System.out.println("x "+x);
y = in.read();
System.out.println("y "+y);
switch (scelta){
case 1:
System.out.println("Scelta: "+scelta);
//somma
risultato = x+y;
}
System.out.println("Risultato: "+risultato);
}catch (Exception e){
}
}
public static void main(String args[]) {
Server myServer = new Server();
myServer.attendi();
myServer.calcola();
}
}
客户
package calcolatrice;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client{
Socket socket;
protected int porta = 1122;
String nomeServer = "localhost";
//stream per comunicare
DataOutputStream out;
BufferedReader in;
Scanner input = new Scanner(System.in);
public Socket connetti(){
try {
System.out.println("Client avviato..");
//creo il socket per connettermi al server
socket = new Socket(nomeServer, porta);
System.out.println("Client connesso con successo al server ' "+nomeServer+" ' sulla porta: "+porta);
//inizializzo gli stream per consentire la comunicazione
out = new DataOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (Exception e){
System.out.println("Errore, impossibile connettersi");
System.exit(1);
}
return socket;
}
//menu per scelta operazioni
private void menu(){
try{
System.out.println("---Calcolatrice---");
System.out.println("[1.Somma \t 2.Differenza \t 3.Moltiplicazione \t 4.Divisione]");
System.out.println("0.ESCI");
} catch (Exception e){
System.out.println("Errore");
}
}
//funzione per comunicare
public void comunica(){
try {
int scelta=0;
//do{
menu();
System.out.println("Inserire operazione ");
scelta = input.nextInt();
//invio la scelta al server
//out.writeByte(scelta);
out.write(scelta);
//Inserisco i numeri e li spedisco al server
System.out.println("Inserisci primo numero.");
double x = input.nextDouble();
out.writeDouble(x);
System.out.println("Inserisci secondo numero.");
double y = input.nextDouble();
out.writeDouble(y);
//}
//while(scelta != 0);
}catch (IOException e){
}
}
public static void main(String args[]){
Client myClient = new Client();
myClient.connetti();
myClient.comunica();
}
}
我通过删除 DataOutputStream 对象 (out) 使其工作,然后我将以下行添加到 comunica() 方法:
System.out.println(x + "," + y);
重新运行你的代码我得到了输出:
Client avviato..
Client connesso con successo al server ' localhost ' sulla porta: 1122
---Calcolatrice---
[1.Somma 2.Differenza 3.Moltiplicazione 4.Divisione]
0.ESCI
Inserire operazione
1
Inserisci primo numero.
2
Inserisci secondo numero.
3
2.0,3.0
您的代码读取数字正常。
原始代码使用了 BufferedReader
,我认为这可能是问题的原因。如果将其替换为 DataInputStream
,您将能够调用 readInt()
和 readDouble()
方法。
将 BufferedReader in;
替换为 DataInputStream in;
。它可以使用与现有代码类似的方式构造:
in = new DataInputStream(msocket.getInputStream());
然后根据需要将对 in.read()
的所有调用替换为 in.readInt()
或 in.readDouble()
。
我正在尝试使用套接字创建一个简单的计算器,但是当我向服务器发送数字时遇到问题:例如,如果我想添加 2 个数字 x=13 和 y=2,服务器接收到 x= 64 和 y=42,结果是 106。我认为问题出在 write 方法上,我对字符串没有问题,但对数字我不知道如何工作。我是初学者,谢谢帮助。
服务器
package calcolatrice;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
ServerSocket server;
Socket msocket;
BufferedReader in;
DataOutputStream out;
public Socket attendi() {
try {
//creo il server sulla porta ****
System.out.println("Server in esecuzione..");
server = new ServerSocket(1122);
//accetto eventuale connessione da parte del client
msocket = server.accept();
System.out.println("Client connesso con successo! ");
//chiudo la connessione per evitare altre connessioni
server.close();
//inizializzo gli stream per consentire la comunicazione
out = new DataOutputStream(msocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(msocket.getInputStream()));
} catch (IOException e) {
System.out.println(e.getMessage());
System.out.println("Errore durante l'istanza del server");
System.exit(1);
}
return msocket;
}
public void calcola(){
try{
double x;
double y;
double risultato=0;
//leggo la scelta e in base a quella eseguo le operazioni
int scelta = in.read();
//accetto prima i numeri
x = in.read();
System.out.println("x "+x);
y = in.read();
System.out.println("y "+y);
switch (scelta){
case 1:
System.out.println("Scelta: "+scelta);
//somma
risultato = x+y;
}
System.out.println("Risultato: "+risultato);
}catch (Exception e){
}
}
public static void main(String args[]) {
Server myServer = new Server();
myServer.attendi();
myServer.calcola();
}
}
客户
package calcolatrice;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client{
Socket socket;
protected int porta = 1122;
String nomeServer = "localhost";
//stream per comunicare
DataOutputStream out;
BufferedReader in;
Scanner input = new Scanner(System.in);
public Socket connetti(){
try {
System.out.println("Client avviato..");
//creo il socket per connettermi al server
socket = new Socket(nomeServer, porta);
System.out.println("Client connesso con successo al server ' "+nomeServer+" ' sulla porta: "+porta);
//inizializzo gli stream per consentire la comunicazione
out = new DataOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (Exception e){
System.out.println("Errore, impossibile connettersi");
System.exit(1);
}
return socket;
}
//menu per scelta operazioni
private void menu(){
try{
System.out.println("---Calcolatrice---");
System.out.println("[1.Somma \t 2.Differenza \t 3.Moltiplicazione \t 4.Divisione]");
System.out.println("0.ESCI");
} catch (Exception e){
System.out.println("Errore");
}
}
//funzione per comunicare
public void comunica(){
try {
int scelta=0;
//do{
menu();
System.out.println("Inserire operazione ");
scelta = input.nextInt();
//invio la scelta al server
//out.writeByte(scelta);
out.write(scelta);
//Inserisco i numeri e li spedisco al server
System.out.println("Inserisci primo numero.");
double x = input.nextDouble();
out.writeDouble(x);
System.out.println("Inserisci secondo numero.");
double y = input.nextDouble();
out.writeDouble(y);
//}
//while(scelta != 0);
}catch (IOException e){
}
}
public static void main(String args[]){
Client myClient = new Client();
myClient.connetti();
myClient.comunica();
}
}
我通过删除 DataOutputStream 对象 (out) 使其工作,然后我将以下行添加到 comunica() 方法:
System.out.println(x + "," + y);
重新运行你的代码我得到了输出:
Client avviato..
Client connesso con successo al server ' localhost ' sulla porta: 1122
---Calcolatrice---
[1.Somma 2.Differenza 3.Moltiplicazione 4.Divisione] 0.ESCI
Inserire operazione
1
Inserisci primo numero.
2
Inserisci secondo numero.
3
2.0,3.0
您的代码读取数字正常。
原始代码使用了 BufferedReader
,我认为这可能是问题的原因。如果将其替换为 DataInputStream
,您将能够调用 readInt()
和 readDouble()
方法。
将 BufferedReader in;
替换为 DataInputStream in;
。它可以使用与现有代码类似的方式构造:
in = new DataInputStream(msocket.getInputStream());
然后根据需要将对 in.read()
的所有调用替换为 in.readInt()
或 in.readDouble()
。