服务器未从客户端获取数据 - JAVA

Server not getting data from client - JAVA

这是我的服务器代码:

package ServerSideHammingCodeCheckingAndResponse;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{    
private ServerSocket serverSocket;
private int port;

public Server(int port)
{
    this.port = port;
}

public void start() throws IOException
{
    System.out.println("Server starts at port:" + port);
    serverSocket = new ServerSocket(port);

    System.out.println("Waiting for client...");
    Socket client = serverSocket.accept();

    sendMessage(client, "This is Hamming Code Checking.");

    boolean checkInput = false;
    String input = null;
    while (!checkInput)
    {
        input = getMessage(client);

        if(input.length() == 7 && input.matches("[01]+"))
            checkInput = true;
        else
            sendMessage(client, "invalid");
    }
    sendMessage(client, input);
}

private void sendMessage(Socket client, String message) throws IOException
{
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

    writer.write(message);
    writer.flush();
    writer.close();
}

private String getMessage(Socket client) throws IOException
{
    String userInput;
    BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    userInput = reader.readLine();
    return userInput;
}

public static void main(String[] args)
{
    int portNumber = 9987;

    try {
        Server socketServer = new Server(portNumber);
        socketServer.start();
        } catch (IOException e) {
        e.printStackTrace();
    }
}
}

这是我的客户端代码:

package ClientSideDataTransmitter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client
{
private String hostname;
private int port;
Socket socketClient;

public Client(String hostname, int port)
{
    this.hostname = hostname;
    this.port = port;
}

public void connect() throws UnknownHostException, IOException
{
    System.out.println("Attempting to connect to " + hostname + ":" + port);
    socketClient = new Socket(hostname, port);
    System.out.println("\nConnection Established.");
}

public void readResponse() throws IOException
{
    String userInput;
    BufferedReader reader = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));

    System.out.print("Response from server: ");
    while ((userInput = reader.readLine()) != null) {
        System.out.println(userInput);
    }
}

public void sendData() throws IOException
{
    Scanner sc = new Scanner(System.in);
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socketClient.getOutputStream()));
    System.out.println("Enter a 7-bits binary as message to server:\n");
    String input = sc.nextLine();
    writer.write(input);
    writer.flush();
}

public static void main(String arg[])
{
    Client client = new Client ("localhost", 9987);
    try {
        client.connect();
        client.readResponse();
        client.sendData();
        client.readResponse();
    } catch (UnknownHostException e) {
        System.err.println("Host unknown. Cannot establish connection");
    } catch (IOException e) {
        System.err.println("Cannot establish connection. Server may not be up." + e.getMessage());
    }
}
}

我还没有完成代码,所以请忽略代码中的小错误。

当我启动服务器时,然后是客户端,并将输入从客户端发送到服务器。服务器似乎没有从客户端获取数据,因为我将该输入从服务器发送回客户端以打印出来,但它什么也没打印。

我认为服务器代码中的 getMessage() 方法可能有问题,但我无法修复它。请帮我修复代码。非常感谢!

服务器:

Server starting at port 9987
Waiting for client...

客户:

Attempting to connect to localhost:9987

Connection Established.
Response from server: This is Hamming Code Checking.
Enter a 7-bits binary as message to server:

1234567
Response from server:

您的代码的问题是 writer.close() in sendMessage() 将在内部关闭编写器对象。您的服务器程序将关闭并且不再连接接受连接。

除了 Shriram 建议之外,我建议您在此处使用 PrintWriter 以避免关闭连接。使用起来也更方便一些。这是工作示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    private ServerSocket serverSocket;
    private int port;

    public Server(int port) {
        this.port = port;
    }

    public void start() throws IOException {
        System.out.println("Server starts at port:" + port);
        serverSocket = new ServerSocket(port);

        System.out.println("Waiting for client...");
        Socket client = serverSocket.accept();

        sendMessage(client, "This is Hamming Code Checking.");

        boolean checkInput = false;
        String input = null;
        while (!checkInput) {
            input = getMessage(client);

            if (input.length() == 7 && input.matches("[01]+"))
                checkInput = true;
            else
                sendMessage(client, "invalid");
        }
        sendMessage(client, input);
    }

    private void sendMessage(Socket client, String message) throws IOException {
        PrintWriter writer = new PrintWriter(client.getOutputStream(), true);
        writer.println(message);
    }

    private String getMessage(Socket client) throws IOException {
        String userInput;
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        userInput = reader.readLine();
        return userInput;
    }

    public static void main(String[] args) {
        int portNumber = 9987;

        try {
            Server socketServer = new Server(portNumber);
            socketServer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    private String hostname;
    private int port;
    Socket socketClient;

    public Client(String hostname, int port) {
        this.hostname = hostname;
        this.port = port;
    }

    public void connect() throws UnknownHostException, IOException {
        System.out.println("Attempting to connect to " + hostname + ":" + port);
        socketClient = new Socket(hostname, port);
        System.out.println("\nConnection Established.");
    }

    public void readResponse() throws IOException {
        String userInput;
        BufferedReader reader = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));

        System.out.print("Response from server: ");
        userInput = reader.readLine();
        System.out.println(userInput);
    }

    public void sendData() throws IOException {
        Scanner sc = new Scanner(System.in);
        PrintWriter writer = new PrintWriter(socketClient.getOutputStream(), true);
        System.out.println("Enter a 7-bits binary as message to server:\n");
        String input = sc.nextLine();
        writer.println(input);
    }

    public static void main(String arg[]) {
        Client client = new Client("localhost", 9987);
        try {
            client.connect();
            client.readResponse();
            client.sendData();
            client.readResponse();
        } catch (UnknownHostException e) {
            System.err.println("Host unknown. Cannot establish connection");
        } catch (IOException e) {
            System.err.println("Cannot establish connection. Server may not be up." + e.getMessage());
        }
    }
}

您正在为每条消息创建一个新的 BufferedReader 而丢失数据。您需要在套接字的整个生命周期内使用同一个套接字。同上“PrintWriter”或您用来发送的任何内容。