java socket不接受字节数组

时间:2014-01-10 06:28:47

标签: java sockets

我正在编写一个简单的套接字程序,如下所示。我想将一个字节数组发送到服务器套接字并在服务器端读取它。 这是服务器

package com.java;

//File Name GreetingServer.java

import java.net.*;
import java.io.*;

public class GreetingsServer extends Thread
{
private ServerSocket serverSocket;

public GreetingsServer(int port) throws IOException
{
   serverSocket = new ServerSocket(port);
   serverSocket.setSoTimeout(10000);
}

public void run()
{
   while(true)
   {
      try
      {
          System.out.println("Waiting for client on port " +
         serverSocket.getLocalPort() + "...");
         Socket server = serverSocket.accept();
         System.out.println("Just connected to "
               + server.getRemoteSocketAddress());
         DataInputStream in =
               new DataInputStream(server.getInputStream());
         System.out.println("--"+ server.getReceiveBufferSize());
         byte[] b1 = new byte[4] ;
         int i =in.read(b1);
         System.out.println("i = " + i  + "b1 = " +b1);
        /* DataOutputStream out =
              new DataOutputStream(server.getOutputStream());
         out.writeUTF("Thank you for connecting to "
           + server.getLocalSocketAddress() + "\nGoodbye!");*/
         server.close();
      }catch(SocketTimeoutException s)
      {
         System.out.println("Socket timed out!");
         break;
      }catch(IOException e)
      {
         e.printStackTrace();
         break;
      }
   }
}
public static void main(String [] args)
{
   int port = Integer.parseInt(args[0]);
   try
   {
      Thread t = new GreetingsServer(port);
      t.start();
   }catch(IOException e)
   {
      e.printStackTrace();
   }
}
}

这是客户

package com.java;

import java.net.*;
import java.io.*;

public class GreetingClient
{
   public static void main(String [] args)
   {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try
      {
         System.out.println("Connecting to " + serverName
                             + " on port " + port);
         Socket client = new Socket(serverName, port);
         System.out.println("Just connected to "
                      + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         byte[] b = {1,2,3,4};
         DataOutputStream out =
                       new DataOutputStream(outToServer);
         /*BufferedOutputStream out = new BufferedOutputStream(outToServer);*/
         System.out.println("**" + b);  
         out.write(b);
         /*out.writeUTF("Hello from "
                      + client.getLocalSocketAddress());*/

         client.close();
      }catch(IOException e)
      {
         e.printStackTrace();
      }

   }
}

我得到的输出是服务器的输出。

Waiting for client on port 6066...
Just connected to /127.0.0.1:52349
--65536
i = 4b1 = [B@48270664
Waiting for client on port 6066...
Socket timed out!

有两件事是错的。第一个是bytearray不是完全来到服务器。其次,服务器调用线程两次。

任何输入都会有所帮助。如果有人发现问题,请告诉我!

1 个答案:

答案 0 :(得分:1)

问题不在于发送/接收的内容,而是您尝试将其输出到控制台的方式。

数组不会覆盖toString()。在您的服务器中,您有:

System.out.println("i = " + i  + "b1 = " +b1);

b1.toString()的输出是Object.toString()的默认值,正如Object的Javdoc中所述:

  

一个字符串,由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。

您需要使用Arrays.toString(b1)来获取一个String,该字符串将该数组中的实际字节显示为[ x, x, x ,x ](其中每个x是字节的数值)