car emulator and corrected srv

This commit is contained in:
MaximZaitsev
2016-07-08 15:39:51 +03:00
parent 72d2a8c510
commit 4eb06599e2
26 changed files with 4016 additions and 111 deletions
+1
View File
@@ -1,2 +1,3 @@
.idea/workspace.xml
.idea/uiDesigner.xml
out
+1
View File
@@ -9,5 +9,6 @@
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="library" name="netty-all-4.1.2.Final-sources" level="project" />
<orderEntry type="library" name="protobuf-java-3.0.0-beta-3" level="project" />
</component>
</module>
+79
View File
@@ -0,0 +1,79 @@
import client.Client
import io.netty.bootstrap.ServerBootstrap
import io.netty.buffer.Unpooled
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioServerSocketChannel
import io.netty.handler.codec.http.*
import proto.car.ConnectP
import proto.car.RouteDoneP
import server.Initializer
import java.util.*
import kotlin.concurrent.thread
/**
* Created by user on 7/6/16.
*/
val serverHost = "127.0.0.1"
val serverPort = 7925
val carHost = "127.0.0.1"
val getLocationUrl = "getLocation"
val routeDoneUrl = "routeDone"
val setRouteUrl = "route"
val connectUrl = "connect"
fun main(args: Array<String>) {
val port = Random().nextInt(10000) + 10000
println("car started on port $port")
val serverCarThread = thread {
val bossGroup = NioEventLoopGroup(1)
val workerGroup = NioEventLoopGroup()
val b = ServerBootstrap()
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel().javaClass)
.childHandler(Initializer())
try {
val channel = b.bind(port).sync().channel()
channel.closeFuture().sync()
} catch (e: InterruptedException) {
println("car server stoped!")
e.printStackTrace()
} finally {
bossGroup.shutdownGracefully()
workerGroup.shutdownGracefully()
}
}
//connect
val connect = ConnectP.ConnectionRequest.newBuilder().setIp(carHost).setPort(port).build()
val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, connectUrl, Unpooled.copiedBuffer(connect.toByteArray()))
request.headers().set(HttpHeaderNames.HOST, serverHost)
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes())
Client.sendRequest(request, serverHost, serverPort)
val car = ThisCar.instance
var lastTime: Long = System.currentTimeMillis()
while (true) {
val deltaTimeMs = (System.currentTimeMillis() - lastTime)
if (deltaTimeMs > 50) {
if (!car.pathDone) {
println(car)
}
var pathDone = car.move(deltaTimeMs.toDouble()/ 1000)
if (pathDone) {
val routeDone = RouteDoneP.RouteDone.newBuilder().setUid(car.id).build()
val pathDoneRequest = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, setRouteUrl, Unpooled.copiedBuffer(routeDone.toByteArray()))
pathDoneRequest.headers().set(HttpHeaderNames.HOST, serverHost)
pathDoneRequest.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
pathDoneRequest.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, pathDoneRequest.content().readableBytes())
Client.sendRequest(pathDoneRequest, serverHost, serverPort)
}
lastTime = System.currentTimeMillis()
}
}
}
-7
View File
@@ -1,7 +0,0 @@
/**
* Created by user on 7/6/16.
*/
fun main(args: Array<String>) {
println("test")
}
+95
View File
@@ -0,0 +1,95 @@
import client.Client
import io.netty.buffer.Unpooled
import io.netty.handler.codec.http.*
import proto.car.RouteDoneP
import proto.car.RouteP.Route.WayPoint
/**
* Created by user on 7/8/16.
*/
class ThisCar private constructor() {
var id = ""
//metr
var x: Double = 0.toDouble()
var y: Double = 0.toDouble()
//Degree
var angle: Double = 0.toDouble();//0 - положительное направление по OX
val velocityMove: Double = 0.1//metr/sec
val velocityRotation: Double = 10.toDouble()//Degree/sec
val wayPoints: MutableList<WayPoint> = mutableListOf()
var nextWayPointIndex = 0
var pathDone = true
var distanceToNext: Double = 0.toDouble()
var angleToNext: Double = 0.toDouble()
var anglePositive = true//true - поворот по часовой, false - против
companion object {
val instance = ThisCar()
}
@Synchronized
fun move(deltaTime: Double) :Boolean {
if (pathDone) {
//маршрут не задан и сервер "в курсе", что маршрут пройден
return false;
}
if (distanceToNext > 0 || angleToNext > 0) {
if (angleToNext > 0) {
//поворачиваемся
val angleDelta: Double = velocityRotation * deltaTime
angle += (if (anglePositive) 1 else -1) * angleDelta
angleToNext -= angleDelta
if (angleToNext < 0) {
angleToNext = 0.toDouble()
}
} else {
//машинка повернута в нужную сторону, можно ехать
var xDelta = deltaTime * velocityMove * Math.cos(angle * Math.PI / 180)
var yDelta = deltaTime * velocityMove * Math.sin(angle * Math.PI / 180)
x += xDelta
y += yDelta
distanceToNext -= deltaTime * velocityMove
if (distanceToNext < 0) {
distanceToNext = 0.toDouble()
}
}
} else if (nextWayPointIndex == wayPoints.size) {
pathDone = true
return true;
} else {
val wayPoint = wayPoints.get(nextWayPointIndex)
angleToNext = Math.abs(wayPoint.angleDelta)
distanceToNext = Math.abs(wayPoint.distance)//задний ход пока отключаем:)
anglePositive = (wayPoint.angleDelta > 0)
nextWayPointIndex++
}
return false;
}
@Synchronized
fun setPath(wayPoints: List<WayPoint>) {
println("in set path")
this.pathDone = false
distanceToNext = 0.toDouble()
angleToNext = 0.toDouble()
nextWayPointIndex = 0
this.wayPoints.clear()
this.wayPoints.addAll(wayPoints)
}
override fun toString(): String {
return "x:$x; y:$y; angle:$angle"
}
}
+40
View File
@@ -0,0 +1,40 @@
package client
import io.netty.bootstrap.Bootstrap
import io.netty.channel.ChannelInitializer
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.http.HttpRequest
import io.netty.util.AttributeKey
/**
* Created by user on 7/8/16.
*/
object Client {
val bootstrap: Bootstrap = makeBootstrap()
private fun makeBootstrap(): Bootstrap {
val group = NioEventLoopGroup();
val b = Bootstrap();
b.group(group).channel(NioSocketChannel().javaClass).handler(ClientInitializer())
.attr(AttributeKey.newInstance<String>("url"), "")
.attr(AttributeKey.newInstance<String>("uid"), "")
return b
}
fun sendRequest(request: HttpRequest, host: String, port: Int) {
try {
bootstrap.attr(AttributeKey.valueOf<String>("url"), request.uri())
// bootstrap.attr(AttributeKey.valueOf<String>("uid"), carUid)
val ch = bootstrap.connect(host, port).sync().channel()
ch.writeAndFlush(request)
ch.closeFuture().sync()//wait for answer
// val handler: ClientHandler = ch.pipeline().get(ClientHandler().javaClass)
} catch (e: InterruptedException) {
}
}
}
@@ -0,0 +1,62 @@
package client
import com.google.protobuf.InvalidProtocolBufferException
import connectUrl
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.DefaultHttpContent
import io.netty.handler.codec.http.HttpContent
import io.netty.handler.codec.http.HttpRequest
import io.netty.handler.codec.http.HttpResponse
import io.netty.util.AttributeKey
import proto.car.ConnectP
/**
* Created by user on 7/8/16.
*/
class ClientHandler : SimpleChannelInboundHandler<Any> {
constructor()
var url: String = ""
var contentBytes: ByteArray = ByteArray(0);
override fun channelReadComplete(ctx: ChannelHandlerContext) {
val url = ctx.channel().attr(AttributeKey.valueOf<String>("url")).get()
when (url) {
connectUrl -> {
try {
val uid = ConnectP.ConnectionResponse.parseFrom(contentBytes).uid
synchronized(ThisCar.instance, {
ThisCar.instance.id = uid;
})
} catch (e: InvalidProtocolBufferException) {
e.printStackTrace()
}
}
else -> {
//todo error
}
}
ctx.close()
}
override fun channelRead(ctx: ChannelHandlerContext?, msg: Any?) {
super.channelRead(ctx, msg)
}
override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) {
if (msg is HttpResponse) {
// this.url = msg.uri()
}
if (msg is HttpContent) {
val contentsBytes = msg.content();
contentBytes = ByteArray(contentsBytes.capacity())
contentsBytes.readBytes(contentBytes)
}
}
}
@@ -0,0 +1,19 @@
package client
import io.netty.channel.ChannelInitializer
import io.netty.channel.socket.SocketChannel
import io.netty.handler.codec.http.HttpClientCodec
/**
* Created by user on 7/8/16.
*/
class ClientInitializer : ChannelInitializer<SocketChannel> {
constructor()
override fun initChannel(ch: SocketChannel) {
val p = ch.pipeline()
p.addLast(HttpClientCodec())
p.addLast(ClientHandler())
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,540 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: location.proto
package proto.car;
public final class LocationP {
private LocationP() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
}
public interface LocationOrBuilder extends
// @@protoc_insertion_point(interface_extends:carkot.Location)
com.google.protobuf.MessageOrBuilder {
/**
* <code>optional double x = 1;</code>
*/
double getX();
/**
* <code>optional double y = 2;</code>
*/
double getY();
/**
* <code>optional double angle = 3;</code>
*/
double getAngle();
}
/**
* Protobuf type {@code carkot.Location}
*/
public static final class Location extends
com.google.protobuf.GeneratedMessage implements
// @@protoc_insertion_point(message_implements:carkot.Location)
LocationOrBuilder {
// Use Location.newBuilder() to construct.
private Location(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
super(builder);
}
private Location() {
x_ = 0D;
y_ = 0D;
angle_ = 0D;
}
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
}
private Location(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
int mutable_bitField0_ = 0;
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!input.skipField(tag)) {
done = true;
}
break;
}
case 9: {
x_ = input.readDouble();
break;
}
case 17: {
y_ = input.readDouble();
break;
}
case 25: {
angle_ = input.readDouble();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return proto.car.LocationP.internal_static_carkot_Location_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return proto.car.LocationP.internal_static_carkot_Location_fieldAccessorTable
.ensureFieldAccessorsInitialized(
proto.car.LocationP.Location.class, proto.car.LocationP.Location.Builder.class);
}
public static final int X_FIELD_NUMBER = 1;
private double x_;
/**
* <code>optional double x = 1;</code>
*/
public double getX() {
return x_;
}
public static final int Y_FIELD_NUMBER = 2;
private double y_;
/**
* <code>optional double y = 2;</code>
*/
public double getY() {
return y_;
}
public static final int ANGLE_FIELD_NUMBER = 3;
private double angle_;
/**
* <code>optional double angle = 3;</code>
*/
public double getAngle() {
return angle_;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (x_ != 0D) {
output.writeDouble(1, x_);
}
if (y_ != 0D) {
output.writeDouble(2, y_);
}
if (angle_ != 0D) {
output.writeDouble(3, angle_);
}
}
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (x_ != 0D) {
size += com.google.protobuf.CodedOutputStream
.computeDoubleSize(1, x_);
}
if (y_ != 0D) {
size += com.google.protobuf.CodedOutputStream
.computeDoubleSize(2, y_);
}
if (angle_ != 0D) {
size += com.google.protobuf.CodedOutputStream
.computeDoubleSize(3, angle_);
}
memoizedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
public static proto.car.LocationP.Location parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static proto.car.LocationP.Location parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static proto.car.LocationP.Location parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static proto.car.LocationP.Location parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static proto.car.LocationP.Location parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input);
}
public static proto.car.LocationP.Location parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static proto.car.LocationP.Location parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseDelimitedWithIOException(PARSER, input);
}
public static proto.car.LocationP.Location parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static proto.car.LocationP.Location parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input);
}
public static proto.car.LocationP.Location parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input, extensionRegistry);
}
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(proto.car.LocationP.Location prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@java.lang.Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code carkot.Location}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessage.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:carkot.Location)
proto.car.LocationP.LocationOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return proto.car.LocationP.internal_static_carkot_Location_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return proto.car.LocationP.internal_static_carkot_Location_fieldAccessorTable
.ensureFieldAccessorsInitialized(
proto.car.LocationP.Location.class, proto.car.LocationP.Location.Builder.class);
}
// Construct using proto.car.LocationP.Location.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
}
}
public Builder clear() {
super.clear();
x_ = 0D;
y_ = 0D;
angle_ = 0D;
return this;
}
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return proto.car.LocationP.internal_static_carkot_Location_descriptor;
}
public proto.car.LocationP.Location getDefaultInstanceForType() {
return proto.car.LocationP.Location.getDefaultInstance();
}
public proto.car.LocationP.Location build() {
proto.car.LocationP.Location result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
public proto.car.LocationP.Location buildPartial() {
proto.car.LocationP.Location result = new proto.car.LocationP.Location(this);
result.x_ = x_;
result.y_ = y_;
result.angle_ = angle_;
onBuilt();
return result;
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof proto.car.LocationP.Location) {
return mergeFrom((proto.car.LocationP.Location)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(proto.car.LocationP.Location other) {
if (other == proto.car.LocationP.Location.getDefaultInstance()) return this;
if (other.getX() != 0D) {
setX(other.getX());
}
if (other.getY() != 0D) {
setY(other.getY());
}
if (other.getAngle() != 0D) {
setAngle(other.getAngle());
}
onChanged();
return this;
}
public final boolean isInitialized() {
return true;
}
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
proto.car.LocationP.Location parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (proto.car.LocationP.Location) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private double x_ ;
/**
* <code>optional double x = 1;</code>
*/
public double getX() {
return x_;
}
/**
* <code>optional double x = 1;</code>
*/
public Builder setX(double value) {
x_ = value;
onChanged();
return this;
}
/**
* <code>optional double x = 1;</code>
*/
public Builder clearX() {
x_ = 0D;
onChanged();
return this;
}
private double y_ ;
/**
* <code>optional double y = 2;</code>
*/
public double getY() {
return y_;
}
/**
* <code>optional double y = 2;</code>
*/
public Builder setY(double value) {
y_ = value;
onChanged();
return this;
}
/**
* <code>optional double y = 2;</code>
*/
public Builder clearY() {
y_ = 0D;
onChanged();
return this;
}
private double angle_ ;
/**
* <code>optional double angle = 3;</code>
*/
public double getAngle() {
return angle_;
}
/**
* <code>optional double angle = 3;</code>
*/
public Builder setAngle(double value) {
angle_ = value;
onChanged();
return this;
}
/**
* <code>optional double angle = 3;</code>
*/
public Builder clearAngle() {
angle_ = 0D;
onChanged();
return this;
}
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return this;
}
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return this;
}
// @@protoc_insertion_point(builder_scope:carkot.Location)
}
// @@protoc_insertion_point(class_scope:carkot.Location)
private static final proto.car.LocationP.Location DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new proto.car.LocationP.Location();
}
public static proto.car.LocationP.Location getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<Location>
PARSER = new com.google.protobuf.AbstractParser<Location>() {
public Location parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new Location(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<Location> parser() {
return PARSER;
}
@java.lang.Override
public com.google.protobuf.Parser<Location> getParserForType() {
return PARSER;
}
public proto.car.LocationP.Location getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
private static final com.google.protobuf.Descriptors.Descriptor
internal_static_carkot_Location_descriptor;
private static final
com.google.protobuf.GeneratedMessage.FieldAccessorTable
internal_static_carkot_Location_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
java.lang.String[] descriptorData = {
"\n\016location.proto\022\006carkot\"/\n\010Location\022\t\n\001" +
"x\030\001 \001(\001\022\t\n\001y\030\002 \001(\001\022\r\n\005angle\030\003 \001(\001B\026\n\tpro" +
"to.carB\tLocationPb\006proto3"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
}, assigner);
internal_static_carkot_Location_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_carkot_Location_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_carkot_Location_descriptor,
new java.lang.String[] { "X", "Y", "Angle", });
}
// @@protoc_insertion_point(outer_class_scope)
}
@@ -0,0 +1,496 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: routeDone.proto
package proto.car;
public final class RouteDoneP {
private RouteDoneP() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
}
public interface RouteDoneOrBuilder extends
// @@protoc_insertion_point(interface_extends:carkot.RouteDone)
com.google.protobuf.MessageOrBuilder {
/**
* <code>optional string uid = 1;</code>
*/
java.lang.String getUid();
/**
* <code>optional string uid = 1;</code>
*/
com.google.protobuf.ByteString
getUidBytes();
}
/**
* Protobuf type {@code carkot.RouteDone}
*/
public static final class RouteDone extends
com.google.protobuf.GeneratedMessage implements
// @@protoc_insertion_point(message_implements:carkot.RouteDone)
RouteDoneOrBuilder {
// Use RouteDone.newBuilder() to construct.
private RouteDone(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
super(builder);
}
private RouteDone() {
uid_ = "";
}
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
}
private RouteDone(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
int mutable_bitField0_ = 0;
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!input.skipField(tag)) {
done = true;
}
break;
}
case 10: {
java.lang.String s = input.readStringRequireUtf8();
uid_ = s;
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return proto.car.RouteDoneP.internal_static_carkot_RouteDone_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return proto.car.RouteDoneP.internal_static_carkot_RouteDone_fieldAccessorTable
.ensureFieldAccessorsInitialized(
proto.car.RouteDoneP.RouteDone.class, proto.car.RouteDoneP.RouteDone.Builder.class);
}
public static final int UID_FIELD_NUMBER = 1;
private volatile java.lang.Object uid_;
/**
* <code>optional string uid = 1;</code>
*/
public java.lang.String getUid() {
java.lang.Object ref = uid_;
if (ref instanceof java.lang.String) {
return (java.lang.String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
java.lang.String s = bs.toStringUtf8();
uid_ = s;
return s;
}
}
/**
* <code>optional string uid = 1;</code>
*/
public com.google.protobuf.ByteString
getUidBytes() {
java.lang.Object ref = uid_;
if (ref instanceof java.lang.String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(java.lang.String) ref);
uid_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (!getUidBytes().isEmpty()) {
com.google.protobuf.GeneratedMessage.writeString(output, 1, uid_);
}
}
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (!getUidBytes().isEmpty()) {
size += com.google.protobuf.GeneratedMessage.computeStringSize(1, uid_);
}
memoizedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
public static proto.car.RouteDoneP.RouteDone parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static proto.car.RouteDoneP.RouteDone parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseDelimitedWithIOException(PARSER, input);
}
public static proto.car.RouteDoneP.RouteDone parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input);
}
public static proto.car.RouteDoneP.RouteDone parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessage
.parseWithIOException(PARSER, input, extensionRegistry);
}
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(proto.car.RouteDoneP.RouteDone prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@java.lang.Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code carkot.RouteDone}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessage.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:carkot.RouteDone)
proto.car.RouteDoneP.RouteDoneOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return proto.car.RouteDoneP.internal_static_carkot_RouteDone_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return proto.car.RouteDoneP.internal_static_carkot_RouteDone_fieldAccessorTable
.ensureFieldAccessorsInitialized(
proto.car.RouteDoneP.RouteDone.class, proto.car.RouteDoneP.RouteDone.Builder.class);
}
// Construct using proto.car.RouteDoneP.RouteDone.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
}
}
public Builder clear() {
super.clear();
uid_ = "";
return this;
}
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return proto.car.RouteDoneP.internal_static_carkot_RouteDone_descriptor;
}
public proto.car.RouteDoneP.RouteDone getDefaultInstanceForType() {
return proto.car.RouteDoneP.RouteDone.getDefaultInstance();
}
public proto.car.RouteDoneP.RouteDone build() {
proto.car.RouteDoneP.RouteDone result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
public proto.car.RouteDoneP.RouteDone buildPartial() {
proto.car.RouteDoneP.RouteDone result = new proto.car.RouteDoneP.RouteDone(this);
result.uid_ = uid_;
onBuilt();
return result;
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof proto.car.RouteDoneP.RouteDone) {
return mergeFrom((proto.car.RouteDoneP.RouteDone)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(proto.car.RouteDoneP.RouteDone other) {
if (other == proto.car.RouteDoneP.RouteDone.getDefaultInstance()) return this;
if (!other.getUid().isEmpty()) {
uid_ = other.uid_;
onChanged();
}
onChanged();
return this;
}
public final boolean isInitialized() {
return true;
}
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
proto.car.RouteDoneP.RouteDone parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (proto.car.RouteDoneP.RouteDone) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private java.lang.Object uid_ = "";
/**
* <code>optional string uid = 1;</code>
*/
public java.lang.String getUid() {
java.lang.Object ref = uid_;
if (!(ref instanceof java.lang.String)) {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
java.lang.String s = bs.toStringUtf8();
uid_ = s;
return s;
} else {
return (java.lang.String) ref;
}
}
/**
* <code>optional string uid = 1;</code>
*/
public com.google.protobuf.ByteString
getUidBytes() {
java.lang.Object ref = uid_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(java.lang.String) ref);
uid_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>optional string uid = 1;</code>
*/
public Builder setUid(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
uid_ = value;
onChanged();
return this;
}
/**
* <code>optional string uid = 1;</code>
*/
public Builder clearUid() {
uid_ = getDefaultInstance().getUid();
onChanged();
return this;
}
/**
* <code>optional string uid = 1;</code>
*/
public Builder setUidBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
checkByteStringIsUtf8(value);
uid_ = value;
onChanged();
return this;
}
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return this;
}
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return this;
}
// @@protoc_insertion_point(builder_scope:carkot.RouteDone)
}
// @@protoc_insertion_point(class_scope:carkot.RouteDone)
private static final proto.car.RouteDoneP.RouteDone DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new proto.car.RouteDoneP.RouteDone();
}
public static proto.car.RouteDoneP.RouteDone getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<RouteDone>
PARSER = new com.google.protobuf.AbstractParser<RouteDone>() {
public RouteDone parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new RouteDone(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<RouteDone> parser() {
return PARSER;
}
@java.lang.Override
public com.google.protobuf.Parser<RouteDone> getParserForType() {
return PARSER;
}
public proto.car.RouteDoneP.RouteDone getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
private static final com.google.protobuf.Descriptors.Descriptor
internal_static_carkot_RouteDone_descriptor;
private static final
com.google.protobuf.GeneratedMessage.FieldAccessorTable
internal_static_carkot_RouteDone_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
java.lang.String[] descriptorData = {
"\n\017routeDone.proto\022\006carkot\"\030\n\tRouteDone\022\013" +
"\n\003uid\030\001 \001(\tB\027\n\tproto.carB\nRouteDonePb\006pr" +
"oto3"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
}, assigner);
internal_static_carkot_RouteDone_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_carkot_RouteDone_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_carkot_RouteDone_descriptor,
new java.lang.String[] { "Uid", });
}
// @@protoc_insertion_point(outer_class_scope)
}
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,6 @@
package server
import com.google.protobuf.InvalidProtocolBufferException
import connectUrl
import getLocationUrl
import io.netty.buffer.Unpooled
@@ -7,67 +8,66 @@ import io.netty.channel.ChannelFutureListener
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.*
import io.netty.util.CharsetUtil
import objects.Environment
import proto.car.ConnectP.ConnectionRequest
import proto.car.RouteDoneP
import proto.car.LocationP
import proto.car.RouteDoneP.RouteDone
import proto.car.RouteP
import routeDoneUrl
import setRouteUrl
import java.nio.charset.Charset
import java.text.SimpleDateFormat
import java.util.*
/**
* Created by user on 7/6/16.
*/
class ServerHandler : SimpleChannelInboundHandler<Any>() {
class Handler : SimpleChannelInboundHandler<Any>() {
var url: String = ""
var contentBytes: ByteArray = ByteArray(0);
override fun channelReadComplete(ctx: ChannelHandlerContext) {
val environment = Environment.instance
val car = ThisCar.instance
var success = true;
var dataAnswer: ByteArray = ByteArray(0)
when (url) {
connectUrl -> {
val data = ConnectionRequest.parseFrom(contentBytes)
//todo
getLocationUrl -> {
dataAnswer = LocationP.Location.newBuilder().setAngle(car.angle).setX(car.x).setY(car.y).build().toByteArray();
}
routeDoneUrl -> {
val data = RouteDone.parseFrom(contentBytes)
val id = data.uid
synchronized(environment.map, {
val car = environment.map.get(id)
if (car != null) {
car.free = true
} else {
success = false
}
})
setRouteUrl -> {
var data: RouteP.Route? = null;
try {
data = RouteP.Route.parseFrom(contentBytes)
} catch (e: InvalidProtocolBufferException) {
//todo error answer
}
if (data != null) {
val wayPoints = data.wayPointsList
println("try set path")
ThisCar.instance.setPath(wayPoints)
}
}
else -> {
success = false
//todo unsup operation
//todo unsup operation. error answer
}
}
val response = DefaultFullHttpResponse(HttpVersion.HTTP_1_1, if (success) HttpResponseStatus.OK else HttpResponseStatus.NOT_FOUND)
val response = DefaultFullHttpResponse(HttpVersion.HTTP_1_1, if (success) HttpResponseStatus.OK else HttpResponseStatus.NOT_FOUND, Unpooled.copiedBuffer(dataAnswer))
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes())
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
override fun channelRead(ctx: ChannelHandlerContext?, msg: Any?) {
super.channelRead(ctx, msg)
}
override fun channelRead0(ctx: ChannelHandlerContext, msg: Any) {
if (msg is HttpRequest) {
this.url = msg.uri()
// sb.append("" + msg.method() + " " + msg.protocolVersion() + "\n" + msg.uri())
// for (header in msg.headers()) {
// sb.append(header.key + ":" + header.value + "\n")
// }
}
if (msg is DefaultHttpContent) {
if (msg is HttpContent) {
val contentsBytes = msg.content();
contentBytes = ByteArray(contentsBytes.capacity())
contentsBytes.readBytes(contentBytes)
@@ -0,0 +1,29 @@
package server
import io.netty.channel.ChannelInitializer
import io.netty.channel.ChannelPipeline
import io.netty.channel.socket.SocketChannel
import io.netty.handler.codec.http.HttpRequestDecoder
import io.netty.handler.codec.http.HttpResponseEncoder
import io.netty.handler.codec.http.HttpServerCodec
import io.netty.util.concurrent.DefaultEventExecutorGroup
import io.netty.util.concurrent.EventExecutorGroup
/**
* Created by user on 7/6/16.
*/
class Initializer : ChannelInitializer<SocketChannel> {
constructor() {
}
override fun initChannel(channel: SocketChannel) {
val p: ChannelPipeline = channel.pipeline()
p.addLast(HttpServerCodec())
// p.addLast(HttpRequestDecoder())
// p.addLast(HttpResponseEncoder())
p.addLast(Handler())
}
}
-23
View File
@@ -1,23 +0,0 @@
import server.Server
import java.awt.Robot
import java.util.*
import kotlin.concurrent.thread
import kotlin.jvm.internal.iterator
/**
* Created by user on 7/6/16.
*/
//хардкод это плохо, но пока так...:)
val port:Int = 7925
val handlerThreadsCount:Int = 100
val getLocationUrl = "getLocation"
val routeDoneUrl = "routeDone"
val setRouteUrl = "route"
val connectUrl = "connect"
fun main(args: Array<String>) {
println("server started")
val server = Server(port, handlerThreadsCount)
val serverThread = thread{server.run()}
}
+116
View File
@@ -0,0 +1,116 @@
import car.client.Client
import io.netty.bootstrap.ServerBootstrap
import io.netty.buffer.Unpooled
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioServerSocketChannel
import io.netty.handler.codec.http.*
import objects.Car
import proto.car.RouteP
import java.util.*
import kotlin.concurrent.thread
/**
* Created by user on 7/6/16.
*/
//хардкод это плохо, но пока так...:)
val carServerPort: Int = 7925
val webServerPort: Int = 7926
val handlerThreadsCount: Int = 100
val getLocationUrl = "getLocation"
val routeDoneUrl = "routeDone"
val setRouteUrl = "route"
val connectUrl = "connect"
fun main(args: Array<String>) {
println("car server started")
val serverCarThread = thread {
val bossGroup = NioEventLoopGroup(1)
val workerGroup = NioEventLoopGroup()
val b = ServerBootstrap()
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel().javaClass)
.childHandler(car.server.Initializer(handlerThreadsCount))
try {
val channel = b.bind(carServerPort).sync().channel()
channel.closeFuture().sync()
} catch (e: InterruptedException) {
println("car server stoped!")
e.printStackTrace()
} finally {
bossGroup.shutdownGracefully()
workerGroup.shutdownGracefully()
}
}
// val serverWebThread = thread {
// val bossGroup = NioEventLoopGroup(1)
// val workerGroup = NioEventLoopGroup()
// val b = ServerBootstrap()
// b.group(bossGroup, workerGroup)
// .channel(NioServerSocketChannel().javaClass)
// .childHandler(web.server.Initializer(handlerThreadsCount))
//
// try {
// val channel = b.bind(webServerPort).sync().channel()
// channel.closeFuture().sync()
// } catch (e: InterruptedException) {
// println("web server stoped!")
// } finally {
// bossGroup.shutdownGracefully()
// workerGroup.shutdownGracefully()
// }
// }
val serverWebThread = thread {
val environment = objects.Environment.instance
val scanner = Scanner(System.`in`)
while (scanner.hasNext()) {
val s = scanner.nextLine()
if (s.equals("cars", true)) {
synchronized(environment, {
println(environment.map.values)
})
} else if (s.equals("pathto", true)) {
println("print datas. format: [string id] [double distance] [double angle]")
val data = scanner.nextLine()
val datas = data.split(" ")
try {
val id = datas[0]
val distance = datas[1].toDouble()
val angle = datas[2].toDouble()
val car: Car? =
synchronized(environment, {
environment.map.get(id)
})
if (car != null) {
val wayPoint = RouteP.Route.WayPoint.newBuilder().setDistance(distance).setAngleDelta(angle).build()
val route = RouteP.Route.newBuilder().addWayPoints(wayPoint).build()
val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, setRouteUrl, Unpooled.copiedBuffer(route.toByteArray()))
request.headers().set(HttpHeaderNames.HOST, car.host)
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes())
Client.sendRequest(request, car.host, car.port, id)
}
} catch (e: Exception) {
e.printStackTrace()
println("incorrect format")
}
} else if (s.equals("refloc", true)) {
val cars = synchronized(environment, {environment.map.values})
for (car in cars) {
val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, getLocationUrl, Unpooled.EMPTY_BUFFER)
request.headers().set(HttpHeaderNames.HOST, car.host)
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes())
Client.sendRequest(request, car.host, car.port, car.id)
}
}
}
}
}
+40
View File
@@ -0,0 +1,40 @@
package car.client
import io.netty.bootstrap.Bootstrap
import io.netty.channel.ChannelFutureListener
import io.netty.channel.ChannelInitializer
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.http.HttpRequest
import io.netty.util.AttributeKey
/**
* Created by user on 7/8/16.
*/
object Client {
val bootstrap: Bootstrap = makeBootstrap()
private fun makeBootstrap(): Bootstrap {
val group = NioEventLoopGroup();
val b = Bootstrap();
b.group(group).channel(NioSocketChannel().javaClass).handler(ClientInitializer())
.attr(AttributeKey.newInstance<String>("url"), "")
.attr(AttributeKey.newInstance<String>("uid"), "")
return b
}
fun sendRequest(request: HttpRequest, host: String, port: Int, carUid: String) {
try {
bootstrap.attr(AttributeKey.valueOf<String>("url"), request.uri())
bootstrap.attr(AttributeKey.valueOf<String>("uid"), carUid)
val ch = bootstrap.connect(host, port).sync().channel()
ch.writeAndFlush(request)
ch.closeFuture().sync()//wait for answer
} catch (e: InterruptedException) {
}
}
}
+60
View File
@@ -0,0 +1,60 @@
package car.client
import com.google.protobuf.InvalidProtocolBufferException
import getLocationUrl
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.HttpContent
import io.netty.util.AttributeKey
import objects.Environment
import proto.car.LocationP
import setRouteUrl
import java.util.*
/**
* Created by user on 7/8/16.
*/
class ClientHandler : SimpleChannelInboundHandler<Any> {
constructor()
var contentBytes: ByteArray = ByteArray(0);
override fun channelReadComplete(ctx: ChannelHandlerContext) {
val url = ctx.channel().attr(AttributeKey.valueOf<String>("url")).get()
val carUid = ctx.channel().attr(AttributeKey.valueOf<String>("uid")).get()
val environment = Environment.instance
when (url) {
setRouteUrl -> {
}
getLocationUrl -> {
try {
val data = LocationP.Location.parseFrom(contentBytes)
synchronized(environment, {
val car = environment.map.get(carUid)
if (car != null) {
car.x = data.x
car.y = data.y
}
})
} catch (e: InvalidProtocolBufferException) {
//todo error answer
}
}
else -> {
}
}
ctx.close()
}
override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) {
if (msg is HttpContent) {
val contentsBytes = msg.content();
contentBytes = ByteArray(contentsBytes.capacity())
contentsBytes.readBytes(contentBytes)
}
}
}
@@ -0,0 +1,19 @@
package car.client
import io.netty.channel.ChannelInitializer
import io.netty.channel.socket.SocketChannel
import io.netty.handler.codec.http.HttpClientCodec
/**
* Created by user on 7/8/16.
*/
class ClientInitializer : ChannelInitializer<SocketChannel> {
constructor()
override fun initChannel(ch: SocketChannel) {
val p = ch.pipeline()
p.addLast(HttpClientCodec())
p.addLast(ClientHandler())
}
}
+95
View File
@@ -0,0 +1,95 @@
package car.server
import com.google.protobuf.InvalidProtocolBufferException
import connectUrl
import io.netty.buffer.Unpooled
import io.netty.channel.ChannelFutureListener
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.*
import objects.Car
import objects.Environment
import proto.car.ConnectP
import proto.car.ConnectP.ConnectionRequest
import proto.car.RouteDoneP.RouteDone
import routeDoneUrl
import java.util.*
/**
* Created by user on 7/6/16.
*/
class Handler : SimpleChannelInboundHandler<Any>() {
var url: String = ""
var contentBytes: ByteArray = ByteArray(0);
override fun channelReadComplete(ctx: ChannelHandlerContext) {
val environment = Environment.instance
var success = true;
var answer:ByteArray = ByteArray(0)
when (url) {
connectUrl -> {
var data: ConnectionRequest? = null
try {
data = ConnectionRequest.parseFrom(contentBytes)
} catch (e: InvalidProtocolBufferException) {
//todo error answer
}
if (data != null) {
val uid = environment.connectCar(data.ip, data.port)
answer = ConnectP.ConnectionResponse.newBuilder().setUid(uid).build().toByteArray()
}
}
routeDoneUrl -> {
var data: RouteDone? = null
try {
data = RouteDone.parseFrom(contentBytes)
} catch (e: InvalidProtocolBufferException) {
//todo error answer
}
if (data != null) {
val id = data.uid
synchronized(environment.map, {
val car = environment.map.get(id)
if (car != null) {
car.free = true
} else {
success = false
}
})
}
}
else -> {
success = false
//todo unsup operation. error answer
}
}
val response = DefaultFullHttpResponse(HttpVersion.HTTP_1_1, if (success) HttpResponseStatus.OK else HttpResponseStatus.NOT_FOUND, Unpooled.copiedBuffer(answer))
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes())
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
override fun channelRead0(ctx: ChannelHandlerContext, msg: Any) {
if (msg is HttpRequest) {
this.url = msg.uri()
}
if (msg is DefaultHttpContent) {
val contentsBytes = msg.content();
contentBytes = ByteArray(contentsBytes.capacity())
contentsBytes.readBytes(contentBytes)
}
}
override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable?) {
println("exception")
cause?.printStackTrace()
if (ctx != null) {
ctx.close()
}
}
}
+31
View File
@@ -0,0 +1,31 @@
package car.server
import io.netty.channel.ChannelInitializer
import io.netty.channel.ChannelPipeline
import io.netty.channel.socket.SocketChannel
import io.netty.handler.codec.http.HttpRequestDecoder
import io.netty.handler.codec.http.HttpResponseEncoder
import io.netty.handler.codec.http.HttpServerCodec
import io.netty.util.concurrent.DefaultEventExecutorGroup
import io.netty.util.concurrent.EventExecutorGroup
/**
* Created by user on 7/6/16.
*/
class Initializer : ChannelInitializer<SocketChannel> {
val group: EventExecutorGroup;
constructor(handlerThreadCount: Int) {
this.group = DefaultEventExecutorGroup(handlerThreadCount)
}
override fun initChannel(channel: SocketChannel) {
val p: ChannelPipeline = channel.pipeline()
p.addLast(HttpServerCodec())
// p.addLast(HttpRequestDecoder())
// p.addLast(HttpResponseEncoder())
p.addLast(group, Handler())
}
}
+14 -4
View File
@@ -1,21 +1,31 @@
package objects
import car.client.Client
/**
* Created by user on 7/7/16.
*/
class Car constructor(id: String, host: String, port: Int) {
private val id: String
private val host: String
private val port: Int
val id: String
val host: String
val port: Int
var free:Boolean
var free: Boolean
var x: Double
var y: Double
init {
this.id = id
this.host = host
this.port = port
this.free = true
x = 0.toDouble()
y = 0.toDouble()
}
override fun toString(): String {
return "$id ; x:$x; y:$y"
}
}
+19
View File
@@ -1,5 +1,7 @@
package objects
import java.util.*
/**
* Created by user on 7/7/16.
*/
@@ -16,5 +18,22 @@ class Environment private constructor() {
map = mutableMapOf();
}
@Synchronized
fun connectCar(host:String, port:Int):String {
//todo учетка памяти, тут машинки добавляются,но никогда не удаляются. Если включать и выключать одну и ту же машинку, то либо сервер зациклится, либо out of memory
//todo в зависимости от того, что кончится раньше, память или айдишники:) Может сделать поток, который мониторит раз в N минут все машинки и дропает те, которые не активны более какого-то времени?
var unique = false
val random = Random()
var stringUid = ""
while (!unique) {
stringUid = "id:" + random.nextInt(1000000)
if (map.get(stringUid) == null) {
unique = true;
}
}
map.put(stringUid, Car(stringUid, host, port))
return stringUid
}
}
-44
View File
@@ -1,44 +0,0 @@
package server
import io.netty.bootstrap.ServerBootstrap
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioServerSocketChannel
import io.netty.handler.logging.LogLevel
import io.netty.handler.logging.LoggingHandler
/**
* Created by user on 7/6/16.
*/
class Server : Runnable {
val port: Int;
val handlerThreadsCount: Int;
constructor(port: Int, handlerThreadsCount: Int) {
this.port = port
this.handlerThreadsCount = handlerThreadsCount
}
override fun run() {
val bossGroup = NioEventLoopGroup(1)
val workerGroup = NioEventLoopGroup()
val b = ServerBootstrap()
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel().javaClass)
.handler(LoggingHandler(LogLevel.INFO))
.childHandler(ServerInitializer(handlerThreadsCount))
try {
val channel = b.bind(port).sync().channel()
channel.closeFuture().sync()
} catch (e: InterruptedException) {
e.printStackTrace()
//todo
} finally {
bossGroup.shutdownGracefully()
workerGroup.shutdownGracefully()
}
}
}
+45
View File
@@ -0,0 +1,45 @@
package web.server
import connectUrl
import getLocationUrl
import io.netty.buffer.Unpooled
import io.netty.channel.ChannelFutureListener
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.*
import io.netty.util.CharsetUtil
import objects.Environment
import proto.car.ConnectP.ConnectionRequest
import proto.car.RouteDoneP
import proto.car.RouteDoneP.RouteDone
import routeDoneUrl
import setRouteUrl
import java.nio.charset.Charset
import java.text.SimpleDateFormat
import java.util.*
/**
* Created by user on 7/6/16.
*/
class Handler : SimpleChannelInboundHandler<Any>() {
var content: StringBuilder = StringBuilder()
override fun channelReadComplete(ctx: ChannelHandlerContext) {
content.setLength(0)
}
override fun channelRead0(ctx: ChannelHandlerContext, msg: Any) {
println(msg)
}
override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable?) {
println("exception")
cause?.printStackTrace()
if (ctx != null) {
ctx.close()
}
}
}
@@ -1,17 +1,18 @@
package server
package web.server
import io.netty.channel.ChannelInitializer
import io.netty.channel.ChannelPipeline
import io.netty.channel.socket.SocketChannel
import io.netty.handler.codec.http.HttpRequestDecoder
import io.netty.handler.codec.http.HttpResponseEncoder
import io.netty.handler.codec.http.HttpServerCodec
import io.netty.util.concurrent.DefaultEventExecutorGroup
import io.netty.util.concurrent.EventExecutorGroup
/**
* Created by user on 7/6/16.
*/
class ServerInitializer : ChannelInitializer<SocketChannel> {
class Initializer : ChannelInitializer<SocketChannel> {
val group: EventExecutorGroup;
@@ -21,8 +22,8 @@ class ServerInitializer : ChannelInitializer<SocketChannel> {
override fun initChannel(channel: SocketChannel) {
val p: ChannelPipeline = channel.pipeline()
p.addLast(HttpRequestDecoder())
p.addLast(HttpResponseEncoder())
p.addLast(group, ServerHandler())
p.addLast(HttpServerCodec())
p.addLast(group, Handler())
}
}