[英]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.