我基于TCP / IP创建一个基本项目,其中服务器侦听客户端,然后提供传入数据的大写句子。
Server.java:
import java.io.*;
import java.net.*;
public class Server
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(7948);
Socket s= ss.accept();
System.out.print("Server connected\n");
BufferedInputStream bis = new BufferedInputStream (s.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream (s.getOutputStream());
while(true)
{
int a = bis.available();
byte b[] = new byte[a];
bis.read(b);
String str = new String(b);
str = str.toUpperCase();
b = str.getBytes();
bos.write(b,0,b.length);
bos.flush();
if(str.equals("BYE"))
break;
else
continue;
}
System.out.print("\nServer Disconnecting");
String str = "Adios Amigo";
bos.write(str.getBytes());
bos.flush();
bis.close();
bos.close();
ss.close();
s.close();
}
}
Client.java:
import java.io.*;
import java.net.*;
public class Client
{
public static void main(String[] args) throws Exception
{
BufferedReader clientStream = new BufferedReader(new InputStreamReader(System.in));
String str;
int a;
byte[] b;
Socket s = new Socket(InetAddress.getLocalHost(), 7948);
BufferedOutputStream bos = new BufferedOutputStream (s.getOutputStream());
BufferedInputStream bis = new BufferedInputStream (s.getInputStream());
one:while(true)
{
str = clientStream.readLine();
b =str.getBytes();
bos.write(b);
bos.flush();
a=bis.available();
b = new byte[a];
bis.read(b);
str = new String (b);
str.trim();
System.out.print("The server says: "+str);
if (str.equals("BYE"))
{
bis.read(b);
str = new String (b);
System.out.print("The server says: "+str);
break one;
}
}
s.close();
clientStream.close();
bos.close();
bis.close();
}
}
程序正常工作,除了一个问题,客户端输出来自两个输入。这意味着我必须从客户端提供两个输入以获得第一个输出,并且这将继续。我无法跟踪错误。 有人可以帮忙吗?
答案 0 :(得分:3)
在客户端,您将数据发送到服务器,然后立即调用a.available()
- 此功能不等待从服务器发送数据。由于服务器在调用.available()
时不太可能响应数据,因此该函数返回零。
因此,您的字节数组b
(请在将来使用更多描述性变量名称)的长度为零。
创建大小为零的数组后,最后通过调用bis.read()
等待数据 - .read()是阻止调用。它将等待来自服务器的数据。实际上并未读取此数据,因为您正在读取的数组大小为零。这会导致打印出空字符串。
以下代码将解决问题,但对于将来,我不建议使用.available()
- 这在我的经验中是相当不可靠的。您应该通过简化尝试读取数据来检查数据是否可用。
Client.java:
one:while(true)
{
str = clientStream.readLine();
b =str.getBytes();
bos.write(b);
bos.flush();
while (bis.available() <= 0)
{
// wait for data!
}
a=bis.available();
b = new byte[a];
bis.read(b);
str = new String (b);
str.trim();
System.out.print("The server says: "+str);
if (str.equals("BYE"))
{
bis.read(b);
str = new String (b);
System.out.print("The server says: "+str);
break one;
}
}