我有一个实现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();
}
这不是一个真正的应用程序。我正在学习。
答案 0 :(得分:1)
一些问题。
首先,您的服务器实现永远不会退出while循环。 InputStream.read()
的API声明它将阻塞,直到收到数据或关闭流。该流永远不会关闭,因此在读取初始数据后,读取将永远阻塞。
要解决此问题,您必须确定您的协议是什么。见下文。
另一个问题是你从客户端写作解析的文本int。所以说13(作为int)。但是你正在阅读它,好像它是一系列字符。电线上的13将被视为一些控制字符。您需要与编写数据和读取数据的方式保持一致。
我的建议是拥有一个基本协议。在写入侧使用DataOutputStream
,在阅读侧使用DataInputStream
,然后在两侧匹配读/写调用以确保一致。
答案 1 :(得分:0)
如果要通过线路发送整数,infinitely
更容易在原始套接字流之上层叠DataOutputStream / DataInputStream,只需执行writeInt()和readInt()