【问题标题】:Socket unable to receive data套接字无法接收数据
【发布时间】:2012-01-08 23:29:22
【问题描述】:

我有一个实现 serversocket 类的类,还有另一个实现客户端的类 1. Socket 类。

所以我想要做的是。在获得流后,我希望客户端向服务器发送一个数字,服务器将依次响应客户端,无论它是否是素数。在awt.Label 中显示。

但我无法收到任何回复。

这是客户端构造函数的代码:

public ClientIsPrime()
{
    setLayout(new GridLayout(2,2));
    add(new Label("Enter a number: "));
    add(numEntry=new TextField(10));
    add(checkPrime=new Button("Check if number is Prime"));
    add(result=new Label("Result is shown here"));

    try
    {
        Socket client = new Socket(InetAddress.getLocalHost(), 5959);
        in=client.getInputStream();
        out=client.getOutputStream();
    }catch(UnknownHostException e)
    {
        result.setText("Local Host cannot be resolved");
    }catch(IOException e)
    {
        result.setText("IOException occured");
    }

    checkPrime.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            try
            {
                int num;
                num=Integer.parseInt(numEntry.getText());
                out.write(num);
                out.flush();

                int c;
                result.setText("");
                String s="";
                while((c=in.read())!=-1)
                    s+=((char)c);
                result.setText(s);
            }catch(IOException e)
            {
                result.setText("IOException occured");
            }catch(NumberFormatException e)
            {
                result.setText("Please enter a valid number.");
            }
        }
    });
}

服务器代码:

public static void main(String args[])throws IOException
{
    server=new ServerSocket(5959);

    socket=server.accept();

    System.out.println("connected");

    InputStream in=socket.getInputStream();
    OutputStream out=socket.getOutputStream();
    int c;  String numStr="";
    while((c=in.read())!=-1)
        numStr+=((char)c);
    int num=Integer.parseInt(numStr);
    if(num==3)
        out.write("Number is Prime".getBytes());
    else
        out.write("Number is not Prime".getBytes());
    out.flush();

    in.close();
    out.close();
}

这不是一个真正的应用程序。我正在学习。

【问题讨论】:

  • 质数实现不正确..但不需要任何东西..只是想测试消息是否正在传输..一旦完成..我会很好地写素数实现..
  • 根据我对 Java 套接字的了解,您做得正确。您的端口是否已转发且您的防火墙已关闭?
  • 那么,澄清一下:问题是服务器收到质数,但客户端从来没有收到响应?
  • @chradcliffe 服务器无法接收 num..我在解析后插入了一个 SOPln(num) 语句..但没有得到任何输出..
  • 那么最终的解决方案是什么..我应该切换到 DataInputStream 还是 ObjectInputStream.. 没有办法用 InputStream 做到这一点..

标签: java sockets serversocket


【解决方案1】:

一些问题。

首先,您的服务器实现永远不会退出 while 循环。 InputStream.read() 的 API 声明它将阻塞,直到接收到数据或关闭流。流永远不会关闭,因此在读取初始数据后读取将永远阻塞。

要解决这个问题,您必须确定您的协议是什么。见下文。

另一个问题是您从客户端编写为已解析的 int 文本。所以说13(作为一个int)。但是你在阅读它时就好像它是一个字符序列一样。电线上的 13 将被读取为一些控制字符。您需要与写入数据和读取数据的方式保持一致。

我的建议是制定一个基本协议。在写入端使用DataOutputStream,在读取端使用DataInputStream,然后匹配双方的读/写调用,以确保您保持一致。

【讨论】:

  • 嗯好的..对于 read() 情况..如果我可以在 IF 条件下使用 available() 方法然后进入循环.. 如果我将 num 变量作为字符串..使用 toString()..
  • 如果你想了解发生了什么,我会阅读 DataInput/OutputStream 的源代码,看看它在做什么。了解它做什么/如何/为什么这样做是好的。重新发明*并非如此。
  • 嗯..好的..所以我认为最后使用数据/对象流会更好..无论如何感谢您的回复!
【解决方案2】:

如果您想通过网络发送整数,infinitely 更容易在原始套接字流之上分层 DataOutputStream/DataInputStream 并执行 writeInt() 和 readInt()

【讨论】:

  • 嗯,没关系..我知道..我什至可以使用 ObjectInputStream.. 但我想尝试使用输入和输出流..它也应该这样工作..!学习..所以只是想尝试一下..