套接字无法接收数据

时间:2012-01-08 23:29:22

标签: java sockets serversocket

我有一个实现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();
}

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

2 个答案:

答案 0 :(得分:1)

一些问题。

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

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

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

我的建议是拥有一个基本协议。在写入侧使用DataOutputStream,在阅读侧使用DataInputStream,然后在两侧匹配读/写调用以确保一致。

答案 1 :(得分:0)

如果要通过线路发送整数,infinitely更容易在原始套接字流之上层叠DataOutputStream / DataInputStream,只需执行writeInt()和readInt()