繁体   English   中英

套接字无法接收数据

[英]Socket unable to receive data

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

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

一些问题。

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

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

另一个问题是您正在从客户端作为文本的解析int进行写入。 因此说13(作为一个int)。 但是您正在阅读它,好像它是一个字符序列一样。 电线上的13将被读取为某些控制字符。 您需要与如何写入数据和读取数据保持一致。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM