当前位置: 首页 > 面试题库 >

套接字readLine()不接收发送的行

顾超
2023-03-14
问题内容

我正在建立一个客户-服务器项目。
我需要的是客户端发送一个字符串,例如“ Pendu”,服务器接收该字符串并将一个名为“ Pendu”的对象发送回客户端。

这是我的代码:

// server
ServerSocket serverSocket = new ServerSocket(6789);
System.out.println("accepting...");
Socket socket = serverSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ObjectOutputStream outToClient = new ObjectOutputStream(socket.getOutputStream());
String clientMsg = inFromClient.readLine();
System.out.println("Received from client: " + clientMsg);
Object obj;
System.out.println("building object...");
obj = Class.forName("Data." + clientMsg).newInstance();
System.out.println("object built");
if(obj instanceof Pendu)
{
    System.out.println("Send to client: " + obj);
    outToClient.writeObject(new Pendu());
}






//client
Socket socket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
System.out.println("sending...");
outToServer.writeBytes("Pendu");
System.out.println("sent");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
System.out.println("receiving...");
Object obj = ois.readObject(); // it is blocked here and I don't know why
System.out.println("received");

该类Pendu在包中定义Data

package Data;

public class Pendu implements Serializable
{
    private static final long serialVersionUID = 1L;
    private static String[] words = new String[]{"bonjour", "bonsoir", "hier", "france", "ordinateur"};
    private static Random rand = new Random();
    private String but;

    public Pendu()
    {
        this.but = words[rand.nextInt(words.length)];
    }

    public int getLenth()
    {
        return this.but.length();
    }

    public String getBut()
    {
        return this.but;
    }

    @Override
    public String toString()
    {
        return "I'm a pendu object";
    }
}

我的问题是:
首先,我执行服务器,然后看到accepting...控制台中显示的内容。
然后我执行客户端,在控制台中,我收到如下消息:

sending...
sent
receiving...

同时,服务器端未显示任何新内容。
现在,我停止客户端,并显示服务器的所有其他消息:

Received from client: Pendu
building object...
object built

当然我也得到错误:

java.net.SocketException:管道损坏

这是合乎逻辑的,因为我杀死了尚未完成接收的客户端。
我不知道为什么客户不能收到预期的结果。


问题答案:

您正在阅读的行,而不是在写行。您需要在"Pendu"消息中添加行终止符。

注意:发送时Pendu,为什么要发送新的而不是刚创建的?



 类似资料:
  • 问题内容: 我正在使用从远程服务器读取响应的方法(该服务器使用C语言编写,并且无法访问源代码)。 但是它总是在最后一行阻塞,直到超时为止。所以我用下面的代码: 我发现读取的最后一个字节的整数值为13,我认为这是回车,对吗? 那么为什么该方法会阻塞?服务器通常如何发出信号通知流结束?谢谢。 问题答案: 在网络连接的情况下,当套接字关闭时,流终止。 因此阻塞直到收到“行尾”或您手动关闭连接是完全正常的

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 我一直在开发一个简单的python套接字聊天室,客户端和服务器可以在其中相互发送消息。我遇到的问题是服务器和客户端一次只能发送一条消息。我希望它能像任何其他聊天室一样工作,在那里我可以在发送消息时收到消息,任何帮助都会有很大帮助

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 我在 C#.net 中使用 UDP 异步套接字,我想让服务器和客户端在不同的端口进行通信以进行发送和接收, 服务器使用端口 A 发送到客户端,从具有端口 B 的客户端接收 客户端从具有端口 A 的服务器接收数据,并将数据发送到具有端口 B 的服务器 可能吗??

  • 如何将数据从PHP页面发送到TCP端口? 我正在使用它,但我不能使用任何数据!还有,你知道我怎么才能暂停吗? 有什么问题?