java - 套接字无法接收数据

标签 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();
}

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

最佳答案

一些问题。

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

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

另一个问题是您从客户端以解析的文本形式写入。所以说 13(作为一个整数)。但你随后会像阅读一系列字符一样阅读它。线路上的 13 将被读取为某个控制字符。您需要保持写入数据和读取数据的方式一致。

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

关于java - 套接字无法接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8782353/

相关文章:

java - 不想将图像保留在同一文件夹中的 jar 文件之外

C++ Winsock SO_REUSEADDR : accept() not returning socket on connection

C linux服务器阻塞

Java套接字一直卡住

java - 我可以使用递归来简化这个过程吗?

java - 在 JSP 日期格式化程序中处理不可解析的字符串

java - 直线和正方形之间的交点

javascript - PHP 流套接字不适用于 HTML5 套接字?

c - 在C中接收UDP数据包

java - 当本地主机:<port> is called from a browser时如何重定向到本地存储的index.html文件