如何告诉服务器在套接字编程中成功发送数据?

时间:2016-02-08 17:06:39

标签: java sockets tcp

我正在研究JAVA中的套接字编程问题。 有服务器和客户端。

1)服务器连接到客户端
2)服务器发送N个字符串,这些字符串存储在服务器端的数组中(显然;)) 3)客户端不知道阵列的大小
4)服务器逐个从服务器接收字符串 5)当客户端读取所有字符串时,它会向服务器发送一个msg 6)服务器收到消息。
7)该过程多次进行(步骤2-步骤6)。

我面临的问题是,客户端不知道服务器何时发送最后一个字符串并且它正在等待轮到它 我用以下方法解决了这个问题:
a)多线程。
b)在第一个消息开始时将数组的大小告诉客户端

我想知道是否有内置函数指示服务器是否已停止发送数据?

这里是1次迭代的代码(步骤1 - 步骤6)

服务器代码

public class server {
static String[] a;
static DataOutputStream dos;
static DataInputStream dis;
static ServerSocket server;
static Socket socket;

public static void main(String[] args)
{

    a=new String[]{"String1","String2","String3"};


     try {

        server=new ServerSocket(8080);

        socket=server.accept();
        dos=new DataOutputStream(socket.getOutputStream());
        dis=new DataInputStream(socket.getInputStream());

        ///sending array values

        //String temp=null;

        for(int i=0;i<a.length;i++)
        {
            dos.writeUTF(a[i]);
        }

        String msg_from_client=dis.readUTF();
        System.out.println(msg_from_client);



    } catch (IOException e) {

        e.printStackTrace();
    }

}


}

客户代码

public class client {


static String[] a;
static DataOutputStream dos;
static DataInputStream dis;
static Socket socket;
static Scanner sc;

public static void main(String[] args)
{
    try {
        socket=new Socket("127.0.0.1",8080);
        System.out.println("connected");
        dos=new DataOutputStream(socket.getOutputStream());
        dis=new DataInputStream(socket.getInputStream());
        sc=new Scanner(System.in);

        //reading from server i dont know what is the size of array at server side
        String temp=null;
        while((temp=dis.readUTF())!=null)
        {
            System.out.println(temp);
        }
        System.out.println("out of the loop");

        ////now client sends the msg;

        String msg=sc.nextLine();
        dos.writeUTF(msg);

        System.out.println("sent");




    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


}
}

客户端输出:

  

已连接
String1字符串2字符串3

2 个答案:

答案 0 :(得分:1)

现在是了解protocols的更多信息的时候了。您可以在服务器和客户端之间设置自己的协议,即来自服务器的第一条消息将始终包含要遵循的字符串数。客户端将记录它,然后它将请求服务器在第一种方法中告知的字符串数。

编辑:稍微增强的协议

如果您按照其他用户的建议选择了为每条消息打开新连接的路径,那么您必须在协议中添加更多内容。你需要

  1. 客户端信息,以便服务器知道它之前与此客户端进行了哪些通信
  2. 消息信息,以便服务器知道此客户端是否要求新消息,或者它是否先前向此客户端发送了一些消息,并且他正在询问此消息的下一部分。
  3. 1 可以通过分配客户端ID来实现。如果您知道要处理多少客户端,则可以使用硬编码值。否则在运行时生成

    2 消息信息可能为“null”,表示客户端正在为他请求“任何新消息”。请记住,拥有“null”message_id并不意味着您跳过此字段。您必须确保在请求中添加“message_id”“key”,但保持该字段为空。对此请求的回复将是服务器将返回的期望的字符串以及新生成的message_id。客户端将在所有后续调用中使用此message_id并告诉服务器,我要求message_id z中的字符串x为y

答案 1 :(得分:0)

您绝对需要在服务器和客户端之间交换一条信息以指示传输结束:

  • 之前发送邮件数量:按照您的建议;

  • 例如,在“END”结尾处发送特殊信息。

另一种解决方案:不是循环6/7,而是在读取数据时关闭连接,然后重新连接。