套接字编程:Java 客户端 - Ruby 服务器
Socket Programming: Java Client - Ruby Server
我正在尝试在 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();
}
}
}
Main.java
public class Main{
public static void main(String[] args) {
Thread cThread = new Thread(new ClientSocket());
cThread.start();
}
}
@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();
}
}
如果问题解决了请告诉我
谢谢!
我正在尝试在 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();
}
}
}
Main.java
public class Main{
public static void main(String[] args) {
Thread cThread = new Thread(new ClientSocket());
cThread.start();
}
}
@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();
}
}
如果问题解决了请告诉我 谢谢!