通过套接字发送多字节数组

时间:2011-04-29 02:22:32

标签: java

我想从客户端和服务器发送多字节数组?

我能够从客户端发送/接收一个字节数组,并从服务器发送/接收一个字节数组:

我的代码是这样的:

服务器:

 Socket sock=null;
  ByteArrayOutputStream input=null;
  OutputStream out=null;
    InputStream in=null;
  try{
      ServerSocket server_sock=new ServerSocket(2972);


    sock=server_sock.accept(); 

   in = 
       sock.getInputStream();
    out=sock.getOutputStream();
    }catch(IOException e){
      System.out.println(e.getMessage());
  }
 String word="";

  //1-Receive

  try{

    ByteArrayOutputStream serverinput=new ByteArrayOutputStream();
 int len=0;
byte[] buf=new byte[1000];
        while ((len = in.read(buf))>=0) {
              serverinput.write(buf, 0, len);

        }

      sock.shutdownInput();

        word=new String(serverinput.toByteArray());
    System.out.println("Client send 1"+word);

    }catch(Exception e){
      System.out.println(e.getMessage());
  }


   String st="Server is a king";
try{ 
   out.write(st.getBytes());

   out.flush();

}catch(Exception e){
      System.out.println(e.getMessage());
  }

客户:

 Socket sock=null;
    OutputStream out=null;
    InputStream in=null;


  try{
      sock=new Socket("127.0.0.1",2972);
      }catch(IOException e){
      System.out.println(e.getMessage());
  }


String word="Hellow World"  ;
    try{
    in = 
       sock.getInputStream();
    out=sock.getOutputStream();
    }catch(IOException e){
      System.out.println(e.getMessage());
  }

//1- send
   try{

       System.out.println("Your string is"+word+"converted to byte"+word.getBytes());

    out.write(word.getBytes());
    out.flush();
 sock.shutdownOutput();
    }catch(Exception e){
      System.out.println(e.getMessage());
  }

    try{  ByteArrayOutputStream serverinput=new ByteArrayOutputStream();
 int len=0;
byte[] buf=new byte[1000];
        while ((len = in.read(buf))>=0) {
              serverinput.write(buf, 0, len);


        }
    System.out.println("server send 1 "+new String(serverinput.toByteArray()));
     System.out.println("Your string is"+word+"converted to byte"+word.getBytes());

    }catch(Exception e){
      System.out.println(e.getMessage());
  }

此代码适用于从客户端和服务器提交的代码,但是当我想发送/接收更多字节数组时它不起作用?

只有在我使用shutdown时它才有效,因为客户端和服务器都在读取和写入数据。

因此,我无法再次使用套接字通道......是否有替代解决方案? ......这不会导致僵局。

4 个答案:

答案 0 :(得分:13)

你遇到的问题是,当一个字节数组结束并且下一个字节数组开始时,你现在没有办法说出来。 (在“一个数组”解决方案中,字节数组的结尾对应于流的结尾。当然,一旦流结束/关闭,就不能在不创建新的Socket等的情况下重新打开它。 。)

解决此问题的简单方法如下,使用围绕相应套接字流的DataOutputStream和DataInputStream对:

  • 发送字节数组:

    1. 将数据转换为字节。

    2. 使用DataOutputStream.writeInt(int)方法发送字节数组大小。

    3. 使用DataOutputStream.write(byte[])方法发送字节数组。

  • 接收字节数组:

    1. 使用DataInputStream.readInt()方法接收字节数组大小。

    2. 分配所需大小的字节数组。

    3. 使用DataInputStream.read(byte[], int, int)方法将字节重复接收到字节数组中......直到您获得所有字节为止。

通过在前面发送字节数组的大小,告诉接收器要读取多少字节。您可以根据需要多次重复此过程。发送方可以通过简单地关闭套接字流向接收方指示不再有字节数组发送。

注意 - 这是伪代码。我假设你有能力将它变成可用的Java。

不要忘记将BufferedInputStreams和BufferedOutputStreams插入相应的流链...以减少系统调用开销。

答案 1 :(得分:0)

尝试在DataInputStream和DataOutputStream中包装套接字流。这应该可以让你做你想做的事。

答案 2 :(得分:0)

您应该看一下本教程:Reading from and Writing to a Socket

似乎概述了如何读取和写入套接字。读取应该像创建服务器套接字和监听您期望的端口一样简单,然后等待数据。

答案 3 :(得分:0)

您还可以创建一个对象来保存您的字节数组并使用ObjectOutputStream将其发送出去,然后使用writeObject(Object)方法发送信息。