【问题标题】:Server, Client socket implementation服务器、客户端套接字实现
【发布时间】:2015-09-16 10:02:47
【问题描述】:

我正在编写一个使用 Java Socket 的服务器、客户端聊天程序。这是我的服务器套接字类的代码。

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

public class Main {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8085);
        } catch (IOException ex) {
            System.out.println("IO Error, " + ex);
            System.exit(1);
        }
        Socket clientSocket = null;
        System.out.println("Listening for incoming connections");
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException ex) {
            System.out.println("Failed to accept connection " + ex);
            System.exit(1);
        }
        System.out.println("Connection Successful");
        System.out.println("Listening to get input");
        PrintStream output = new PrintStream(clientSocket.getOutputStream(), true);
        BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine;
        while ((inputLine = input.readLine()) != null) {
            System.out.println(inputLine);
            System.out.println("Server: ");
            inputLine = input.readLine();
            output.println(inputLine);
            if (!inputLine.equals("exit")) {

            } else {
                break;
            }
        }
        output.close();
        input.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客户端能够建立连接并向服务器发送消息。服务器也可以接收客户端发送的消息。问题是当消息从服务器发送时,客户端没有收到消息。这是我的客户端套接字代码。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;


public class Client {
public static void main(String [] args) throws Exception
{
    BufferedReader input;
    PrintStream output;
    BufferedReader clientInput;
    try (Socket client = new Socket("127.0.0.1", 8085)) {
        input = new BufferedReader(new InputStreamReader(client.getInputStream()));
        output = new PrintStream(client.getOutputStream());
        clientInput = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while(true)
        {
            System.out.println("Client: ");
            line = clientInput.readLine();
            output.println("Server: " + line );
            if(line.equals("quit"))
            {
                break;
            }
        }
    }
    input.close();
    clientInput.close();
    output.close();
}
}

【问题讨论】:

  • 请与我们分享到目前为止您是如何尝试解决问题的。
  • 这里有 很多 问题关于使用套接字在 Java 中聊天。我searched(在本页顶部的搜索框中)搜索chat java socket,找到了数百个结果。
  • @StephenP 如果您提供指向具有类似协议问题的特定问题的链接,我会将其标记为重复项。套接字是通用的,程序员可能遇到的问题有很多细微差别。这是一个协议序列问题的例子。
  • @AlainO'Dea 我打算以重复的方式结束投票,但我找不到(在我有空的短时间内)一个适当的结束问题;但我确实发现了很多我认为对 OP 有帮助的东西,所以我决定建议他搜索。

标签: java sockets


【解决方案1】:

服务器端:

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8085);
        } catch (IOException ex) {
            System.out.println("IO Error, " + ex);
            System.exit(1);
        }
        Socket clientSocket = null;
        System.out.println("Listening for incoming connections");
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException ex) {
            System.out.println("Failed to accept connection " + ex);
            System.exit(1);
        }
        System.out.println("Connection Successful");
        System.out.println("Listening to get input");
        PrintStream output = new PrintStream(clientSocket.getOutputStream(), true);
        BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine;
        while ((inputLine = input.readLine()) != null) {

            System.out.println("Client request: " + inputLine);

            String resp = "some response as you need";
            output.println(resp);
            System.out.println("Server response: " + resp);

            if (!inputLine.equals("exit")) {

            } else {
                break;
            }
        }
        output.close();
        input.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客户端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args) throws Exception {

        BufferedReader input;
        PrintStream output;
        BufferedReader clientInput;
        try (Socket client = new Socket("127.0.0.1", 8085)) {
            input = new BufferedReader(new InputStreamReader(client.getInputStream()));
            output = new PrintStream(client.getOutputStream());
            clientInput = new BufferedReader(new InputStreamReader(System.in));

            while (true) {

                String inputStr = clientInput.readLine();

                output.println(inputStr);
                System.out.println("Client: " + inputStr);

                if (inputStr.equals("quit")) {
                    break;
                }

                String serverResp = input.readLine();
                output.println("Server: " + serverResp);
            }
        }
    }
}

经过测试。

【讨论】:

  • OP 的设计需要 System.in 来读取用户的命令。切换也会破坏事情。
  • 这太简单了——所以我只给出了提示。好的,工作解决方案如下:)
【解决方案2】:

当您完成输出流后刷新输出流总是一个好主意,您发送的信息可能已经缓冲了。

【讨论】:

  • 这不是问题。 OP 识别(正确)消息是从客户端到服务器以及从服务器到客户端。刷新已经发生在换行符上。
【解决方案3】:

服务器在此处期望客户端输入的额外行:

while ((inputLine = input.readLine()) != null) {
    System.out.println(inputLine);
    System.out.println("Server: ");
    inputLine = input.readLine(); // <--- here

客户端没有从它连接到服务器时获得的名为 inputInputStream 读取。它只是从 clientInput 读取本地控制台输入。

在 Client.java 的 while 循环中,您需要在退出块之后使用类似的内容来获取服务器的响应:

System.out.println("Server: " + input.readLine());

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2016-08-03
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2011-08-15
    • 2017-05-26
    • 2023-03-11
    相关资源
    最近更新 更多