Java 使用 TCP 的套接字编程不工作
Java Socket programming with TCP not working
我一直在尝试编写一个将与服务器通信的客户端进程。
我在下面使用了相同的代码,但我使用了 BufferedReader 而不是扫描仪,客户端输入是一个字符串。此外,服务器只是将字符串更改为大写并将其发送回客户端以显示在屏幕上。有效。
但是,当我更改代码以便客户端可以输入双数时 [(例如:1.6)服务器应将其四舍五入并将其发回以便打印在屏幕上],我得到没有反应。
我收到了这个错误:
run:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at socketserver.SocketServer.main(SocketServer.java:38)
Java Result: 1
备注:
- 我正在使用 NetBeans。
- 我使用 Scanner 而不是 BufferedReader,这样我就可以读取双数了。
客户端class
package socketclient;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class SocketClient {
/**
* @param args the command line arguments
*/
public static void main(String args[]) throws Exception
{
double inputDouble;
double modifiedNum;
Scanner inFromUser = new Scanner(System.in);
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
Scanner inFromServer = new Scanner(clientSocket.getInputStream());
inputDouble = inFromUser.nextDouble();
outToServer.writeDouble(inputDouble);
modifiedNum = inFromServer.nextDouble();
System.out.println("FROM SERVER: " + modifiedNum);
outToServer.close();
clientSocket.close();
}
}
服务器class
package socketserver;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class SocketServer {
/**
* @param args the command line arguments
*/
public static void main(String args[]) throws Exception
{
double clientNum;
double roundedNum;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
Scanner inFromClient = new Scanner(connectionSocket.getInputStream());
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientNum = inFromClient.nextDouble();
roundedNum= Math.round(clientNum);
outToClient.writeDouble(roundedNum);
}
}
}
您的错误是使用Scanner
从服务器读取客户端发送的数据,反之亦然。
您使用DataOutputStream
发送了一个double
所以您需要一个DataInputStream
来阅读double
;两边。
为 inputFromServer
和 inputFromClient
将 Scanner
更改为 DataInputStream
。也不要忘记 flush
你的输出和最后的 close
流。
我一直在尝试编写一个将与服务器通信的客户端进程。
我在下面使用了相同的代码,但我使用了 BufferedReader 而不是扫描仪,客户端输入是一个字符串。此外,服务器只是将字符串更改为大写并将其发送回客户端以显示在屏幕上。有效。
但是,当我更改代码以便客户端可以输入双数时 [(例如:1.6)服务器应将其四舍五入并将其发回以便打印在屏幕上],我得到没有反应。
我收到了这个错误:
run:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at socketserver.SocketServer.main(SocketServer.java:38)
Java Result: 1
备注:
- 我正在使用 NetBeans。
- 我使用 Scanner 而不是 BufferedReader,这样我就可以读取双数了。
客户端class
package socketclient;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class SocketClient {
/**
* @param args the command line arguments
*/
public static void main(String args[]) throws Exception
{
double inputDouble;
double modifiedNum;
Scanner inFromUser = new Scanner(System.in);
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
Scanner inFromServer = new Scanner(clientSocket.getInputStream());
inputDouble = inFromUser.nextDouble();
outToServer.writeDouble(inputDouble);
modifiedNum = inFromServer.nextDouble();
System.out.println("FROM SERVER: " + modifiedNum);
outToServer.close();
clientSocket.close();
}
}
服务器class
package socketserver;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class SocketServer {
/**
* @param args the command line arguments
*/
public static void main(String args[]) throws Exception
{
double clientNum;
double roundedNum;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
Scanner inFromClient = new Scanner(connectionSocket.getInputStream());
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientNum = inFromClient.nextDouble();
roundedNum= Math.round(clientNum);
outToClient.writeDouble(roundedNum);
}
}
}
您的错误是使用Scanner
从服务器读取客户端发送的数据,反之亦然。
您使用DataOutputStream
发送了一个double
所以您需要一个DataInputStream
来阅读double
;两边。
为 inputFromServer
和 inputFromClient
将 Scanner
更改为 DataInputStream
。也不要忘记 flush
你的输出和最后的 close
流。