Simple Client Server程序

时间:2013-03-02 06:24:56

标签: java network-programming

我基于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();
    }
}

程序正常工作,除了一个问题,客户端输出来自两个输入。这意味着我必须从客户端提供两个输入以获得第一个输出,并且这将继续。我无法跟踪错误。 有人可以帮忙吗?

1 个答案:

答案 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;
        }
    }