The Wayback Machine - https://web.archive.org/web/20180630233725/http://nodecode.de:80/chat-nodejs-websocket

Tutorial: Einfacher Chat mit Node.js und WebSocket

nodejs-chatIn diesem Node.js-Tutorial entwickle ich eine einfache Webanwendung, in der die Benutzer chatten können. Zum Einsatz kommen dabei Node.js, Soket.IO und jQuery. Als Ergebnis sollen die Benutzer einen Namen wählen, Nachrichten eingeben und absenden, und der Server soll diese mittels einer WebSocket-Verbindung an alle (anderen) Nutzer verteilen können.

Ich werde in folgendem die komplette Anwendung entwickeln, also sowohl den Server als auch den Client, der wiederum aus HTML, JavaScript und CSS besteht. Es geht hierbei in erster Linie um das Verständnis der Funktionsweise und des Entwicklungsprozesses, die Anwendung wird deswegen bewusst einfach und überschaubar gehalten.

Den Quellcode des ganzem veröffentliche ich als Open-Source-Projekt auf Github.

Vorbereitung #

Als erstes erstelle ich die package.json-Datei. in dieser befinden sich Informationen zur Anwendung wie z.B. der Name, sowie die benötigten Node.js-Module. Für diese Anwendung brauche ich genau zwei zusätzliche Module: Express und Socket.io. Die fertige package.json sieht wie folgt aus:

{
	"name": "Node.js-Chat",
	"description": "Ein einfacher Chat mit Node.js",
	"author": "NodeCode.de",
	"dependencies" : {
		"express": "3.x",
		"socket.io": "*"
	}
}

Danach lade ich mir die clientseitige JavaScript-Bibliothek jQuery herunter. Da ich möglichst viele Browser unterstützen möchte, wähle ich die Version 1.x, da diese im Gegensatz zu der 2.x auch den Internet Explorer 6, 7 und 8 unterstützt. Socket.io bietet übrigens Fallback-Alternativen zu WebSocket an, sodass der Internet Explorer ab Version 5.5+ von Socket.io unterstützt wird.

Zudem erstelle ich mir schonmal alle weiteren Dateien, die ich benötigen werden. Alle öffentlichen Daten, die der Webserver zukünftig ausgeben wird, landen im Ordner public. Eine Übersicht aller (wichtigen) Dateien:

  • package.json – Infos zum Projekt wie der Name und die vom Server benötigten Module
  • server.js – unser Node.js-Server
  • config.json – die Konfiguration für den Server
  • public/ – der Ordner für die öffentlichen Dateien
  • public/index.html – unsere HTML-Datei
  • public/style.css – unsere Stylesheet-Datei
  • public/client.js – unsere clientseitige JavaScript-Datei
  • public/jquery.min.js – die minifizierte jQuery-Bibliothek

Server #

Der Node.js-Server besteht aus genau zwei Dateien: server.js und config.json. Während server.js der eigentliche Server ist, enthält die config.json die Konfiguration des Servers. Da ich die Anwendung möglichst einfach halte, wird nur der Port mit der config.json konfiguriert. Ich fülle sie deswegen gleich als erstes mit dem Inhalt:

{
	"port": 8080
}

Weiter geht es mit dem eigentlichem Server. Hierbei lade ich in den ersten 5 Zeilen die benötigten Module sowie die soeben erstellte config.json in die Anwendung.

var express = require('express')
,   app = express()
,   server = require('http').createServer(app)
,   io = require('socket.io').listen(server)
,   conf = require('./config.json');

Dann binde ich den Webserver an die sich in der Konfigurationsdatei befindende Portnummer:

server.listen(conf.port);

Als nächstes weise ich Express dazu an, Dateien die sich im Ordner public befinden, bei Anfrage an den Besucher auszugeben:

app.configure(function(){
	// statische Dateien ausliefern
	app.use(express.static(__dirname + '/public'));
});

Und wenn der Pfad / aufgerufen wird, soll die Datei index.html ausgegeben werden:

// wenn der Pfad / aufgerufen wird
app.get('/', function (req, res) {
	// so wird die Datei index.html ausgegeben
	res.sendfile(__dirname + '/public/index.html');
});

Websocket #

Danach kommen wir zum eigentlichem Teil des Servers, nämlich der WebSocket-, oder besser gesagt Socket.io-Verbindung. Sobald sich ein Client verbindet, wird die Nachricht Du bist nun mit dem Server verbunden! gesendet. Der Client wird zukünftig ein Objekt mit den Attributen zeit, text und – sofern es sich nicht um die Verbindungs-Meldung handelt – name erwarten.

Außerdem muss dafür gesorgt werden, dass sobald ein Benutzer etwas sendet, dies über den Server an alle Benutzer verteilt wird. Zuletzt beschriebenes geschieht im folgenden ab Zeile 5:

io.sockets.on('connection', function (socket) {
	// der Client ist verbunden
	socket.emit('chat', { zeit: new Date(), text: 'Du bist nun mit dem Server verbunden!' });
	// wenn ein Benutzer einen Text senden
	socket.on('chat', function (data) {
		// so wird dieser Text an alle anderen Benutzer gesendet
		io.sockets.emit('chat', { zeit: new Date(), name: data.name || 'Anonym', text: data.text });
	});
});

In Zeile 5 warten wir mit der Funktion socket.on() auf eine eingehende Websocket-Nachricht, die den Namen chat hat, und binden diese an eine Rückruf-Funktion. Die empfangenen Daten werden dabei in der Variable data gespeichert. Über die Funktion io.sockets.emit() verteilen wir anschließend den aktuellen Zeitstempel, den empfangenen Namen und den empfangenen Text an alle Benutzer, wobei als Name Anonym verwendet wird, wenn kein Name angegeben wurde.

Im Grunde funktioniert der Server ziemlich einfach, denn die Hauptarbeit wird im Client erledigt. Hier noch einmal die gesamten 34 Zeilen der Datei server.js:

var express = require('express')
,   app = express()
,   server = require('http').createServer(app)
,   io = require('socket.io').listen(server)
,   conf = require('./config.json');

// Webserver
// auf den Port x schalten
server.listen(conf.port);

app.configure(function(){
	// statische Dateien ausliefern
	app.use(express.static(__dirname + '/public'));
});

// wenn der Pfad / aufgerufen wird
app.get('/', function (req, res) {
	// so wird die Datei index.html ausgegeben
	res.sendfile(__dirname + '/public/index.html');
});

// Websocket
io.sockets.on('connection', function (socket) {
	// der Client ist verbunden
	socket.emit('chat', { zeit: new Date(), text: 'Du bist nun mit dem Server verbunden!' });
	// wenn ein Benutzer einen Text senden
	socket.on('chat', function (data) {
		// so wird dieser Text an alle anderen Benutzer gesendet
		io.sockets.emit('chat', { zeit: new Date(), name: data.name || 'Anonym', text: data.text });
	});
});

// Portnummer in die Konsole schreiben
console.log('Der Server läuft nun unter http://127.0.0.1:' + conf.port + '/');

Client #

Nun beginne ich also mit dem Client. Hier haben wir gleich drei Dateien, die wir füllen müssen: die index.html, style.css und client.js.

HTML5 #

Das Grundgerüst der Webanwendung wird in HTML geschrieben. Im folgenden verwende ich die neuste Version – HTML5, zu erkennen an dem kurzen <!DOCTYPE html> und den semantischen HTML-Tags <header> und <footer>.

Viel gibt es zur index.html nicht zu sagen, denn es werden im Grunde nur die Eingabefelder, der Senden-Button und die restlichen Elemente erstellt, sowie die style.css und alle JavaScript-Dateien angefordert. Die gesamte index.html sieht wie folgt aus:

<!DOCTYPE html>
<html>
    <head>
        <title>Node.js Chat</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="style.css" />
        <script src="socket.io/socket.io.js"></script>
        <script src="jquery.min.js"></script>
        <script src="client.js"></script>
    </head>
    <body>
        <header>Node.js Chat <a href="http://nodecode.de/">von NodeCode</a></header>
        <ul id="content"></ul>
        <footer>
            <input id="name" type="text" placeholder="dein Name" />
            <input id="text" type="text" placeholder="schreibe etwas..." />
            <input id="senden" type="submit" value="senden" />
        </footer>
    </body>
</html>

Design (CSS) #

Weiter geht es mit dem Design, der style.css. Hierzu gibt es noch weniger zu sagen, da man Design schlecht in Worte fassen kann. Die Elemente <header> und <footer> bekommen eine grüne Hintergrundfarbe, und alles wird an die richtigen Pixel gerückt.

Die Eingabe-Felder und der Absenden-Button werden (bis in der Größe) im standard-Style des Browsers gelassen, da es sich hierbei um eine Demonstration eines Node.js-Chats handelt, und nicht um einen Design-Wettbewerb. 😀nodejs-chat

Hier noch einmal ein Screenshot der fertigen Anwendung – rechts als Bild, und unten der komplette Inhalt der style.css:

body{
	margin: 0;
	padding: 0;
	font: 16px "Helvetica neue", Helvetica, Arial, sans-serif;
	color: #333;
}
header, footer{
	display: block;
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: auto;
	padding: 0 0.5em;
	background-color: #8BC84B;
	font-size: 24px;
	line-height: 2em;
	height: 2em;
	color: #fff;
}
header{
	font-weight: bold;
}
header > a:last-child{
	float: right;
	color: #fff;
	font-weight: normal;
}
footer{
	top: auto;
	bottom: 0;
}
input{
	height: 1.5em;
	font-size: 14px;
}
#content{
	margin: 48px 0.5em;
	list-style: none;
}

JavaScript #

Kommen wir nun zum entscheidenden Teil der Anwendung, dem JavaScript. Das Script soll erst dann ausgeführt werden, soll die Website komplett geladen ist. Daher füge ich als erstes eine Rückruf-Funktion

$(document).ready(function(){

});

ein, welche den nachfolgenden Script umschließt und dann ausgeführt wird, sobald die Website zu Ende geladen hat.

Jetzt müssen wir zunächst eine Verbindung zum WebSocket-Server herstellen, dies geschieht mit:

var socket = io.connect();

Sobald der Client eine Nachricht vom Server erhält, muss diese ausgegeben werden. In diesem Fall wird ein neues Element der Liste #content hinzugefügt. Mehr gibt es dazu nicht zu sagen, außer dass zum Schluss noch nach unten gescrollt wird, sofern dies erforderlich ist.

socket.on('chat', function (data) {
    var zeit = new Date(data.zeit);
    $('#content').append(
        $('<li></li>').append(
            // Uhrzeit
            $('<span>').text('[' +
                (zeit.getHours() < 10 ? '0' + zeit.getHours() : zeit.getHours())
                + ':' +
                (zeit.getMinutes() < 10 ? '0' + zeit.getMinutes() : zeit.getMinutes())
                + '] '
            ),
            // Name
            $('<b>').text(typeof(data.name) != 'undefined' ? data.name + ': ' : ''),
            // Text
            $('<span>').text(data.text))
    );
    // nach unten scrollen
    $('body').scrollTop($('body')[0].scrollHeight);
});

Da wir Nachrichten nicht nur empfangen sondern auch senden wollen, definiere ich als nächstes eine Funktion senden(). Diese ließt die Werte der Felder #name und #text aus, und sendet sie anschließen an den Server. Abschließend wird der Inhalt des Feldes #text wieder geleert.

function senden(){
	// Eingabefelder auslesen
	var name = $('#name').val();
	var text = $('#text').val();
	// Socket senden
	socket.emit('chat', { name: name, text: text });
	// Text-Eingabe leeren
	$('#text').val('');
}

Die Funktion senden() soll in zwei Fällen aufgerufen werden: Entweder wenn der Button #senden geklickt wird, oder wenn die Enter-Taste innerhalb des Eingabe-Feldes gedrückt wird. Der Code dazu ist ziemlich einfach:

// bei einem Klick
$('#senden').click(senden);
// oder mit der Enter-Taste
$('#text').keypress(function (e) {
	if (e.which == 13) {
		senden();
	}
});

Und damit ist auch die client.js fertig. Hier noch einmal der vollständige Code:

$(document).ready(function(){
    // WebSocket
    var socket = io.connect();
    // neue Nachricht
    socket.on('chat', function (data) {
        var zeit = new Date(data.zeit);
        $('#content').append(
            $('<li></li>').append(
                // Uhrzeit
                $('<span>').text('[' +
                    (zeit.getHours() < 10 ? '0' + zeit.getHours() : zeit.getHours())
                    + ':' +
                    (zeit.getMinutes() < 10 ? '0' + zeit.getMinutes() : zeit.getMinutes())
                    + '] '
                ),
                // Name
                $('<b>').text(typeof(data.name) != 'undefined' ? data.name + ': ' : ''),
                // Text
                $('<span>').text(data.text))
        );
        // nach unten scrollen
        $('body').scrollTop($('body')[0].scrollHeight);
    });
    // Nachricht senden
    function senden(){
        // Eingabefelder auslesen
        var name = $('#name').val();
        var text = $('#text').val();
        // Socket senden
        socket.emit('chat', { name: name, text: text });
        // Text-Eingabe leeren
        $('#text').val('');
    }
    // bei einem Klick
    $('#senden').click(senden);
    // oder mit der Enter-Taste
    $('#text').keypress(function (e) {
        if (e.which == 13) {
            senden();
        }
    });
});

Schlusswort #

Nun ist die gesamte Chat-Anwendung fertig. Ich habe vor allem auf der Seite des Servers nur sehr wenige Zeilen Code benötigt, da die meiste Arbeit von den Modulen erledigt wird. Dies ist ein großer Vorteil der Node.js-Module, welcher vor allem bei größeren Anwendungen deutlich sichtbar ist. Man muss sich nicht immer wieder mit grundlegenden Standard-Aufgaben beschäftigen, und kann sich stattdessen gleich auf die eigentlichen Aufgaben der Anwendung konzentrieren. Wahrscheinlich sind alle hiermit geschriebenen Dateien sogar kleiner als der Text dieses Tutorials, den du momentan ließt. Die Code-Boxen logischerweise ausgenommen. 😉

Du kannst die vollständige Anwendung auf GitHub durchblättern oder dir das Projekt herunterladen. Beachte dabei, dass du nach dem herunterladen noch die nötigen Module installieren musst. Dafür musst du dich mit der Konsole einfach in das Verzeichnis der Anwendung begeben und den Befehl npm install eingeben, die benötigten Module werden dabei automatisch aus der package.json ausgelesen und installiert. Um anschließend den Server zu starten, musst du den Befehl node server.js eingeben. Danach ist die Anwendung über die Adresse http://127.0.0.1:8080/ zu erreichen. Genauere Informationen zur Konsole findest du auf der Seite Konsolen Grundlagen.

Dies war der aufwendigste und zweitintensivste Artikel den ich bisher geschrieben habe, daher interessiert es mich um so mehr ob sich dieser Aufwand geloht hat und mehr solcher Tutorials gewünscht sind. Falls du Fragen hast oder du einen Fehler gefunden hast, kannst du selbstverständlich auch dafür die Kommentar-Funktion unter diesem Artikel nutzen.

VN:F [1.9.22_1171]
Bewertung: 4.8/5 (217 Bewertungen)
Tutorial: Einfacher Chat mit Node.js und WebSocket, 4.8 out of 5 based on 217 ratings
Regelmäßige Beiträge über Node.js

nodecodeAbonniere den kostenlosen NodeCode-Newsletter, und bleibe auf dem laufenden über neue Beiträge zum Thema Node.js. Darunter:

  • Informationen und Neuigkeiten rund um Node.js und zugehörigen Modulen
  • Vorstellung von interessanten Frameworks und Bibliotheken
  • Anleitungen und Tutorials zu Node.js und weiterführenden Technologien
  • Sowie vieles mehr...

schon 131 Kommentare gehe zum kommentieren

  1. BarbaraLor /

    Социальные сети сегодня – это одно из самых значительных территорий для ведения бизнеса, подачи рекламы и всего того, что касается привлечения большого количества людей . ВКонтаке, Инстаграм, YouTube – вот одни из самых развитых площадок. Проект smmdroid.ru предлагает без лишних затруднений не только раскрутить сообщество или стену в VK, собрать подписчиков, набрать лайки и «пальцы вверх» в YouTube, но и автоматически там зарабатывать настоящие деньги. Благодаря smmdroid, можно насладиться качественным результатом , и в отличие от конкурентов, наш Seo-группа, как уже было сказано , позволяет получить и вывести деньги. Все зависит лишь от желания и предпочтений.

  2. NikaPaids /

    Металлические строительные леса
    Леса из стальных или алюминиевых труб производятся промышленным способом в двух основных вариантах — рамные и модульные. К рамным относятся флажковые, штыревые леса и вышки-туры, к модульным — клиновые, хомутовые, подвесные (крепление к несущим конструкциям зданий) и модульные (системные) леса. Конструкция строительных лесов, не зависимо от их типа, должна соответствовать ГОСТ 27321-87, ГОСТ 24258-88 и храниться по ГОСТ 15150-69.
    Важно: прежде, чем перейти к подробному описанию металлических строительных лесов, нужно отметить сразу — все они требуют анкерного крепления к стене здания, вдоль или вокруг которого выставляются! Наибольшая высота, на которую возможно вывести строительные леса без крепления к стене здания, не должна превышать 4 м и только при условии, если площадка, на которой выстраиваются леса — идеально горизонтальна и утрамбована, обязательно организован отвод дождевых вод. Не соблюдение этого правила приведет к опрокидыванию или обрушению всей конструкции лесов. Где можно найти и леса строительные цена
    Рамные или флажковые строительные леса (нормативная нагрузка — 200 кг/м2)
    В их комплект входят: боковые рамы (с лестницей и без нее), стойки для диагонального и горизонтального крепления боковых рам между собой, башмаки для опоры на грунт — все эти элементы выполнены из стали. Размеры рам, установочная дистанция меж ними у каждого производителя несколько различаются, схема построения при этом одинакова.
    Этот тип лесов популярен по двум причинам — они дешевы и просты в сборке. Крепежи рамных лесов заводятся в предназначенные для них отверстия и фиксируются поворотом «флажка». По вертикали элементы лесов соединяются вводом вышестоящей рамы в гнездо расположенной ниже, без дополнительной фиксации.
    Строительные леса рамные предназначены для кладочных и отделочных работ на прямых фасадах зданий, их высота сборки не должна превышать 50 м (для кладки — 20-25 м, для отделки — 40 м).
    Перед тем, как приступить к установке рамных лесов, следует обдумать схему их построения и расположение ярусов с лестницами (лучше начертить), выяснить виды и количество необходимых элементов конструкции лесов.
    Сборка рамных лесов происходит в следующем порядке:
    1. На готовой площадке отмеряются отрезки между рамами (как правило, шаг равен 3 м) и выкладываются опорные доски-лежни, поверху — стальные башмаки. В них заводятся рамы, образующие первый ярус лесов. Их выставляют строго вертикально — по отвесу, соединяют раскосами и стяжками;
    2. Второй ярус — соединение вертикальных рам с нижним ярусом, фиксация их диагональными/горизонтальными стяжками (используются уровень и отвес). Для будущей укладки настилов выставляются горизонтальные ребра ригелей. С первого по завершающий (наивысший) ярус диагональные стяжки необходимо устанавливать в шахматном порядке, т.е. их местоположение не должно быть одинаково с соседними секциями ярусов по вертикали;
    3. Установка лестничных конструкций, расположенных под углом (рабочие могут подниматься и по вертикальным лестницам, встроенным в рамы, но это не удобно и затрудняет ход работ). Наклонные лестницы выставляются по мере подъема ярусов;
    4. Обязательное крепление возводимой конструкции лесов к зданию с использованием крюков с втулками, анкерами-пробками, надежно соединяющими рамы лесов со стеной (проверить!). Крепление лесов со стеной выполнить в шахматном порядке, шаг — 4 м;
    5. Вывод ярусов строительных лесов на необходимую высоту, повторяя описанные выше операции (начиная со 2-го яруса);
    6. В торцах собранных лесов выставляются торцевые связи-штанги, по всей длине ярусов, в тех секциях, где нет диагональных стяжек — установить продольные (горизонтальные) связи, выступающие в роли ограждения.
    Демонтаж строительных лесов выполняется в обратном порядке, по направлению сверху-вниз.
    Широко представленные на строительном рынке рамные леса предлагаются по средней цене в 170 руб. за м2, их месячная аренда обойдется в 60 руб. за м2.
    Штыревые строительные леса (нормативная нагрузка — 200 кг/м2)
    По своей конструкции и технике сборки эти леса так же просты, как и рамные — их горизонтальные элементы крепятся вводом штырей в полые трубки-проушины, приваренные к вертикальным стойкам. Нижние опоры стоек рам заводятся в башмаки, каждый новый уровень собирается поэтапно, большую жесткость лесам придают раскосы, устанавливаемые диагонально.
    Штыревые леса выстраиваются до 40 метровой высоты, их применяют в основном при кладочных и редко — в отделочных работах. При всей простоте и надежности, этот тип лесов допускает комбинирование их с хомутовыми лесами, благодаря чему удается выстроить сложные каркасные схемы.
    Среднерыночная стоимость лесов этого типа — 550 руб. за м2, аренда — 100 руб. за м2 в месяц. Причина более высокой по сравнению с рамными (флажковыми) лесами стоимости — способность к большим нагрузкам, т.к. в их конструкции применяются стальные трубы со значительной толщиной стенки (к примеру, ЛШ 100 — диаметр стальной трубы 57 мм, стенка — 3,5 мм).
    Строительные леса Вишнева (нормативная нагрузка — 200-250 кг/м2)
    Рамы этих лесов устанавливаются при сборке не в вертикальном, а в горизонтальном положении. Они соединяют вертикальные стойки сразу над башмаками основания, а в каждом новом ярусе служат опорой для настила. Усиление конструкции лесов Вишнева не требует диагональных связей, это единственный тип строительных лесов, не нуждающийся в них.
    Лестницы строительных лесов Вишнева не встроены в раму, они — самостоятельный элемент, устанавливаемый под углом внутри конструкции лесов. Лестницы и рамы ограждения оснащены штырями, которые заводятся в проушины стоек (аналогично креплению связей у штыревых лесов).
    Леса Вишнева предназначены для реставрационных и отделочных работ на высоте до 40 м как внутри, так и снаружи зданий. Начиная со второго яруса стойки этих лесов необходимо закрепить на стене, по горизонтали с шагом 6 м, по вертикали — на каждом ярусе (используются анкера, костыли и стальная проволока, оттяжки и кронштейны).
    Их средняя стоимость — 300 руб. за м2, цена месячной аренды — 80 руб. за м2.
    Клиновые строительные леса (нормативная нагрузка — 200-300 кг/м2)
    Эти леса устроены более сложно, чем описанные выше — составляющие их элементы фиксируются стальными клиньями, вбиваемыми/выбиваемыми молотком. Такой тип крепления многократно повышает надежность лесов, они способны нести большую нагрузку, чем рамные или штыревые леса.
    Форма клина, которым соединяются стойки и ригели клиновых лесов, не допускает самопроизвольного расклинивания, а фланцевые замки на стойках снабжены восемью отверстиями — для построения лесов необходимой пространственной формы. При демонтаже лесов извлеченные из соединений клинья вкладываются в особые отверстия, которыми снабжены стойки.
    Максимальная высота, на которую поднимаются клиновые строительные леса — 40 м. Их используют как в строительно-отделочных работах, в том числе и высотных, так и для временных конструкций общественного назначения — зрительных трибун и концертных сцен, лестничных спусков. Этот тип лесов популярен у судо/авиастроителей.
    Цена за м2 клиновых лесов в среднем составляет 200 руб., аренда м2 обойдется в 80 руб. за месяц.
    Хомутовые строительные леса (нормативная нагрузка — 200-250 кг/м2)
    Один из первых видов строительных лесов. Все сборные элементы этих лесов соединяют хомуты — поворотные (повторные) и глухие. Они сложны в сборке, но и высота, на которую их вывести, двукратно превышает возможности прочих видов лесов — 80 м. Стойки и ригели заводятся в хомуты, которые после затягивают резьбовыми болтами.
    Этот тип лесов дает доступ к любой пространственной конструкции, будь то купола или сложные архитектурные выступы, создающие для рамных, штыревых или клиновых лесов «мертвые зоны» по периметру. Возможности построения ярусов любой высоты, комбинирование с любыми типами металлических лесов — все это оправдывает их достаточно высокую цену и сложную сборку.
    Нужно отметить, что хомутовые строительные леса производятся в двух вариантах, различающихся по диаметру профиля: «профессиональные» — используется стальная труба сечением 57 мм; «облегченные» — диаметр труб 48 мм. Как правило, при сборке хомутовых лесов используются оба типоразмера стоек — 2 м и 4 м, чередуемые при монтаже. Продольные связи также двух размеров (3,6 и 5 м) и так же чередуемы.
    Хомутовые леса стоят порядка 450 руб. за м2, арендная цена — 75 руб./м2/месяц.
    Леса строительные подвесные (нормативная нагрузка — 200 кг/м2)
    Опорой для лесов этой конструкции служит само здание (его перекрытия), т.е. нижний их ярус не касается земли. В тех случаях, когда частичное или полное отсутствие места подле здания не позволяет установить ни один другой вариант лесов, подвесные леса незаменимы. Помехи в виде пристроек, значительная высота объекта, архитектурные элементы слабой прочности, потребность в окружении лесами всего периметра здания, одновременное ведение коммуникационных и ландшафтных работ (сжатые сроки) — все это задачи для подвесных лесов. Они применяются при отделочно-реставрационных работах.
    Выступающие наружу элементы подвесных лесов надежно удерживают консоли (материал — швеллер â„–10), закрепленные в распорку между перекрытиями, их соединяют между собой поперечины и связи на хомутах. Другими словами, за исключением опорных консолей, подвесные леса в остальном являются вариацией хомутовых строительных лесов (1,5″ поперечины и связи, 2″ стойки, 2,5 мм стенка стальных труб).
    Каждый новый ярус соединен с консолями на совпадающим с ним этаже здания и с нижним ярусом, вертикальные стойки обязательно крепить анкерами к стенам (шаг 4 м).
    Приобрести в готовом виде можно лишь часть подвесных лесов — ту, что образует внешние ярусы, т.е. элементы хомутовых лесов. Распорки-консоли рассчитываются и производятся под конкретный объект и не могут быть унифицированы в силу конструктивных различий разных зданий — их нужно заказывать дополнительно. Цена подвесных лесов только договорная.

  3. Jasonsal /

    Crazy Times. No romp Horny students wash… vehicle? Cheating gf found banging boy toy on Ttape Sex experiences Alanah cheating with her boyfriend’s son Jenny is searching for contributions for her church Masseur takes directive of her amazing assets The Mirror of Desire Daisy Marie cockrides her coworker No, my bum can’t contact! Spend first
    Fresh cutie to hire
    Luvv to adore ya Eighteen year aged Keisha Grey with her ideal young culo Tiny teenie taking fat trunk in her mouth Who is slut?! Awesome Tori Black! No cosmetics! A lesbian bath that is communal! Toilet adore sex Natural titted gf getting facial cumshot money-shot and providing head House working mother Mature blower. SADISM & MASOCHISM A beautiful poon for some cash

  4. Lukas /

    Ich weiß, dass ich eventuell ein bisschen spät bin, wollte aber dennoch fragen, wie ich die gesendeten Nachrichten jetzt speichern kann, also so, dass man beim Verbinden alle geschriebenen Nachrichten sehen kann.

    Vielen Dank für dieses Tutorial und Danke im Vorraus
    Lukas

  5. Josephfub /

    Why Almost Everything You’ve Learned About Aircraft 3d Models Is Wrong

    Persons could argue 3D modelling and virtual reality proved always intended to be together. 3D modeling is the procedure of using software for creating graphics and images that seem to have three dimensions. It’s easy to use any 3D model which you want, even while little as a helicopter or a spaceship. 3D models are indispensable to the flight training experience. The models are available in 12 distinct categories, predominantly focusing on objects, architecture and assorted shapes. In place of going onto the website, locating a model then enabling VR SketchFab also made a VR browser it’s possible to use, and therefore will not need need to keep taking your phone from the headset to navigate to various models.
    Character models are available, but the website looks predominantly focusing on objects and architecture. It’s straightforward for you to browse through all the models prone to will need inspiration or decide on the downloadable ones if you’re considering or thinking about using them for your undertaking. Digital elevation models can be hugely of benefit.

    Aircraft 3d Models Secrets That No One Else Knows About

    A particular could argue 3D modelling and virtual reality proved always intended to be together. 3D modeling is the procedure of using software for creating graphics and images that seem to have three dimensions. It’s easy to use any 3D model which you want, even while little as a helicopter or a spaceship. 3D models are indispensable towards flight training experience. The models are available in 12 distinct categories, predominantly focusing on objects, architecture and assorted shapes. In preference to going onto the website, locating a model then enabling VR SketchFab also made a VR browser it’s possible to use, and therefore you needn’t keep taking your phone from the headset to navigate to various bikes.
    Character models are available, but the website looks predominantly focusing on objects and architecture. It’s simple for you to browse through all the models when you need inspiration or settle on the downloadable ones if you intend on using them for your undertaking. Digital elevation models can be hugely beneficial.

    Aircraft 3d Models Ideas

    Not enjoy an actual model aircraft, it’s not a reference to the actual aircraft, in the same way the model developed fly. Furthermore, it makes it simple to spot visual data to utilize for marketing purposes. By the close of the day you may wind on top of a whole lot more useful data like orthomosaic mapping, elevation data and even a high-resolution 3D model.

    The Nuiances of Aircraft 3d Models

    Sometimes, when technology is comparatively new, it’s difficult to see how it may be helpful. Utilizing drone-based technology essentially makes it possible for you to try beyond taking a pretty aerial picture of a website, it can assist you to in finding sites of interest, provide valuable data and by means of GPS and 3D mapping it can supply a complete map of a site without the conventional labour instensive method of prospecting and surveying. Several AM polymer technologies like material extrusion 3D printers may be mobile.
    All my small craft use JST But when you need a good connector that’s very good for all applications the XT60 is fantastic. If you’re looking for a superior 3D model or an idea to make your own, following can be a list of sites that will be convenient. The time so it took to construct a balsa model and immediately receiving it in atmosphere was just too great. To start with, the principle of visual flight applies which means that you must keep the drone in sight whatsoever times.

    Aircraft 3d Models Features

    3D printing makes it feasible to earn a part made by hand in only hours. 3D printers aren’t just restricted by small fabrications. Consequently however easy to handle and cheap to maintain. Soon, an increasing number of affordable 3D printers are going to be a permanent feature on every desktop at home. Finally this system produces a 3 dimensional model of the imaged area, utilizing the huge quantity of individual images to construct the 3D model, states Riche. Just one of the absolute most important applications of 3D printing is in the health care industry. The second issue is the registration at law enforcement or regulatory agency each and every and every flight.

    If you are a game designer and you don’t want to waste hundreds of hours modeling then by yourself consider purchasing 3d models.

    Of course, you will be looking for the low-priced market with best quality because video games demand many 3d models in order to start level designing, for that we advise you to obtain 3dcgstore marketplace.
    You can also contact their support team and tell them the assets that you require, they’ll provide it in Quickly with unbelievable price.

    You can even ask for sounds, animation, rigging, and specification for example low poly and usable on game engines with regard to unreal engine 4 and so on, with an above average price you will find amazingly detailed 3d models .

    You can get the 3d models even for cheaper price cause if you pay with account funds you’ll get 3% discount if you review or share the products you will get even more discounts discounts.

    In 3dcgstore marketplace, loyal customers will receive VIP gifts that worth a lot of money for free.

    If you liked a game character and want to use it in game design but you couldn’t find it anywhere nor design it by your self then you should visit 3dcgstore marketplace, they have designers who spend most of their time designing top favorite game characters.

    If you are a professional 3d designer and you should think of making cash online then you’ll definitely be looking for your highest commission marketplace, 3dcgstore considered the highest commission provider, over 80% return for every product you sell, in addition, you will have private page and store within the site.

  6. Liana#3D /

    Друзья хочу с Вами поделиться, нашла дешовое Постельное 3D белье по цене от производителя.Да еще и БЕСПЛАТНАЯ ДОСТАВКА ПО всей России.При покупке от двух комплектов!Вот ссылка на сайт http://c.twtn.ru/n9pm

  7. Pingback: essayforme /

  8. Sarabeicy /
  9. detectiver /

    Услуги частного детектива

    Предоставляем полный спектр детективных услуг
    Наши плюсы: Всегда озвучиваем возможности и информацию как есть, наши цены в 2-3 раза ниже чем у большинства конкурентов, огромный опыт и запас креатива, делаем то, что многие считают невозможным.
    Не берем предоплат, не занимаемся высасыванием денег. Консультация бесплатно.

    1. Пробив абсолютно любой информации
    Пробив по мобильным системам (детализация, паспортные данные, определение местоположения)

    Спектр услуг:
    Сбор абсолютно любой информации о человеке
    Определение местонахождения человека по номеру телефона
    Детализация звонков и смс
    Информация из почт и социальных сетей
    Выявление факта супружеской неверности
    Розыск должников
    Розыск имущества должника
    Розыск безвести пропавших людей
    Розыск родственников и людей с которыми утеряна связь
    Розыск мошенников
    Проверка образа жизни ребенка
    Помощь родителям (уход из дома, правонарушения, наркомания)
    Услуги по выявлению фальшивых невест
    Содействие адвокатам
    Помощь в уголовном расследовании, сбор доказательств
    Сбор компромата

    Сбор информации о юридических лицах
    Проверка персонала

    Обеспечение анонимной связи и информационной безопасности
    Контроль мобильного телефона
    Защита компьютерной техники
    Восстановление утерянной информации

    Оказание юридической помощи
    Оказание коллекторских услуг

    Контакты:
    +79180520135 – (телефон, viber, whatsapp, skype)
    Telegram – @RFDetective
    почта – [email protected]

  10. NovagaMop /

    Солидный заработок в Интернете – это реально!
    Что необходимо для результата?
    Это самый простой способ начать зарабатывать в Интернете с полного нуля.
    От вас потребуется только компьютер и умение читать.
    Остальные действия вы освоите за час с помощью видеоуроков.
    Работа по нашей схеме будет занимать у вас до 1 часа времени в день.
    Вы берете ролики из архива, заливаете их на канал и оптимизируете.
    Если лень делать самому, то можно поручить сотруднику или жене.

  11. Anielegravy /

    Братва! Зарабатывайте достойно на вашем сайте, youtube-канале или группе с эксклюзивными партнерскими программами казино:

    https://www.youtube.com/channel/UCYmxBOW2LC7CFgtcF__-OSg

  12. Easybizzi /

    Сделай свой первый шаг к успеху в правильном направлении.
    Только актуальные системы образования и заработков, никакой воды!!! Выбор за тобой!!!
    Подробнее!

  13. DanielDom /

    http://mobgamez.at.ua/forum/2-1-1 любовницы дорого

  14. JuliusHig /

    Последние новости андроид здесь hi-android.net

  15. Alpha Beta /

    Kann man damit nur über das Netzwerk oder auch durch das Internet kommunizieren?????

  16. LarryChile /

    [URL=http://nsexy.ru – проститутки новосибирска[/URL – Вас приветствует команда сайта Сибирки, сайта, на котором размещают анкеты 86% всех проституток города Новосибирска.
    [URL=http://www.siblaguna.ru – проститутки новосибирска[/URL –
    [URL=http://sexonsk.ru – проститутки новосибирска[/URL –
    [URL=http://sibirki.com – проститутки новосибирска[/URL –
    [URL=https://sexonsk.xxx – проститутки новосибирска[/URL – Настоящая проститутка!!! Работаю от души и для души! … Красивая девочка, одна из лучших в Новосибирске!
    [URL=https://sexonsk.top – проститутки новосибирска[/URL –

  17. Aishakek /

    Hallo In Der Überschrift Steht ja bereits Meine Frage Was Denkt Ihr Darüber
    http://collinmwwi833.bravesites.com/entries/general/the-greatest-guide-to-mikrofaser-handtuch
    Schon bald geht es für mich in den Urlaub. Deshalb sind schnelle Antwort von euch toll!
    Liebe Grüße

  18. Aishakek /

    Moinsen, ihr Lieben! Was ist eure Meinung darüber?
    https://jaredmtjq426.tumblr.com/post/160722143466/top-richtlinien-mikrofaserhandtuch
    Schon bald fahre ich in den Urlaub. Deswegen wären schnelle Antwort von euch toll!
    Liebe Grüße

  19. Марьянаvieda /

    Кто хочет получить заработок для начинающих, чтoбы зaрaбaтывaть
    в интeрнeтe хорошие деньги при пoмoщи прoвeрeнных, свежих и эффeктивных мeтoдик?
    Тoгдa я прeдстaвляю вaшeму внимaнию нaстoящую сeнсaцию 2016-гo гoдa.
    Здесь– нaдeжный курс «Дeнeжнaя сeнсaция – зaрaбoтoк нa ЦРУ»
    Этo: способы пассивного заработка в интернете

  20. Дмитрикfrili /

    Свежие новости в мире экономики
    Китай объявил о начале энергетической революции: найден горючий лед

    Правительство КНР сообщило о прорыве в энергетике:
    в этой стране впервые в мире удалось добыть так называемый горючий лед,
    который может прийти на смену нефти и газу. Читать далее

  21. Марьянаvieda /

    Хочешь получить заработок для начинающих, чтoбы зaрaбaтывaть
    в интeрнeтe большие деньги при пoмoщи свeжих, прoвeрeнных, секретных и эффeктивных мeтoдик?
    Тoгдa я прeдстaвляю вaшeму внимaнию нaстoящую сeнсaцию 2016-гo гoдa.
    Здесь– нaдeжный курс «Дeнeжнaя сeнсaция – зaрaбoтoк нa ЦРУ»
    Этo: реальный заработок в интернете не лохотрон отзывы

  22. Jasonrom /

    Последние новости здесь kfaktiv.ru

  23. MichaelSor /

    http://clashroyalehackz.mobi/ clash royale free gems

  24. CurtisOxync /

    Последние женские новости здесь logwoman.ru

  25. tech•sass /

    Klasse gemacht, gut beschrieben, keine Fragen offen – Danke!!!

  26. Williamlor /
  27. AngelkaTag /

    А вам нужна работа дома
    Ваш доход от 100 000 рублей в месяц гарантирован, потому что:
    1.Вы получаете сразу 3 (!!!) методики:
    заработок для ленивых;
    заработок для активных;
    заработок для пенсионеров, домохозяек, студентов и не только
    2.Материалы курса содержат:
    пошаговые видео уроки;
    дополнительные материалы;
    Смотреть список всех ссылок необходимых для работы

  28. Andy /

    Hallo. Toller Artikel. Ich habe den Code für ein Testprojekt verwendet und würde mich gerne mit dem Server über einen anderen Client verbinden. Wie bekomme ich das bewerkstelligt?

    Danke & Grüße
    Andy

    1. psittacus programming /

      1. Am einfachsten: Öffne einen neuen Browsertab und chatte am gleichen PC mit dir.
      2. Finde die IP innerhalb deines Netzwerks deines PCs heraus und gib diese ip und den port in den Browser als URL ein (natürlich von einem anderen PC)
      die url sollte dann i.e. so aussehen: 192.168.178.25:8080

  29. Williamlor /
  30. Jamesabiny /

    Решил выбрать себе самогонный аппарат.
    Женат. Двое детей. Не алкоголик. Не борец за трезвость.
    Но чту обычаи. Приходят друзья, гости, не только в праздники.
    Не обязательно, конечно, но иногда, совсем не вредно. Тем более, что
    имею сад с огромными яблоками, пропадают.
    Делаю брагу, без перегона. Не очень то. конечно можно пить, но на стол ставить…
    Не совсем – то.
    Всё-равно – бежать за водкой.
    аппарат то, Всё-равно буду брать, смотрел много.
    Вот Один, вроде оптимальный. Разная комплектация. И по цене.
    Двойную перегонку может за Один прогон.
    Ð’ общем – чудо машина.
    http://krn.krapovy.ru/images/gorynych.jpg

  31. Nico /

    Vielen dank. Das Tutorial hat mir sehr geholfen. Hatte bisher immer darauf verzichtet Chat Funktionen in meiner Anwendung einzubauen, weil ich einen hohen Aufwand mit ajax und jquery befürchtet hatte (ich dachte der Chat wird über eine DB gefüttert).
    Übrigens solltest du mal drüber nachdenken die Kommentarfunktion zu verändern. Die letzten 10 kommentare reichen völlig aus (bei bedarf können ja mehr auf Knopfdruck geladen werden.
    Mfg

  32. Igornum /

    Металлоконструкции производим! Производим металлоконструкции по чертежам заказчика. Разработаем КМ и КМД. http://www.nvzmk.ru/

  33. Williamlor /
  34. Williamlor /
  35. Williamlor /
  36. Williamlor /
  37. Williamlor /
  38. Williamlor /
  39. Williamlor /
  40. Williamlor /
  41. Igornum /

    Производство изделий из металла Лазерная резка, гибка, сварка. Порошковая окраска. НВЗМК

  42. Williamlor /
  43. viagra costs /

    It’s going to be finish of mine day, but before finish I am reading this fantastic piece of writing to increase my experience.

  44. Scenalgonna /

    The first point we should always take care of is the material of the flip-flop. The key cute fitflop sandals sale issue of the selection for flip-flops is on the laces which are between the soles and the toes. The only real of the Fitflop Sandals shouldn’t be the fabric which is the sole sponge. This will only exacerbate the dangers talked about above. Choose the flip-flops with good sole will reduce the damaging of the sandals. For the number of laces, I feel you don’t want to let the delicate pores and skin of the inside of the toe to be hurt. So, we had better select the soft elastic material. }

  45. Pingback: [DISKUSSION] vorgehen bei user-to-user/private chat mit php und websockets /

  46. Thomas S /

    Einfach danke, wirklich sehr gut erklärt!

  47. Nicolaus /

    Wie kann man den Client / Server Code so anpassen, dass hinter dem Namen zwangsweise die IP des Client rechners angezeigt wird?

  48. Jo Elegolo /

    Sehr verständlich und gut nachvollziehbar verfasst, vielen Dank!

  49. Peter /

    Danke für dieses Tutorial :)

  50. Shohrukh /

    Tolle Tutorial!!!

  51. Jo Elegolo /

    SO liebe ich es! Für einen „alten Hasen“ ein gefundenes Fressen. Funktioniert auf Anhieb bestens (PC und Handy im Hausnetz), sauber aufgebaut, alles ausführlich und einfach beschrieben. Ein wunderbarer Einstieg in node.js! Vielen Dank!
    Mein node.js (4….) meldet allerdings:
    „express deprecated app.configure: Check app.get(‚env‘) in an if statement server.js:11:5“

    1. Adowrath /

      Ich weiss, ich bin spät, aber du kannst den Code innerhalb von app.configure(function() { /* */ }) ganz einfach „herausnehmen“; d.h. aus

      app.configure(function(){
      // statische Dateien ausliefern
      app.use(express.static(__dirname + ‚/public‘));
      });

      wird

      app.use(express.static(__dirname + ‚/public‘));

  52. Anonymous /

    schönes Tutorial

  53. Zargor /

    Kann man dies auch mit Apache2 verbinden? Also das man nicht gleich einen eigenen Webserver starten muss .-. ?

    1. Pino /

      ja. Die Socket lib. io kannst du auch lokal verwenden, musst dann die richtige Verbindung zum Server herstellen. Express musst du dann serverseitig weglassen. Spannend wirds, wenn du deine Frontend Anwendung auf verschiedenen Servern deployst, aber alle auf den Server connecten. Meine apps liefen bisher nur lokal.

  54. zaab /

    Hallo.
    Ich habe alles nach Rezept gemacht. Jedoch werden meine texte nicht versendet. Chat-Area belibt nur leer.
    Woran kann das liegen? package.json sieht so aus:
    {
    „name“: „meinerstesChat“,
    „version“: „1.0.0“,
    „descriptiopn“: „no desc“,

    „dependencies“: {
    „express“: „*“,
    „socket.io“: „*“
    }
    }

    1. zaab /

      Ergänzung: Das Problem hat auf jeden Fall mit dem Laden von socket.io zu tun, denn der Event:
      socket.on(‚chat‘, function (data) {
      alert(„on-event am socket erhalten“);
      ….

      wird erst gar nicht geworfen.
      socket.io ist mit npm installiert, und im index.html importiere ich:

      Nodejs Chat

      Mache ich etwas falsch?

      1. zaab /

        Ups, da wurde mein code abgeschnitten.
        Die script lade ich in meinem index.html mit: src=“socket.io/socket.io.js“.

        Im Browser erhalte ich dann folgende Fehlermeldung:
        Firefox kann keine Verbindung zu dem Server unter ws://localhost:8080/socket.io/?EIO=3&transport=websocket&sid=crgZjGT_yBLnVH-_AAAA aufbauen.

        somehow frustriert…. :(

        1. NodeCode / Beitrags-Autor

          Dass dein Firefox keine Websocket-Verbindung (ws://) aufbauen kann hat erstmal nichts zu sagen, da Socket.io ja über XHR oder JSONP kommuniziert falls WebSockets in deinem Browser deaktiviert wurde oder du eine ältere Firefox-Version verwendest in der WebSockets noch nicht unterstützt wird.

          Läuft denn der Node.js-Server ununterbrochen ohne einen Fehler zurückzugeben? Und kommt zumindest eine XHR-/JSONP-Anfrage zu Socket.io erfolgreich zustande, oder schlägt diese auch fehl? Letzteres kannst du über die Netzwerkanalyse von Firefox nachverfolgen.

          1. zaab /

            Hallo. Danke, dass Du da bist! (das beruhigt :) )

            Ich kann das Problem leider nicht mehr reproduzieren. Es geht auf einmal, ohne dass ich die Ursache lokalisieren konnte. Folgende Änderungen habe ich durchgeführt und dann ging es mit dem Chatten:

            A) In index.html eine script mit: var socket = io(); eingetragen
            B) In server.js und client.js die Event-namen, die zuerst im “ “ standen in ‚ ‚ getan
            C) In index.html den Pfad zu socket.io anstelle von „socket.io/socket.io.js“ zu „/socket.io/socket.io.js“ geändert.

            Drei Änderungen auf einmal! Wenn ich sie alle Rückgängig mache, klappt es trotzdem mit Chatten! ich habe alle Änderungen rückgägngi gemacht und Enide neu gestartet. Chat funktioniert trotzdem.

            Dumm ist, dass ich nicht weißt, warum ich gestern 3Stunden verlieren musste, um am Ende nicht schlauer zu sein :(

            1. hansMeier /

              das lag daran, dass jQuery nicht richtig eingebunden wurde/war und deswegen die Clientseite Probleme hatte.

              Zumindest hatte ich genau das gleiche Problem und das war die Lösung bei mir.

  55. Fabian Busch /

    Vielen Dank für dein Tutorial, für den Anfang war das sehr cool zu sehen wie so eine Beispielapp funktioniert!

  56. Pino /

    Ich habe den chat geforkt :) Erweiterungen: * ein/auslogen (ohne Pwd) * private Nachrichten (PM) * Anzeigeboxen für Server/Status/Chat Nachrichten * frisches Layout * eine kleine Uhr/Wochentag/Datum. Um PM zu schicken, muss die serverapp sich beim Anmelden die entspr. Socket merken. Ich habe dazu ein Obj. mit (str) username und (obj) socket angelegt.
    wer schauen mag: https://git.io/vw0uA Ihr könnt mich natürlich jederzeit forken!

  57. Gerald /

    Hmmm ok, da habe ich also dann einen Chat, der auf einem anderen Server Port läuft als der Rest meiner Page – übrigens total reibungslos.

    Jetzt sind die Nutzer aber bereits auf meiner Page mit ihrem Usernamen angemeldet .. wie bekomme ich die Namen in den Chat, ohne das Eingabefeld für die namen? Mit anderen Worten, wie kann ich die index.html ggf. von meinem Apache generieren lassen, damit sie den richtigen Usernamen enthält?

    1. Pino /

      schreib eine user.php die ein angemeldeten user als array JSON encodet zurück gibt, dann in der client.js:

      var user =“;
      $.get(„server/user.php“ )
      .done(function(data) {
      console.log(„user get: “ + data.user );
      if (data.user) {
      var user = data.user;
      $(‚#name‘).val(user);
      }
      });
      (oder so ähnlich..) du kannst die $.ajax() oder $.get() methode nehmen. die index.html wird nach dem laden von jQuery beschrieben

  58. sebastian /

    Folgendes Problem:
    Wenn ich den Server.js in de CMD ausführen möchte, wird angegeben, dass app.configure keine Funktion ist. Express habe ich installiert, funktioniert aber trotzdem nicht.

    1. NodeCode / Beitrags-Autor

      Du nutzt anscheinend Express 4 anstatt 3, in der app.configure nicht mehr existiert. Hast du wie am Ende des Tutorials beschreiben npm install im entsprechendem Verzeichnis ausgeführt? Dann müsste nämlich Express 3 automatisch installiert werden.

      1. sebastian /

        Danke für die schnelle Antwort. Hat alles geklappt! Vielen Dank

      2. jachen /

        Ich hatte npm install ’nicht‘ ausgeführt, bin einfach händisch halbwegs logisch vorgegangen.

        Es ist wie immer bei solchen Techniken, man sollte ALLES lesen und kapieren. Und auch dann bleiben immer wieder Details verborgen, die je nachdem fatal auswirken können.

        Danke fürs Feedback.

  59. jachen /

    Eine tolle Arbeit. Vielen Dank für die aufgewendete Zeit.

    Habe das Projekt (zwecks Weiterbildung) auf einen Raspberry Pi 2 im lokalen Lan gelegt, sodass nun alle chatten können (statt arbeiten).
    Ein paar kleine Hürden gab es anfänglich wegen Änderungen in den Versionsnummern (package.json) und abgelösten Methoden (app.configure()) im server.js. Auch musste ich den URL auf meine Raspi-IP legen, logisch.

    Solche Tuts sollten Schule machen.

  60. Markus /

    Perfekt, weil simple gehalten!
    Vielen Dank!

  61. Bro /

    Bei mir kommt eine Fehlermeldung, wenn ich auf der Konsole server.js starte:


    SyntaxError: /Users/Testuser/config.json: Unexpected token /
    at Object.parse (native)
    at Object.Module._extensions..json (module.js:412:27)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object. (/Users/BM97/server.js:6:12)
    at Module._compile (module.js:397:26)
    at Object.Module._extensions..js (module.js:404:10)
    at Module.load (module.js:343:32)

    Kann mir jmd weiter helfen?

    1. NodeCode / Beitrags-Autor

      Du hast einen Syntax-Fehler in der Datei config.json, der durch das Zeichen / an einer Stelle an der es nicht hingehört verursacht wird.

      Wahrscheinlich hast du die genannte Datei beabsichtigt oder unbeabsichtigt verändert, und dabei das korrekte JSON-Format gebrochen.

  62. Bro /

    Hi! Super Artikel, super Tutorial! Weshalb gibt es von solchen Tutorials nicht mehr? Würde mich und bestimmt viele andere auch freuen. Zum Beispiel wie man einen Chat zwischen nur zwei User hinkriegt oder wie der Username bereits feststeht, sobald man den Chatroom betritt.

    Mfg,

  63. wik /

    Hallo,
    erstmal danke für das Tutorial, hab das sogar so halbwegs verstanden… nur hätte ich eine Frage: Gibt es eine Möglichkeit den usernamen einzugeben bevor man den Chat betritt so dass man anschliessend zum Chat kommt und der username quasi „gemerkt“ wird?

    1. NodeCode / Beitrags-Autor

      Ja, natürlich ist das möglich. Dies würde aber vor allem was die clientseitige Anwendungslogik betrifft den Rahmen dieses grundlegenden Tutorials sprengen.

      Grüße,
      NodeCode

      1. hansMeier /

        dazu gibt es in dem Node.js Buch vom Rheinwerk-Verlag ein super Beispiel.
        Wo dann ebenfalls der Username mit Password zuerst eingetragen wird.

        Dieses Beispiel kann man dahin erweitern, dass die Daten aus einer Datenbank oder JSON-Datei kommen…

  64. Jan /

    Hey!

    Nur zwei kleine Sachen:
    Zum einen weist npm beim installieren darauf hin, das die Felder „repository“ und „license“ in der package.json fehlen.
    Zum anderen bemerkt node beim starten des Servers: „express deprecated app.configure: Check app.get(‚env‘) in an if statement server.js:11:5“ ist hier evtl. etwas zu ändern?

    LG
    Jan

  65. Christoph /

    Hallo, vielen Dank für das Tutorial. Ein Problem hab ich hier: kann ich das auch für asynchrone Weitergabe nutzen? Bsp. in index.html schreib ich etwas in ein Feld, sende es ab und werde dann auf weiter.html weitergeleitet; dort soll der Inhalt aus index.html angezeigt, also beim Laden übergeben werden (anstatt „du bist nun verbunden“). Dafür wollte ich den abgeschickten Wert auf dem Server speichern (z.B. in einer temporären Datei ablegen und daraus wieder auslesen), aber das hat nicht funktioniert. Die asynchrone Übergabe an andere Clients sollte sich dabei nicht ändern.

  66. Robin /

    Hallo,

    ich beschäftige mich seit kurzem mit dem Thema node.js im Zuge eines Studiumsprojekts und mir hat das leicht verständliche Tutorial wirklich sehr geholfen!

    Nun habe ich jedoch eine Frage. Ich möchte die kleine Chat-Applikation, welche auf dem localhost schon einwandfrei läuft, auf einen Server laden.
    Somit könnte ich Sie mit Kommilitonen von mehreren Computern aus vorführen.

    Was müsste ich im Code alles abändern, damit dies gelingt?

    Vielen Dank und Grüße,
    Robin

    1. NodeCode / Beitrags-Autor

      Im Grunde gar nichts. Du musst die Anwendung einfach nur auf den Server laden, und ggf. die benötigten Module mit der Anweisung npm install installieren (falls du sie nicht mit kopiert hast, es sich um globale Module handelt, oder um binäre Module die für jeden Rechner individuell kompiliert werden müssen).

      Ansonsten kannst du sofort loslegen. Anstatt 127.0.0.1 musst du zum Aufrufen einfach die IP-Adresse der Servers nutzen, oder einen Domainnamen der auf diese IP-Adresse geschalten ist. Wenn eingehende Verbindungen von außen nicht durch einen Router oder eine Firewall blockiert werden (was bei einem Server in den meisten Fällen nicht der Fall sein sollte), dann kannst du die Anwendung von außen problemlos aufrufen. Ansonsten die verwendete Portnummer einfach freischalten.

      Wenn du später die Portnummer aus der URL entfernen möchtest, musst du die Anwendung einfach auf Port 80 schalten (der Standard-HTTP-Port), und als Administrator/Root ausführen (da Portnummer unterhalb der 1024 in der Regel nur mit Root-Rechten belegt werden können).

      Beim Wechsel der Portnummer ist noch zu beachten, dass immer nur ein Programm direkt auf eine Portnummer geschalten werden kann. Wenn man mehrere Anwendungen auf dem gleichen Server über verschiedene Domains auf dem Standard-HTTP-Port 80 haben möchte, muss man dazu einen Webserver verwenden, welcher die eingehenden Anfragen anhand der Domain an die richtige Anwendung weiterleitet. Im Falle der Verwendung von Socket.io sollte der Webserver im Idealfall auch WebSockets unterstützen, was aber bei allen großen Webservern wie Apache oder Nginx der Fall ist.

      1. Robin /

        Vielen Dank für die schnelle Antwort.
        Ich habe es wie beschrieben versucht, jedoch bekomme ich ein 404 Error.
        Das Verzeichnis liegt auf dem Server und ich kann es auch ansteuern:
        http://…..de/~spielman/nodeJS_chat

        Doch sobald ich den Port :8080 dahinter setze kommt der 404 Error.
        Die Module sind sind alle mit auf den Server kopiert worden.

        Woran kann dies liegen?

        1. NodeCode / Beitrags-Autor

          Ist http://…..de/~spielman/nodeJS_chat die URL über die du versucht auf die Anwendung zuzugreifen?

          Wenn ja, dann hast du die Funktionsweise von Node.js wohl noch nicht ganz verstanden. Anders als z.B. bei PHP wird eine Node.js-Anwendung nicht vom Webserver bei jedem einzelnen Aufruf einer bestimmten Datei oder eines Ordners per CGI oder FastCGI gestartet, sondern Node.js ist von Haus aus sein eigener Webserver.

          Wenn du eine Node.js-Anwendung also mit node server.js startest, dann brauchst du keinen Basis-Pfad für die Anwendung zu verwenden, sondern alle Verzeichnisse sind unter der Portnummer genau so, wie du sie im Programmcode konfiguriert hast.

          Somit musst du den Pfad vom Ordner in dem sich das Programm befindet natürlich weglassen. Deine URL müsste dann http://….de:8080/ lauten. Funktioniert es damit? Falls nicht, prüfe mal nach, ob die Anwendung beim Starten mit node server.js irgendwelche Fehlermeldungen ausgegeben hat.

          1. Robin /

            Auf dem Hochschulserver scheinen wohl die nötigen Rechte zu fehlen, dort bekomme ich den Error 403 Zugriff verweigert.

            Nun habe ich die komplette Anwendung auf einen bplaced Server gelegt und dort funktioniert es auch noch nicht.

            Hier ist ein Screenshot des Inhaltes meines Webspace:
            http://i62.tinypic.com/t6czld.png

            wenn ich nun mit http://www.iamrobin.de:8080 auf mein Webspace zugreife, kommt die Fehlermeldung „Die Website ist nicht verfügbar ERR_CONNECTION_REFUSED“
            mit http://www.iamrobin.de/nodeJS_chat gelange ich jedoch ohne Probleme auf das Verzeichnis der Anwendung.

            Wenn ich die Anwendung mit node server.js starte kommt folgender Hinweis: „express deprecated app.configure: Check app.get(‚env‘) in an if statement server.js:12:5“

            Vielen Dank für die schnelle und nette Hilfe!

            1. NodeCode / Beitrags-Autor

              Unterstützt der Webspace von bplaced.net überhaupt Node.js? Soweit ich weiß unterstützt nämlich nur PHP. Und den Kammandozeilen-Befehl node server.js hast du dann auch nur auf deinem lokalen Rechner ausgeführt, richtig?

              Ich denke dann haben wir den Fehler hier gefunden: Node.js ist einfach nicht auf dem Server installiert, sodass auch Node.js-Anwendungen nicht ausgeführt werden können.

              Du musst selbstverständlich einen Hosting-Anbieter wählen, der Node.js auch unterstützt. Wenn Node.js oder irgend eine andere serverseitige Programmiersprache bzw. Plattform nämlich nicht auf dem Server installiert geschweige denn für die Kunden öffentlich eingerichtet ist, dann können darin entwickelte Anwendungen auch nicht auf dem Server ausgeführt werden.

              Falls du keinen eigenen (Root-)Server mit SSH-Zugriff hast (also Zugriff auf die Kommandozeile), solltest du einen Hosting-Anbieter wählen, der Node.js von Haus aus unterstützt. In deinem Fall würde ich dir OpenShift oder Heroku empfehlen, die beide in der Basis-Version ebenfalls kostenfrei sind.

              In meinen Artikel zum Thema Node.js-Hosting hier auf NodeCode.de, oder auch in diesem von mir erstellten JsWiki-Beitrag zum Thema Node.js (im Hosting-Abschnitt) findest du weitere Anbieter mit Node.js-Unterstützung, die sind dann aber in der Regel kostenpflichtig oder bieten nur für eine begrenzte Zeit kostenlosen Zugang an.

              Viel Erfolg noch damit es dir diesmal gelingt. DU kannst bei einem Anbieter der offiziell Node.js-Hosting unterstützt aber eigentlich nicht viel falsch machen 😉

  67. Pingback: Beispiel Chat mit Node.JS | IT-Sommerfest /

  68. Sebastian /

    Hi,
    zunächst, sehr gutes Tutorial! Ich habe ebenfalls ein Chat mit node.js erstellt und hier gute Tipps für die Umsetzung gefunden. Ich bin noch einen Schitt weiter gegangen und habe das ganze um private Chats mit Usern, sowie weiteren Chaträumen, den man beitreten kann erweitert. Aktuell habe ich folgendes Problem.

    Sowie der Client seinen Browser schließt oder einen Page-Reload macht, ist der Chat-Verlauf gelöscht. Ich würde es gern hinbekommen, dass dieser beim Reload nicht verloren geht.

    Da sich der Socket beim Reload ja ändert (ist doch so?) machts wohl keinen Sinn da irgendwas reinzuschreiben.
    Mein Idee wäre wohl, den Chat an User-Logins zu koppeln und ggf. die Infos in eine DB packen und beim Reload entsprechend holen (außer bei explizitem Logout).

    Vielleicht hast du eine Idee oder einen Tipp wie man sowas umsetzt.
    Vielleicht haben auch andere das Problem…

    Danke und Gruß
    Sebastian

    1. NodeCode / Beitrags-Autor

      Die einfachste Lösung wäre es, z.B. die letzten 20 Chat-Mitteilungen je Raum einschließlich der Uhrzeit in einem Array zu speichern, und beim Betreten des Raumes an den jeweiligen User zu übermitteln.

      Dafür brauchst du dann auch keine Datenbank und keine User-Logins. Habe dies in einem anderen Projekt genau so umgesetzt.

  69. neteddie /

    Ein klasse Tutorial! Nicht zu oberflächlich, nicht zu verstiegen, gerade richtig, um Prinzipien verständlich zu machen. Danke, es hat mir sehr dabei geholfen, etwas über node.js und Websockets zu lernen.

  70. myjday /

    Wahnsinn & Lob!
    Ich habe bisher die Möglichkeiten von jQuery ausgetestet und habe immer wieder mal etwas über node.js gehört – konnte mir aber nie richtig etwas darunter vorstellen.
    Daher vielen vielen Dank für dieses wunderbare step-by-step Einstiegsbeispiel. Jetzt wirds hell am Himmel.

    bye bye

  71. Andre /

    Sehr schönes einfach gehaltenes Tutorial, danke sehr.

  72. Peter /

    Hey sau geil

  73. MarcelW /

    Hey, das ist für Anfänger doch mal ein super Tutorial und sehr schön geschrieben. Werde damit die Azubis bei uns mal etwas rumprobieren lassen.

    Ich frage mich jedoch gerade, wie sich das mit den Sockets verhält, wenn man nun mehr als einen Chatraum hat oder man zum Beispiel einen Raum hat und darüber hinaus jeder Anwesende auch andere persönlich in einem privaten Chat anschreiben kann?! Dies liesse sich doch dann über den selben Websocket realisieren und man übergibt vom Client anstelle von „socket.emit(‚chat‘, { name: name, text: text });“ folgendes: „socket.emit(‚chat‘, { room: room, name: name, text: text });“. Oder was wäre hier der eleganteste Weg?

    1. NodeCode / Beitrags-Autor

      Richtig, dies wäre eine von mehreren Möglichkeiten. Eine deutlich elegantere wäre es aber, anstatt ‚chat‘ einfach eine gesonderte Socket-Aktion zu verwenden, wie z.B. ‚privateChat‘. Dann spart man sich das Abfragen, ob die Chat-Nachricht öffentlich oder privat ist, was man ansonsten sowohl in im Webbrowser als auch in Node.js erledigen müsste.

      Sobald man private Chats verwendet, sollte man zur Identifizierung übrigens einmalige IDs anstatt Namen verwenden, da ansonsten sich jemand anderes einfach den selben Namen geben könnte, und dann in der Lage wäre, andere auszuspionieren. Zum reinen Rumprobieren ist das aber selbstverständlich nicht unbedingt erforderlich 😉

      1. MarcelW /

        Vielen Dank, das hilft mir grade beim Design einer anderen Anwendung extremst weiter und spart mir wohl einen Haufen Arbeit. Klasse Job! Bin leider noch recht neu in Sachen node.js und WebSockets, aber das Tutorial hilft super, um ein schnelles Verständnis ihrer Anwendung zu erlangen :)

  74. Felix /

    Hi, echt super Tutorial. Ich habe eine Frage: Im html steht: <script src=“socket.io/socket.io.js“></script>
    Aber im public Folder gibt es bei mir dieses Script gar nicht! Woher lädt der das also (im Firebug kann ich sehen, dass es geladen wurde)???
    Und dann im client.js: var socket = io.connect(); –> Woher weiß der denn an der Stelle, was io ist?

    Viele Grüße,
    Felix

    1. NodeCode / Beitrags-Autor

      Ganz einfach: Das Socket.io-Modul fügt die Datei socket.io/socket.io.js automatisch zum Webserver hinzu, da es ja das Server-Objekt als Parameter übergeben bekommt.

      Wenn diese Datei dann in den Client geladen wird, so wird die globale Variable io angelegt. Daher kannst du darauf ohne weiteres zugreifen.

      Ich habe übrigens die Fehldarstellung in deinem ersten Kommentar korrigiert (lag an der Website), und deinen zweiten entsprechend entfernt. Also nicht wundern 😉

  75. welle /

    Hallo,
    danke für das super Tutorial, es hat mich motiviert node.js auf meiner
    Linux-Maschine zu installieren und gleich loszulegen.
    Bin ja eher Python-Fan, aber Node ist auch nicht von schlechten Eltern.
    Was meiner Meinung nach fehlt (oder ich habe es nicht gefunden),
    ist eine nähere Erläuterung der *.json-Konfigurationsdateien.

    1. NodeCode / Beitrags-Autor

      Die config.json stellt in diesem Fall wie beschrieben ein JSON-Objekt mit der Portnummer bereit, und wird später in die Anwendung geladen um den Webserver an die konfigurierte Portnummer zu binden. So muss man den JavaScript-Code nicht ändern, wenn man die Portnummer später wechseln möchte.

      Die package.json ist hingegen eine universelle Datei zur Konfiguration des Paketmanagers NPM. Darin gebe ich z.B. die benötigten Zusatz-Module aus dem NPM-Verzeichnis an. Genauere Details dazu können der zugehörigen Dokumentation entnommen werden: https://docs.npmjs.com/files/package.json

  76. Ai /

    Hallo,

    erstmal danke für das Tutorial :)
    Habe allerdings folgendes Problem…
    Ich gebe in der Konsole den Befehl „npm install“ ein und versuche über „node server.js“ zu starten allerdings passiert rein gar nichts. Hat jmd viellt ne Idee ?

  77. hinz kunz /

    Hallo,

    super tutorial, weil die Funktionen schlicht gehalten sind, damit das Wesentliche im Focus bleibt.

    7 Sterne für nodecode (da können auch die Fehler nix dran ändern)

  78. Raman /

    Hi,
    habe bis jetzt noch nichts mit NodeJS gemacht und bin zufällig über dieses Tutorial gestolpert. Habs jetzt nur durchgelesen aber noch nicht ausprobiert. Werde ich die Tage sicherlich machen. Echt super einfach und verständlich geschrieben.

    Vielen Dank dafür!

  79. Ellen /

    Danke für das ausführliche Tutorial. Es ist sehr verständlich!
    Allerdings scheine ich irgendwie auf dem Schlauch zu stehen.
    Der Server läuft („Server läuft nun auf Port 8080“). Und wenn ich die index.html im Browser aufrufe erhalte ich keine Fehlermeldung. Aber wenn ich etwas eingebe und abschicke, passiert nichts…

    1. NodeCode / Beitrags-Autor

      Es freut mich, dass dir mein Tutorial gefällt! :-)

      Du musst die Website wie im letzten Abschnitt beschrieben über http://127.0.0.1:8080/ aufrufen, und nicht über das Öffnen der index.html-Datei im Ordner des Quellcodes. Denn ansonsten kann die WebSocket-Verbindung zum Server nicht hergestellt werden, da diese ja erst von Node.js zur Verfügung gestellt wird, und nicht vom lokalen Dateisystem.

      Ich habe dem Quellcodes des Tutorials jetzt entsprechend abgeändert, sodass beim Starten gleich die vollständige URL angezeigt wird, anstatt nur die Portnummer. Damit sollten zukünftige Verwechslungen ausgeschlossen sein.

    2. Phil /

      Hast du die funktion $(document).ready(function(){}
      in der datei client.js korrekt ?

      Diese funktion umschliesst allen nachfolgenden code innerhalb der client.js ?

      1. NodeCode / Beitrags-Autor

        Ja, das ist so richtig. Aller nachfolgender Code steht in der übergebenen Callback-Funktion, wodurch sichergestellt ist, dass er wirklich erst dann ausgeführt wird, wenn die HTML-Seite komplett zu Ende geladen ist.

        Siehe dazu auch in der offiziellen jQuery-Dokumentation: http://api.jquery.com/ready/ (auf Englisch)

  80. K1ngArthur /

    Super Artikel!

    Kleiner Fehler:

    app.configure(function(){
    // statische Dateien ausliefern
    app.use(express.static(__dirname + ‚/public‘));
    });

    ist veraltet. Stattdessen nur:

    // statische Dateien ausliefern
    app.use(express.static(__dirname + ‚/public‘));

    benutzen

  81. Marc-Andre /

    Danke für den Artikel. Bin zwar leider auch über das Thema npm install gestolpert (wäre besser es würde ganz oben erklärt was man machen muss als am Ende des Atikels) aber am Ende hat es geklappt.
    Interessante Sache!

  82. Junichs /

    Danke dir, geht jetzt =)

  83. Junichs /

    Huhu,
    kann sein, dass ich es wirklich überlesen habe oder es nicht für voll genommen habe^^
    Sorry 😉

    Jetzt bekomme ich allerdings ein anderen Fehler:
    Error: ENOENT, stat ‚C:\Users\junichs\AppData\Roaming\npm‘
    Scheinbar ein Pfadproblem.

    1. NodeCode / Beitrags-Autor

      Das scheint wohl ein allgemeines Problem mit NPM unter Windows zu sein. Die Lösung besteht scheinbar darin, manuell einen Ordner namens npm unter C:\Users\junichs\AppData\Roaming\ anzulegen.

      http://stackoverflow.com/questions/25093276/nodejs-windows-error-enoent-stat-c-users-rt-appdata-roaming-npm

  84. Junichs /

    Hi,
    ich bekomme die Meldung:
    module.js:340
    throw err;
    ^
    Error: Cannot find module ‚express‘
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object. (Pfad\server.js:1:77)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

    Welche module.js?

    1. NodeCode / Beitrags-Autor

      Sieht so aus, als ob das Express-Modul nicht richtig installiert wurde. Du musst in der Konsole einfach die Anweisung npm install eingeben, dann werden alle benötigten Module automatisch installiert.

      Hast du den Artikel nicht vollständig gelesen? Da wird das am Ende nämlich auch erwähnt:

      Beachte dabei, dass du nach dem herunterladen noch die nötigen Module installieren musst. Dafür musst du dich mit der Konsole einfach in das Verzeichnis der Anwendung begeben und den Befehl npm install eingeben, die benötigten Module werden dabei automatisch aus der package.json ausgelesen und installiert.

      Ich hoffe, dass ich dir hiermit weiterhelfen konnte. Falls es noch weitere Probleme geben sollte, sag mir einfach bescheid :-)

  85. MeRo /

    Hey,

    erstmal großes Lob für das Tutorial, gefällt mir sehr gut und macht vor allem Lust auf mehr. Stellenweise wäre es schön wenn du etwas genauer sagen würdest warum du etwas machst.

    Leider funktioniert das ganze bei mir nicht wie gewünscht. Inzwischen habe ich sogar den ganzen Code kopiert, aber ich bekomme immer nur diese Fehlermeldung mit der ich so garnichts anfangen kann.
    http://picload.org/image/lcdrgdr/error.png

    Kann mir jemand weiterhelfen?

    1. hyp3rdino /

      Ist node.js auf deiner Windowskiste installiert und startest du die server.js auf der console explizit mit „node server.js“. Ich bin zwar kein Windowsexperte, aber deine server.js wird hier nicht von nodejs interpretiert sondern vom jscript interpreter. Der kann schon mit der ersten Zeile in der server.js nichts anfangen.

    2. NodeCode / Beitrags-Autor

      @MeRo
      Hast du die Anwendung auch über den Befehl node server.js gestartet? Die Fehlermeldung im Screenshot stammt nicht von Node.js sondern von „Microsoft JScript“, wahrscheinlich hast du also das falsche Programm verwendet.

      Im Screenshot ist außerdem zu sehen, dass sich die Datei im Verzeichnis von XAMPP befindet. Für Node.js wird XAMPP aber nicht benötigt, da eine Node.js-Anwendung als ein eigener Webserver fungiert.

      Falls du nicht weißt, wie genau man eine Anwendung mit Node.js startet, hilft dir möglicherweise folgende Seite weiter: http://nodecode.de/nodejs-konsolen-grundlagen

      Ich konnte dir übrigens erst jetzt antworten, da an dem Tag an dem ich deinen Kommentar freigeschalten habe, das Screenshot auf picload.org nicht aufrufbar war.

  86. Joggie /

    Ergänzung:
    Wenn man in der package.json express 4.x statt 3.x benutzen will startet der node Server nicht.

    Der Fehler lautet:
    TypeError: Object function (req, res, next) {
    app.handle(req, res, next);
    } has no method ‚configure’…

    Das liegt daran, dass ab version 4.x von express „app.configure“ nicht mehr benutzt/benötigt wird (Mehr Informationen dazu: https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x)

    Um den Server trotzdem zum laufen zu bekommen muss man in der server.js Datei

    app.configure(function(){
    app.use(express.static(__dirname + ‚/public‘));
    });

    durch

    app.use(express.static(__dirname + ‚/public‘));

    ersetzen.

  87. Yannici /

    Hey!

    Vielen Dank für das Tutorial. Auch mich hat es motiviert mit NodeJS anzufangen. Hab es schlussendlich hinbekommen und ohne Vorkenntnisse von NodeJS (mithilfe von Google) sogar noch erweitert!

    Das Verändern von Namen ist nicht mehr so einfach. Habe ein Login-Feld reingemacht, bei dem man vornherein schon ein Name auswählen muss. Der Server und der Client speichert den ausgewählten Namen. Nachdem der Name ausgewählt wurde, wird in der client.js die Socket-Verbindung aufgebaut und alle Benutzer bekommen mit, dass der neue User sich verbunden hat. Schließt jemand die Verbindung (on disconnect), so werden ebenfalls alle darüber benachrichtigt.

    Finde es wirklich klasse, dass man aus dem Tutorial sogar schon mehr lernt, als nur den Chat … Sondern auch die Funktionsweise von Sockets in NodeJS.

    Grüße,
    Yannici

  88. Mounty2010 /

    Hallo, vielen Dank für diese „Schnelleinführung“ in socket.io.
    Für Einsteiger einfach, systematisch und verständlich erklärt.

  89. Rocks /

    Danke für Deine Mühe. War mein erstes Tutorial zu node und ich finde es kommt gut rüber wie kompakt der Code ist bei gleichzeitigem Erhalt einer Fülle von Basisfunktionalitäten! Super!

  90. Matze /

    Ergänzung:

    Bei mir funktioniert der Code nur mit einem Client.
    Damit sich auch mehrere Clients verbinden können muss zum einen in der server.js aus

    socket.emit
    io.sockets.emit

    gemacht werden. Außerdem habe ich socket.emit(‚chat‘, data) ersetzt jeweils durch

    socket.emit(‚toClient‘, data)
    socket.emit(‚toServer‘, data)

    und

    socket.on(‚toClient‘, data)
    socket.on(‚toServer‘, data)

    Hoffe es hilft.

    1. NodeCode / Beitrags-Autor

      Ich habe tatsächlich fälschlicherweise socket.emit() anstatt io.sockets.emit() verwendet. Wahrscheinlich weil ich überlegt habe, beim Abschicken einer Chat-Nachricht sie in dem Browser des Absenders sofort anzuzeigen, ohne den Umweg über den Server gehen zu müssen.

      Dann hätte ich nämlich socket.broadcast() verwendet, sodass die Chat-Nachricht an alle anderen Benutzer gesendet wird, aber nicht an den Absender. Letztendlich habe ich mich aber dafür entschieden, dass auch der Absender seine eigene Meldung über den Server empfängt, damit mit merkt, dass der Server auch richtig funktioniert. Ich werde den Fehler sofort beheben.

      Den Sinn dahinter, socket.emit(‘chat’, data) jeweils durch socket.emit(‘toClient’, data) und socket.emit(‘toServer’, data) zu ersetzen, kann ich nicht nachvollziehen. Wenn eine Websocket-Nachricht von Server gesendet wird, kommt sie logischerweise zum Client, und wenn sie vom Client gesendet wird, zum Server. Der Server dient hier quasi nur als Verteiler zwischen den einzelnen Clients.

      Möchtest du den Code damit übersichtlicher machen? Das würde vielleicht in diesem kurzen Beispiel funktionieren, aber bei größeren Projekten mit vielen verschiedenen Socket-Anweisungen wäre genau das Gegenteil der Fall.

      Wenn du eine Unterscheidung zwischen den Code am Client und am Server haben mochtest, solltest du z.B. am Server io.sockets.on('connection', function (socket) { durch io.sockets.on('connection', function (server) { , und am Client var socket = io.connect(); durch var socket = io.connect(); ersetzen. Dann könntest du mit server.emit(‘chat’, data) vom Server zum Client, und mit client.emit(‘chat’, data) vom Client zum Server senden. Bei dem verwenden des Variablennamens server aber Aufpassen, der gleiche Name schon für das in Zeile 3 geladene HTTP-Modul verwendet wird. Innerhalb von io.sockets.on('connection', function (socket) { würdest du jetzt nicht mehr auf die in Zeile 3 definierte Variable server zugreifen, sondern auf die soeben definierte Gleichnamige. In diesem Beispiel wäre das nicht schlimm, aber wenn du bei einem größeren Projekt innerhalb der Socket-Verbindung noch etwas mit dem HTTP-Server machen wolltest, wäre dass dann selbstverständlich nicht möglich.

      Mich freut es, dass dir mein Tutorial gefällt. Falls du weitere Verbesserungsvorschläge hast, Fehler findest oder Fragen hast, stehe ich gerne zur Verfügung 😉 Das nächste Tutorial ist übrigens schon in der Vorbereitung.

      1. Matze /

        Ja, wenn ich drüber nachdenke ergibt das mit toClient und toServer überhaupt keinen Sinn.
        Es erschien für mich halt fürs erste Tutorial sinnvoller, weil ich erstmal überhaupt nachvollziehen musste „wenn ich hier was reinstecke, kommt es hier wieder raus“. Wenn überall „chat“ steht, weiß man halt irgendwie nicht wo vorne und hinten ist.
        Was du vielleicht im Tutorial nochmal präziser beschreiben (steht bestimmt auch irgendwo auf deiner Website) kannst, ist dass socket.on(event) ein LISTENER ist, also der wartet die ganze Zeit nur bis irgendwann sein Event abgefeuert wird und dann tut er was und socket.emit(event) der SENDER ist, der das Event abfeuert.
        Jetzt nach ein bisschen Praxis ist mir das klar, aber vielleicht kannst dus n bisschen ausführlicher beschreiben…

        Cool, mach weiter!

        1. NodeCode / Beitrags-Autor

          Okay, ich habe einen Absatz unter den Websocket-Code hinzugefügt, in dem ich die Funktionsweise genauer beschreibe.

  91. Matze /

    Hallo,

    erstmal vielen vielen Dank für das Tutorial, hat mich motiviert mit nodejs anzufangen und letzendlich hab ichs jetzt auch zum Laufen bekommen!

    Allerdings hast du einmal einen kleinen Fehler eingebaut, der gerade Anfänger (die alle 1:1 so abtippen) verzweifeln lassen könnte:
    – teilweise schreibst du config.js statt config.json

    Und dann schreibst du nicht wie man den Server zum Laufen bekommt (ich habe lange Zeit einfach versucht, die index.html mit dem Browser zu öffnen, was nicht geklappt hat).

    Man muss in der Konsole in den Ordner gehen und dort den Server mit
    „node server.js“ (bzw. bei mir Linux „nodejs server.js“)
    starten. Dann kann man ihn im Browser mit localhost:8080 öffnen.

    Sonst aber alles super, vielen Dank!!

    LG Matze

    1. NodeCode / Beitrags-Autor

      Stimmt, ich habe zweimal config.js statt config.json geschrieben. Einmal in der Datei-Übersicht, und ein anderes mal gleich darunter bei der Erklärung des Server-Codes. Der Code selbst ist davon nicht betroffen. Ich habe den Fehler soeben korrigiert.

      Was das Starten des des Node.js-Servers angeht, so habe ich das bereits auf der Seite Konsolen Grundlagen ausführlich erklärt. Diese ist auch in der Sidebar oben rechts unter „Einführung in Node.js“ verlinkt, aber wahrscheinlich kommen die meisten Besucher direkt auf dieses Tutorial, und schauen am Ende nicht noch einmal nach oben. Ich werde daher noch einen Hinweis mit entsprechender Verlinkung in das Tutorial hinzufügen.

      1. Matze /

        Hey, ja stimmt, habe dein „Basics“ Tutorial jetzt auch gefunden, dann macht das alles schon Sinn! Meistens ist es ja aber bei so Tutorial Websiten, dass man wie du schon sagst, nur auf das Tutorial fixiert ist und nicht noch den „größeren Kontext“ der ganzen Website / Plattform im Auge hat. :)

  92. Flo /

    Hi, studiere grad nodejs und bin auf deinem Artikel gelandet. Hab ihn überflogen und versucht zu verstehen. Das hat funktioniert! Danke, Berichte weiter über deine Fortschritte… LG, Flo

hinterlasse einen Kommentar