【问题标题】:Socket readLine() doesn't receive line sent套接字 readLine() 不接收发送的行
【发布时间】:2017-03-19 00:15:18
【问题描述】:

我正在构建一个客户端-服务器项目。
我需要的是客户端发送一个字符串,例如“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: 损坏的管道

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

【问题讨论】:

  • 从您所显示的内容来看,您在服务器端的obj 存在第一个问题,它似乎未被识别为 Pendu 的实例。你能检查一下 obj 是正确的类型吗?

标签: java sockets serialization


【解决方案1】:

你正在读行但不是写行。您需要在"Pendu" 消息中添加行终止符。

NB 当您发送Pendu 时,为什么要发送一个新的而不是您刚刚创建的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 2010-11-14
    • 2015-02-21
    • 2012-01-26
    • 2016-02-21
    • 2013-04-01
    • 2014-11-25
    • 2016-09-12
    相关资源
    最近更新 更多