{"id":1911,"date":"2026-10-20T20:34:20","date_gmt":"2026-10-21T01:34:20","guid":{"rendered":"https:\/\/portfolio.juandiegourdaneta.com\/proyecto\/war-of-boats\/"},"modified":"2026-10-20T20:57:52","modified_gmt":"2026-10-21T01:57:52","slug":"war-of-boats","status":"publish","type":"post","link":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/","title":{"rendered":"War of Boats Friends Online"},"content":{"rendered":"<div class=\"jdu-app-case\">\n<p class=\"jdu-case-status\">Available on the App Store<\/p>\n<p>Turn-based naval battles: play against the computer offline or share a private room with a friend.<\/p>\n<p>Arrange your fleet, confirm each shot and switch between attacking and your own ships. Offline games are saved on the device; online play uses a room code.<\/p>\n<section class=\"jdu-project-depth\">\n<h2>Private rooms with Node.js, WebSocket and SQLite<\/h2>\n<p>JavaScript implements board rules and interaction. In online mode, Node.js and WebSocket connect players and SQLite preserves room state. The server validates turns and results, keeping the opposing fleet hidden until the rules allow it to be revealed.<\/p>\n<h2>What this development contributes<\/h2>\n<p>Separating offline matches from online rooms enables two different workflows. An invitation code makes it easy to play with a friend, while room recovery handles connection interruptions. This is a practical example of a turn-based game backend, where correct synchronization matters more than continuously sending all information.<\/p>\n<h2>Related projects<\/h2>\n<ul>\n<li><a href=\"\/en\/proyecto\/domino-la-mesa-del-patio\/\">Dominoes Patio: Online<\/a><\/li>\n<li><a href=\"\/en\/proyecto\/cauce\/\">Cauce: Puzzle de tuber\u00edas<\/a><\/li>\n<\/ul>\n<\/section>\n<p><a href=\"https:\/\/apps.apple.com\/us\/app\/war-of-boats-friends-online\/id6818939448\">View on the App Store<\/a><\/p>\n<p><a href=\"\/en\/portafolio\/#apps\">Back to apps<\/a><\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Turn-based naval battles: play against the computer offline or share a private room with a friend.<\/p>","protected":false},"author":0,"featured_media":1951,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-1911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyecto"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>War of Boats: juego online con Node.js y WebSocket | JDU<\/title>\n<meta name=\"description\" content=\"Batalla naval para iPhone y iPad con JavaScript, Node.js, WebSocket y SQLite. Juego offline y salas privadas con estado validado por servidor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"War of Boats: juego online con Node.js y WebSocket | JDU\" \/>\n<meta property=\"og:description\" content=\"Batalla naval para iPhone y iPad con JavaScript, Node.js, WebSocket y SQLite. Juego offline y salas privadas con estado validado por servidor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/\" \/>\n<meta property=\"og:site_name\" content=\"Desarrollador Web - Juan Diego Urdaneta\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/juandiego.urdaneta\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-21T01:34:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-21T01:57:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2026\/10\/jdu-war-of-boats-landscape-20261020.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1448\" \/>\n\t<meta property=\"og:image:height\" content=\"1086\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"War of Boats Friends Online\",\"datePublished\":\"2026-10-21T01:34:20+00:00\",\"dateModified\":\"2026-10-21T01:57:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/\"},\"wordCount\":196,\"publisher\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/#\\\/schema\\\/person\\\/c972b2f4bedf5e89a0a1cbaeeee8798a\"},\"image\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/jdu-war-of-boats-landscape-20261020.webp\",\"articleSection\":[\"Proyecto\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/\",\"url\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/\",\"name\":\"War of Boats: juego online con Node.js y WebSocket | JDU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/jdu-war-of-boats-landscape-20261020.webp\",\"datePublished\":\"2026-10-21T01:34:20+00:00\",\"dateModified\":\"2026-10-21T01:57:52+00:00\",\"description\":\"Batalla naval para iPhone y iPad con JavaScript, Node.js, WebSocket y SQLite. Juego offline y salas privadas con estado validado por servidor.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#primaryimage\",\"url\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/jdu-war-of-boats-landscape-20261020.webp\",\"contentUrl\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/jdu-war-of-boats-landscape-20261020.webp\",\"width\":1448,\"height\":1086,\"caption\":\"War of Boats Friends Online\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/proyecto\\\/war-of-boats\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"War of Boats Friends Online\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/\",\"name\":\"Juan Diego Urdaneta\",\"description\":\"Apps, desktop software, web platforms and business automation. Remote projects in English and Spanish.\",\"publisher\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/#\\\/schema\\\/person\\\/c972b2f4bedf5e89a0a1cbaeeee8798a\"},\"alternateName\":\"App and custom software development\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/juandiegourdaneta.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/#\\\/schema\\\/person\\\/c972b2f4bedf5e89a0a1cbaeeee8798a\",\"name\":\"Juan Diego Urdaneta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-webdeveloper.jpg\",\"url\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-webdeveloper.jpg\",\"contentUrl\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-webdeveloper.jpg\",\"width\":500,\"height\":290,\"caption\":\"Juan Diego Urdaneta\"},\"logo\":{\"@id\":\"https:\\\/\\\/juandiegourdaneta.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-webdeveloper.jpg\"},\"sameAs\":[\"https:\\\/\\\/juandiegourdaneta.com\",\"https:\\\/\\\/www.facebook.com\\\/juandiego.urdaneta\\\/\",\"https:\\\/\\\/www.instagram.com\\\/juandiegouo\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/juandiegouo\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"War of Boats: Node.js and WebSocket online game | JDU","description":"An iPhone and iPad naval game using JavaScript, Node.js, WebSocket and SQLite. Offline play and private rooms with server-validated state.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/","og_locale":"en_US","og_type":"article","og_title":"War of Boats: juego online con Node.js y WebSocket | JDU","og_description":"Batalla naval para iPhone y iPad con JavaScript, Node.js, WebSocket y SQLite. Juego offline y salas privadas con estado validado por servidor.","og_url":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/","og_site_name":"Desarrollador Web - Juan Diego Urdaneta","article_publisher":"https:\/\/www.facebook.com\/juandiego.urdaneta\/","article_published_time":"2026-10-21T01:34:20+00:00","article_modified_time":"2026-10-21T01:57:52+00:00","og_image":[{"width":1448,"height":1086,"url":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2026\/10\/jdu-war-of-boats-landscape-20261020.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#article","isPartOf":{"@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/"},"author":{"name":"","@id":""},"headline":"War of Boats Friends Online","datePublished":"2026-10-21T01:34:20+00:00","dateModified":"2026-10-21T01:57:52+00:00","mainEntityOfPage":{"@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/"},"wordCount":196,"publisher":{"@id":"https:\/\/juandiegourdaneta.com\/#\/schema\/person\/c972b2f4bedf5e89a0a1cbaeeee8798a"},"image":{"@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#primaryimage"},"thumbnailUrl":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2026\/10\/jdu-war-of-boats-landscape-20261020.webp","articleSection":["Proyecto"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/","url":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/","name":"War of Boats: Node.js and WebSocket online game | JDU","isPartOf":{"@id":"https:\/\/juandiegourdaneta.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#primaryimage"},"image":{"@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#primaryimage"},"thumbnailUrl":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2026\/10\/jdu-war-of-boats-landscape-20261020.webp","datePublished":"2026-10-21T01:34:20+00:00","dateModified":"2026-10-21T01:57:52+00:00","description":"An iPhone and iPad naval game using JavaScript, Node.js, WebSocket and SQLite. Offline play and private rooms with server-validated state.","breadcrumb":{"@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#primaryimage","url":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2026\/10\/jdu-war-of-boats-landscape-20261020.webp","contentUrl":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2026\/10\/jdu-war-of-boats-landscape-20261020.webp","width":1448,"height":1086,"caption":"War of Boats Friends Online"},{"@type":"BreadcrumbList","@id":"https:\/\/juandiegourdaneta.com\/en\/proyecto\/war-of-boats\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/juandiegourdaneta.com\/en\/"},{"@type":"ListItem","position":2,"name":"War of Boats Friends Online"}]},{"@type":"WebSite","@id":"https:\/\/juandiegourdaneta.com\/en\/#website","url":"https:\/\/juandiegourdaneta.com\/en\/","name":"Juan Diego Urdaneta","description":"Apps, desktop software, web platforms and business automation. Remote projects in English and Spanish.","publisher":{"@id":"https:\/\/juandiegourdaneta.com\/#\/schema\/person\/c972b2f4bedf5e89a0a1cbaeeee8798a"},"alternateName":"App and custom software development","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/juandiegourdaneta.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/juandiegourdaneta.com\/#\/schema\/person\/c972b2f4bedf5e89a0a1cbaeeee8798a","name":"Juan Diego Urdaneta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2024\/11\/cropped-webdeveloper.jpg","url":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2024\/11\/cropped-webdeveloper.jpg","contentUrl":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2024\/11\/cropped-webdeveloper.jpg","width":500,"height":290,"caption":"Juan Diego Urdaneta"},"logo":{"@id":"https:\/\/juandiegourdaneta.com\/wp-content\/uploads\/2024\/11\/cropped-webdeveloper.jpg"},"sameAs":["https:\/\/juandiegourdaneta.com","https:\/\/www.facebook.com\/juandiego.urdaneta\/","https:\/\/www.instagram.com\/juandiegouo","https:\/\/www.linkedin.com\/in\/juandiegouo\/"]}]}},"_links":{"self":[{"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/posts\/1911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/comments?post=1911"}],"version-history":[{"count":2,"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/posts\/1911\/revisions"}],"predecessor-version":[{"id":1919,"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/posts\/1911\/revisions\/1919"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/media\/1951"}],"wp:attachment":[{"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/media?parent=1911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/categories?post=1911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juandiegourdaneta.com\/en\/wp-json\/wp\/v2\/tags?post=1911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}