簡體   English   中英

服務器在客戶端服務器應用程序中未收到消息

[英]Server doesn't receive message in client-server application

在我的客戶端服務器應用程序中,客戶端向服務器發送消息,服務器應顯示該消息。 但是在我的情況下,客戶端只能發送但服務器無法發送。

我嘗試使用不同的端口號(即8080、8000、4444等)。 套接字似乎可以建立連接,但是我真的不知道為什么服務器無法讀取客戶端的輸入。

這是我的完整項目(我在這里忽略了這兩個應用程序的主類,因為我只不過是調用方法而已):

EchoServer.java:

    package client.server;

import java.io.*;
import java.net.*;

public class EchoServer {

    public EchoServer() {
    }

    public void establish() {
        ServerSocket serverSocket = null;
        try {

            serverSocket = new ServerSocket(8080);
        } catch (IOException e) {
            System.out.println("Could not listen on port: 1234");
            System.exit(-1);
        }
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("Accept failed: 1234");
            System.exit(-1);
        }
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            out = new PrintWriter(
                    clientSocket.getOutputStream(), true);
            in = new BufferedReader(
                    new InputStreamReader(
                            clientSocket.getInputStream()));
        } catch (IOException ioe) {
            System.out.println("Failed in creating streams");
            System.exit(-1);
        }
        String inputLine, outputLine;
        try {
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
                if (inputLine.equals("Bye.")) {
                    break;
                }
            }
        } catch (IOException ioe) {
            System.out.println("Failed in reading, writing");
            System.exit(-1);
        }
        try {
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            System.out.println("Could not close");
            System.exit(-1);
        }
    }
}

EchoClient.java:

    package server.client;

import java.io.*;
import java.net.*;

public class EchoClient {

    public EchoClient() {
    }

    public void establish() {
        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            //echoSocket = new Socket(InetAddress.getLocalHost(), 1234);
            echoSocket = new Socket(InetAddress.getLocalHost(), 8080);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O");
            System.exit(1);
        }
        BufferedReader stdIn = new BufferedReader(
                new InputStreamReader(System.in));
        String userInput;
        try {
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                if (userInput.equals("Bye.")) {
                    break;
                }
                System.out.println("echo: " + in.readLine());
            }
            out.close();
            in.close();
            stdIn.close();
            echoSocket.close();
        } catch (IOException ioe) {
            System.out.println("Failed");
            System.exit(
                    -1);

        }

    }
}

您的服務器不會將傳入的文本寫到控制台,而只會寫回到尚未處理來自服務器的傳入文本的客戶端。

(out不是System.out,而是Socket.out!)

在服務器中,您正在while循環中使用readLine()進行監聽

while ((inputLine = in.readLine()) != null) {
                System.out.println("inputLine "+inputLine);

這不過是客戶端的輸入流。 上面的SOP將打印來自客戶端的消息。 嘗試刷新流,因為直到緩沖區已滿,它才會打印。

代碼似乎很好。 如果您在服務器端和客戶端都在PrintWriter上寫了一些東西,您將得到輸出。

在服務器中添加以下代碼:(使用accept()API創建Socket之后)

out.println("Hello from Server");

在客戶端中添加以下代碼(創建套接字后)

out.println("Hello from client");

其他建議:

1)一旦在服務器上接受套接字連接,就創建一個線程,該線程應處理所有IO處理

2)使用Server創建Socket之后,您也可以在客戶端創建線程。 新線程應處理所有IO處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM