当前位置: 首页 > 知识库问答 >
问题:

服务器、客户端套接字实现

李和裕
2023-03-14

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

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();
}
}

共有3个答案

汝天宇
2023-03-14

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

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

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

在Client.java的while循环中,您需要在quit块之后使用类似这样的代码来获得服务器的响应:

System.out.println("Server: " + input.readLine());
龙欣德
2023-03-14

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

东方华荣
2023-03-14

服务器端:

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);
            }
        }
    }
}

这是经过测试的。

 类似资料:
  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我对套接字有点陌生,我正在尝试编写一个程序,在这个程序中,我基本上可以从客户端程序向服务器程序发送一些简单的请求。现在我只想在客户端有1或2个选项供用户选择。例如,如果用户在客户端选择“选项1”,那么服务器会返回一条消息“您选择选项1”,以此类推,但我不知道如何读取服务器上从客户端发送的输入。 客户代码: 服务器代码: 我需要在Clinet中使用两个不同的BufferedReader吗?一个用于用

  • 我已经实现了一个通过套接字进行通信的全局聊天。客户端写入一条消息,发送到服务器,然后服务器将消息发回给所有客户端。每个客户端都由一个名为ClientThread的类表示,因此每个客户端都是一个线程。每次新客户端连接时,我都会创建一个新的ClientThread实例,并将所有这些实例存储在列表中。现在我想实现一个私人聊天,这样每个客户端就可以私下与另一个客户端交谈(或者2,3或更多的群聊)。 我还想

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我

  • 我组装了一个Java套接字服务器和客户端,可以互相发送消息,我想使用JavaScript作为客户端,但是。。。下面是在托管Java服务器并加载JavaScript客户端时发生的情况。 JavaScript: 这将在chrome控制台中打印: 到“ws://127.0.0.1:9005/”的WebSocket连接失败:WebSocket握手期间出错:无效状态行 WebSocket错误[对象事件] 我