我是Apache服务组合的初学者,我正在尝试创建一个需要连接到某个服务器的客户端套接字 . 我的java代码如下所示:

package nettyTutorial.nettyTutorial;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.BufferedReader;

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = null;
        socket = new Socket(host.getHostName(), 1112);
        BufferedReader reader;

        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = reader.readLine();
        while (line != null) {
            System.out.println(line);
            // read next line
            line = reader.readLine();
        }
        reader.close();
        socket.close();
    }
}

服务器看起来像这样:

package nettyTutorial.nettyTutorial;
import java.io.IOException;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;

public class TCPServer {

    //netstat -ano | findstr :yourPortNumber
    //taskkill /PID typeyourPIDhere /F

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 1112;

    public static void main(String args[]) throws IOException, ClassNotFoundException, InterruptedException{
        //create the socket server object
        server = new ServerSocket(port);

        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            System.out.println("Accepted client request");

            int numberMessages = 0;
            while(numberMessages < 11) {
                String string = "Hello World" + numberMessages + "\r\n";
                System.out.println("Sending " + string);
                socket.getOutputStream().write(string.getBytes(Charset.forName("UTF-8")));
                Thread.sleep(1000);
                numberMessages = numberMessages +1;               
            }
        }

可以想象服务器等待客户端套接字连接,并且每秒向客户端套接字发送文本“Hello world” .

这是我的问题:如何在apache servicemix的blueprint.xml文件中创建与客户端套接字的精确交互?

我做了什么?

我创建了以下代码,几乎是客户端java代码的复制粘贴:

package nettyTutorial.nettyTutorial;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;

public class ClientBean implements Processor {
    public void process(Exchange exchange) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = null;
        socket = new Socket(host.getHostName(), 1112);
        BufferedReader reader;

        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = reader.readLine();
        while (line != null) {
            System.out.println(line);
            // read next line
            line = reader.readLine();
            exchange.getOut().setBody(line);
        }
        reader.close();
        socket.close();
    }
}

此外,我创建了这个blueprint.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    <camelContext xmlns="http://camel.apache.org/schema/blueprint">

        <route id="routeNetty" >        
          <bean ref="client_bean" />
          <to uri="log:test"/> 
        </route>
    </camelContext>

    <bean id="client_bean" class="nettyTutorial.nettyTutorial.ClientBean">
    </bean>
</blueprint>

我希望会发生什么:

运行服务器然后运行apache karaf控制台时,客户端套接字应连接到服务器套接字,并且应 Build 两者之间的连接 .

真正发生的事情:apache karaf控制台打印“身份验证成功 - karaf”,但服务器一直在监听,直到它连接到客户端套接字 .

我认为这里缺少对蓝图文件如何注入bean的基本理解 . 如果有人有关于如何做到这一点的提示/参考,我真的会很开心:D .

PS:我还将jar文件放在deploy文件夹中,使用maven命令:

mvn clean install

pom.xml文件如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.shengwang.example</groupId>
<artifactId>spring-camel-netty3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>spring-camel-netty</name>
<url>http://maven.apache.org</url>

<properties>
    <!-- Generic properties -->
    <java.version>1.7</java.version>

    <!-- Camel -->
    <camel.version>2.14.1</camel.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-core</artifactId>
        <version>${camel.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-spring</artifactId>
        <version>${camel.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-netty</artifactId>
        <version>${camel.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>
</dependencies>


<build>
    <plugins>
        <!-- Use JDK 1.7 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <compilerArgument>-Xlint:all</compilerArgument>
                <showWarnings>true</showWarnings>
                <showDeprecation>true</showDeprecation>
            </configuration>
        </plugin>

        <!-- Allows the routes to be run via 'mvn camel:run' -->
        <plugin>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-maven-plugin</artifactId>
            <version>${camel.version}</version>
        </plugin>

    </plugins>
</build>