Java 转发传入TCP“;“命令”;去参加一个活动?
在Java中,如何设置一个套接字侦听器来侦听表示命令的一系列字节的套接字,并在接收时调用解析传入数据并调用相应命令的方法 澄清: 我的问题不是处理命令(也可能是错误代码或对来自服务器的命令的响应),而是创建套接字并侦听它 更多澄清: 我要做的是模仿下面一行.Net(C#)代码: 其中:Java 转发传入TCP“;“命令”;去参加一个活动?,java,sockets,Java,Sockets,在Java中,如何设置一个套接字侦听器来侦听表示命令的一系列字节的套接字,并在接收时调用解析传入数据并调用相应命令的方法 澄清: 我的问题不是处理命令(也可能是错误代码或对来自服务器的命令的响应),而是创建套接字并侦听它 更多澄清: 我要做的是模仿下面一行.Net(C#)代码: 其中: _流是从套接字创建的网络流 _数据是长度为9的字节数组 this.StreamHandler是一个委托(函数指针),在读取数据时执行 我正在将一个库从C#重写为Java,我目前正在编写的组件通过TCPIP将命
- _流是从套接字创建的网络流
- _数据是长度为9的字节数组
- this.StreamHandler是一个委托(函数指针),在读取数据时执行
类
,其中每个类实现一个特定的接口
(例如命令
)映射
,其中包含从每个命令字符串到实现该命令的类实例的查找表使用一个小的main方法来设置套接字并侦听传入的连接。将每个连接传递给工作对象(可能在其自己的线程中) worker对象应该有两个API:服务器和客户端。客户端API获取连接并从中读取数据,服务器API获取连接并向其中写入数据 我喜欢将这两个类放在一个类中,因为这样可以更简单地保持这两个类的同步。使用助手类对数据进行编码/解码以进行传输,这样您就可以单点决定如何传输整数、命令、选项等
如果您想更进一步,请定义一个命令类并编写代码将其序列化到套接字连接并从中读取。这样,工作对象只需声明它们处理的命令类,服务器/客户端API就变得更加简单(以命令类为代价)。TCP连接为您提供了一对一。您可以在专用线程上连续轮询
InputStream
,以获取下一个命令(及其输入)。可能有助于将字节解释为字符、整数、长字符等。您还可以使用传递对象。这应该会有所帮助。
任何幼稚的方法都很可能无法很好地扩展
考虑在合适的小型web服务器上使用REST方法。Jetty通常是一个不错的选择。要以非常简单的方式创建侦听套接字:
mServerSocket = new ServerSocket(port);
listening = true;
while (listening) {
// This call blocks until a connection is made
Socket socket = serverSocket.accept();
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
// Here you do your magic, reading and writing what you need from the streams
// You would set listening to true if you have some command to close the server
// remotely
out.close();
in.close();
socket.close();
}
通常,将输入流的处理委托给其他线程是一个好主意,这样您就可以回答下一个请求。否则,您将连续回答所有请求
您还需要为输入和输出流上的字节定义某种协议,但从您的问题来看,您似乎已经有了一种协议。:您请求的特定部分是“Magic goes here”一节中的部分。有很多种方法可以做到,但有一种方法是:
final InputStream in = socket.getInputStream();
// This creates a new thread to service the request.
new Thread(new Runnable(){
public void run(){
byte[] retrievedData= new byte[ITEM_LENGTH];
in.read(retrievedData, 0, ITEM_LENGTH);
in.close();
// Here call your delegate or something to process the data
callSomethingWithTheData(retrievedData);
}
}).start();
您可以创建一个枚举,每个命令有一个成员
interface Comamnd {
// whatever you expect all command to know to perform their function
void perform(Context context);
}
enum Commands implements Command{
ACTIONONE() {
void perform(Context context) {
System.out.println("Action One");
}
},
ACTIONTWO() {
void perform(Context context) {
System.out.println("Action Two");
}
}
}
// initialise
DataInputStream in = new DataInputStream(socket.getInputStream());
// in a loop
byte[] retrievedData= new byte[ITEM_LENGTH];
in.readFully(retrievedData);
String command = new String(retrievedData, 0);
Commands.valueOf(command).perform(context);
他谈到了字节序列——表明该协议已经存在,并且不是基于Java序列化的!我认为这是一个接近答案,因为我将得到感谢。
interface Comamnd {
// whatever you expect all command to know to perform their function
void perform(Context context);
}
enum Commands implements Command{
ACTIONONE() {
void perform(Context context) {
System.out.println("Action One");
}
},
ACTIONTWO() {
void perform(Context context) {
System.out.println("Action Two");
}
}
}
// initialise
DataInputStream in = new DataInputStream(socket.getInputStream());
// in a loop
byte[] retrievedData= new byte[ITEM_LENGTH];
in.readFully(retrievedData);
String command = new String(retrievedData, 0);
Commands.valueOf(command).perform(context);