【问题标题】:Java: Send and receive byte arrayJava:发送和接收字节数组
【发布时间】:2014-09-30 22:55:20
【问题描述】:

好吧,我想写一个简单的 java 客户端-服务器-程序,通过 tcp-socket 交换字节数组。

/* Server */
public class Server {

private ServerSocket Server = null;
private Socket Client = null;

public static void main(String[] args) {
    Server A = new Server();
    A.runServer();
    A.listenServer();
}


public void runServer() {
    try {
        Server = new ServerSocket(1234);
    }
    catch (Exception e) {
        System.out.println("Server fault: "+ e.getMessage());
        System.exit(-1);
    }       
}

public void listenServer() {
    try {
        while (true) {
            System.out.println("Waiting...");
            Client = Server.accept();
            System.out.println("Got something new");
            readMessage(Client);
        }
    }
    catch (Exception e) {
        System.out.println("Server fault: "+ e.getMessage());
    }
}

public byte [] readMessage (Socket socket) {

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buf = new byte[1];
        int len = -1;
        while((len = socket.getInputStream().read(buf))!=-1){
            baos.write(buf, 0, len);
        }
        for (int i=0; i<baos.toByteArray().length; i++) {
            System.out.println(baos.toByteArray()[i]);
        }

        return baos.toByteArray();
    }
    catch (Exception e) {
        System.out.println("Server fault: "+ e.getMessage());
    }

    return null;
}

public void writeMessage (Socket socket, String Message) {
    try {
        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
        printWriter.print(Message);
        printWriter.flush();
    }
    catch (Exception e) {
        System.out.println("Server fault: "+ e.getMessage());
    }
}
}

/* Client */
public class Client {

public static void main(String[] args) {

    Client B = new Client();
    B.runClient();

}

public void runClient () {
    Socket socket = null;
    try {
        socket = new Socket("127.0.0.1", 1234);
    }
    catch (Exception e) {
        System.out.println("Client fault: "+e.getMessage());
    }

    byte [] Tmp = new byte[10];
    for (int i=0; i<Tmp.length; i++) {
        Tmp[i] = 1;
    }

    writeMessage(socket, Tmp);

    for (int i=0; i<10; i++) {
        byte []  Message = readMessage(socket);
        System.out.println(Message);
    }
}

public void writeMessage (Socket socket, byte [] myByteMessage) {
    try {
        OutputStream out = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(out);
        dos.write(myByteMessage, 0, myByteMessage.length);
        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
        printWriter.print(myByteMessage);
        printWriter.flush();

    }
    catch (Exception e) {
        System.out.println("Could not send data over TCP");
        return;
    }
}

public byte [] readMessage (Socket socket) {

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buf = new byte[1];
        int len = -1;
        while((len = socket.getInputStream().read(buf))!=-1){
            baos.write(buf, 0, len);
        }
        for (int i=0; i<baos.toByteArray().length; i++) {
            System.out.println(baos.toByteArray()[i]);
        }

        System.out.println("Test");
        return baos.toByteArray();
    }
    catch (Exception e) {
        System.out.println("Server fault: "+ e.getMessage());
    }

    return null;
}
}

问题是,客户端向服务器发送了一些东西,但服务器没有收到任何东西,所以他挂在 readMessage 函数上。 另一方面,客户端收到一些奇怪的东西,但没有收到来自服务器的响应。

【问题讨论】:

  • 服务器是否在写回之前尝试读取客户端可能发送的所有内容?很难用你格式化代码的方式来判断。

标签: java sockets tcp send


【解决方案1】:

服务器接收字节,但它永远不会离开while循环,因为read()永远不会返回-1。 read() 在到达流的末尾时返回 -1。只有当客户端关闭套接字输出流时才会发生这种情况。由于客户端从不关闭输出流,因此服务器一直在等待更多字节的到来。

旁注:您的代码难以阅读,因为您不遵守标准的 Java 命名约定:变量以小写字母开头。

【讨论】:

  • 服务器应该给客户端一个响应,所以客户端不能轻易断开连接。还有其他可能告诉服务器,客户端发送他想要的所有数据吗?可能有一种转义字节左右。但是还有其他解决方案吗?您的旁注:非常感谢,我是 Java 新手:/
  • 你必须定义一个协议。您确实可以依赖特定的字节序列,或者客户端可以发送消息的长度,然后是消息本身。
  • 谢谢。我会试试的。
猜你喜欢
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多