首页 > 解决方案 > 套接字编程:Java 客户端 - Ruby 服务器

问题描述

我正在尝试在 Ruby 服务器和 Java 客户端之间建立套接字连接。连接已成功设置,但在从服务器向客户端发送消息时遇到了困难。

这就是我的 Ruby 服务器的样子:

class ServerSocket 
  loop do
    server = TCPServer.new(ip, port).accept
    while server
      line = server.recv(65000)

      puts "Message: #{line}"

      server.flush

      server.puts("Hi from server!")

      server.flush
    end 
  end
end

当我尝试使用此 Java 客户端时:

Socket socket = new Socket(InetAddress.getByName(ip), port);

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.write("Hello from client!");

socket.close();

连接建立,消息从客户端成功发送到服务器。但是当服务器到达这一行时:

server.puts("Hi from server!")

它抛出这个异常:

lib/server_socket.rb:11:in `write': Broken pipe (Errno::EPIPE)
    from lib/server_socket.rb:11:in `puts'
    from lib/server_socket.rb:11:in `block in <class:ServerSocket>'
    from lib/server_socket.rb:2:in `loop'
    from lib/server_socket.rb:2:in `<class:ServerSocket>'
    from lib/server_socket.rb:1:in `<top (required)>'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/railties-5.1.4/lib/rails/commands/runner/runner_command.rb:34:in `load'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/railties-5.1.4/lib/rails/commands/runner/runner_command.rb:34:in `perform'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/railties-5.1.4/lib/rails/command/base.rb:63:in `perform'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/railties-5.1.4/lib/rails/command.rb:44:in `invoke'
    from /home/dionis/.rvm/gems/ruby-2.4.1@sample/gems/railties-5.1.4/lib/rails/commands.rb:16:in `<top (required)>'
    from bin/rails:9:in `require'
    from bin/rails:9:in `<main>'

另一个用户体验是当我尝试使用这个 Java 客户端时:

Socket socket = new Socket(InetAddress.getByName(ip), port);

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.write("Hello from client!");


BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String serverMsg = in.readLine();

System.out.println("Server: " + serverMsg);

socket.close();

在这里,我试图从服务器获取消息。但是当客户到达这一行时:

String serverMsg = in.readLine();

它永远挂在那里。

有谁知道如何处理这个?

编辑(完整的客户代码)

ClientSocket.java

public class ClientSocket implements Runnable{

    @Override
    public void run() {
        System.out.println("Connecting...");
        try {

            Socket socket = new Socket(InetAddress.getByName(ip), port);

            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.write("Hello from client!");

            socket.close();

            System.out.println("Closing...");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

主.java

public class Main{

    public static void main(String[] args) {

        Thread cThread = new Thread(new ClientSocket());
        cThread.start();


    }

}

标签: javaandroidrubysocketsmessaging

解决方案


@Dionis我不熟悉java。已经写了一个java客户端和ruby服务器我想这会对你有所帮助。

Ruby TCP 服务器代码:

require 'socket'
server = TCPServer.new(12345).accept
line = server.recv(50)
puts "Message from java Client: #{line}"
server.flush
server.puts("Hi from server!")
server.flush

Java TCP 客户端代码:

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

class Main{

    public static void main(String[] args) throws Exception {

    Socket socket = new Socket("localhost", 12345);
    DataInputStream is = new DataInputStream(socket.getInputStream());
    DataOutputStream os = new DataOutputStream(socket.getOutputStream());
    os.writeBytes("Hello \n");
    String line = is.readLine();
    System.out.println("Msg from ruby Server :" + line);
    socket.close();
    }
}

让我知道是否解决了问题谢谢!


推荐阅读