2014-01-10 52 views
0

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

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 = [[email protected] 
Waiting for client on port 6066... 
Socket timed out! 

有两件事是错误的。第一个是字节数组不完全来自服务器。其次,服务器正在调用线程两次。

任何输入都会有帮助。请让我知道是否有人发现问题!

+1

如果你改变的System.out.println实际字节(” i =“+ i +”b1 =“+ b1);使用System.out.println(“i =”+ i +“b1 =”+ b1.toString());你会看到你的第一个问题不存在 – wxyz

+1

@wxyz。对。我是4的事实已经是一个好兆头......但你可能需要像Arrays.toString(b1)这样的东西。 ... + b1)已经和...一样了+ + b1.toString()) –

+0

愚蠢的错误!我得到了字节阵列。这两个线程执行的任何原因? – kavita

回答

1

问题不在于发送/接收的内容,而在于如何将其输出到控制台。

数组不会覆盖toString()。在您的服务器必须:

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

b1.toString()输出是从Object.toString()其作为Javdoc注意到Object默认是:

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

您需要使用Arrays.toString(b1)得到一个字符串,表明阵列[ x, x, x ,x ](其中每个x是字节的数值)