In 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 Moduleserver.js
â unser Node.js-Serverconfig.json
â die Konfiguration für den Serverpublic/
â der Ordner für die öffentlichen Dateienpublic/index.html
â unsere HTML-Dateipublic/style.css
â unsere Stylesheet-Dateipublic/client.js
â unsere clientseitige JavaScript-Dateipublic/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. ð
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.
Tutorial: Einfacher Chat mit Node.js und WebSocket,
СоÑиалÑнÑе ÑеÑи ÑÐµÐ³Ð¾Ð´Ð½Ñ â ÑÑо одно из ÑамÑÑ Ð·Ð½Ð°ÑиÑелÑнÑÑ ÑеÑÑиÑоÑий Ð´Ð»Ñ Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð±Ð¸Ð·Ð½ÐµÑа, подаÑи ÑÐµÐºÐ»Ð°Ð¼Ñ Ð¸ вÑего Ñого, ÑÑо каÑаеÑÑÑ Ð¿ÑивлеÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑого колиÑеÑÑва лÑдей . ÐÐонÑаке, ÐнÑÑагÑам, YouTube â Ð²Ð¾Ñ Ð¾Ð´Ð½Ð¸ из ÑамÑÑ ÑазвиÑÑÑ Ð¿Ð»Ð¾Ñадок. ÐÑÐ¾ÐµÐºÑ smmdroid.ru пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð±ÐµÐ· лиÑÐ½Ð¸Ñ Ð·Ð°ÑÑÑднений не ÑолÑко ÑаÑкÑÑÑиÑÑ ÑообÑеÑÑво или ÑÑÐµÐ½Ñ Ð² VK, ÑобÑаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиков, набÑаÑÑ Ð»Ð°Ð¹ÐºÐ¸ и «палÑÑÑ Ð²Ð²ÐµÑÑ Â» в YouTube, но и авÑомаÑиÑеÑки Ñам заÑабаÑÑваÑÑ Ð½Ð°ÑÑоÑÑие денÑги. ÐлагодаÑÑ smmdroid, можно наÑладиÑÑÑÑ ÐºÐ°ÑеÑÑвеннÑм ÑезÑлÑÑаÑом , и в оÑлиÑие Ð¾Ñ ÐºÐ¾Ð½ÐºÑÑенÑов, Ð½Ð°Ñ Seo-гÑÑппа, как Ñже бÑло Ñказано , позволÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸ вÑвеÑÑи денÑги. ÐÑе завиÑÐ¸Ñ Ð»Ð¸ÑÑ Ð¾Ñ Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¸ пÑедпоÑÑений.
ÐеÑаллиÑеÑкие ÑÑÑоиÑелÑнÑе леÑа
ÐеÑа из ÑÑалÑнÑÑ Ð¸Ð»Ð¸ алÑминиевÑÑ ÑÑÑб пÑоизводÑÑÑÑ Ð¿ÑомÑÑленнÑм ÑпоÑобом в двÑÑ Ð¾ÑновнÑÑ Ð²Ð°ÑианÑÐ°Ñ â ÑамнÑе и модÑлÑнÑе. Ð ÑамнÑм оÑноÑÑÑÑÑ ÑлажковÑе, ÑÑÑÑевÑе леÑа и вÑÑки-ÑÑÑÑ, к модÑлÑнÑм â клиновÑе, Ñ Ð¾Ð¼ÑÑовÑе, подвеÑнÑе (кÑепление к неÑÑÑим конÑÑÑÑкÑиÑм зданий) и модÑлÑнÑе (ÑиÑÑемнÑе) леÑа. ÐонÑÑÑÑкÑÐ¸Ñ ÑÑÑоиÑелÑнÑÑ Ð»ÐµÑов, не завиÑимо Ð¾Ñ Ð¸Ñ Ñипа, должна ÑооÑвеÑÑÑвоваÑÑ ÐÐСТ 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 м).
ÐÑиобÑеÑÑи в гоÑовом виде можно лиÑÑ ÑаÑÑÑ Ð¿Ð¾Ð´Ð²ÐµÑнÑÑ Ð»ÐµÑов â ÑÑ, ÑÑо обÑазÑÐµÑ Ð²Ð½ÐµÑние ÑÑÑÑÑ, Ñ.е. ÑлеменÑÑ Ñ Ð¾Ð¼ÑÑовÑÑ Ð»ÐµÑов. РаÑпоÑки-конÑоли ÑаÑÑÑиÑÑваÑÑÑÑ Ð¸ пÑоизводÑÑÑÑ Ð¿Ð¾Ð´ конкÑеÑнÑй обÑÐµÐºÑ Ð¸ не могÑÑ Ð±ÑÑÑ ÑниÑиÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² ÑÐ¸Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑкÑивнÑÑ ÑазлиÑий ÑазнÑÑ Ð·Ð´Ð°Ð½Ð¸Ð¹ â Ð¸Ñ Ð½Ñжно заказÑваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно. Цена подвеÑнÑÑ Ð»ÐµÑов ÑолÑко договоÑнаÑ.
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
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
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.
ÐÑÑзÑÑ Ñ Ð¾ÑÑ Ñ Ðами поделиÑÑÑÑ, наÑла деÑовое ÐоÑÑелÑное 3D белÑе по Ñене Ð¾Ñ Ð¿ÑоизводиÑелÑ.Ðа еÑе и ÐÐСÐÐÐТÐÐЯ ÐÐСТÐÐÐÐ ÐРвÑей РоÑÑии.ÐÑи покÑпке Ð¾Ñ Ð´Ð²ÑÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑов!ÐÐ¾Ñ ÑÑÑлка на ÑÐ°Ð¹Ñ http://c.twtn.ru/n9pm
Pingback: essayforme /
Find yourself a girl right now, click here
УÑлÑги ÑаÑÑного деÑекÑива
ÐÑедоÑÑавлÑем полнÑй ÑпекÑÑ Ð´ÐµÑекÑивнÑÑ ÑÑлÑг
ÐаÑи плÑÑÑ: ÐÑегда озвÑÑиваем возможноÑÑи и инÑоÑмаÑÐ¸Ñ ÐºÐ°Ðº еÑÑÑ, наÑи ÑÐµÐ½Ñ Ð² 2-3 Ñаза ниже Ñем Ñ Ð±Ð¾Ð»ÑÑинÑÑва конкÑÑенÑов, огÑомнÑй опÑÑ Ð¸ Ð·Ð°Ð¿Ð°Ñ ÐºÑеаÑива, делаем Ñо, ÑÑо многие ÑÑиÑаÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм.
Ðе беÑем пÑедоплаÑ, не занимаемÑÑ Ð²ÑÑаÑÑванием денег. ÐонÑÑлÑÑаÑÐ¸Ñ Ð±ÐµÑплаÑно.
1. ÐÑобив абÑолÑÑно лÑбой инÑоÑмаÑии
ÐÑобив по мобилÑнÑм ÑиÑÑемам (деÑализаÑиÑ, паÑпоÑÑнÑе даннÑе, опÑеделение меÑÑоположениÑ)
СпекÑÑ ÑÑлÑг:
Ð¡Ð±Ð¾Ñ Ð°Ð±ÑолÑÑно лÑбой инÑоÑмаÑии о Ñеловеке
ÐпÑеделение меÑÑÐ¾Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñеловека по номеÑÑ ÑелеÑона
ÐеÑализаÑÐ¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ¾Ð² и ÑмÑ
ÐнÑоÑмаÑÐ¸Ñ Ð¸Ð· поÑÑ Ð¸ ÑоÑиалÑнÑÑ ÑеÑей
ÐÑÑвление ÑакÑа ÑÑпÑÑжеÑкой невеÑноÑÑи
РозÑÑк должников
РозÑÑк имÑÑеÑÑва должника
РозÑÑк безвеÑÑи пÑопавÑÐ¸Ñ Ð»Ñдей
РозÑÑк ÑодÑÑвенников и лÑдей Ñ ÐºÐ¾ÑоÑÑми ÑÑеÑÑна ÑвÑзÑ
РозÑÑк моÑенников
ÐÑовеÑка обÑаза жизни Ñебенка
ÐомоÑÑ ÑодиÑелÑм (ÑÑ Ð¾Ð´ из дома, пÑавонаÑÑÑениÑ, наÑкоманиÑ)
УÑлÑги по вÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑалÑÑивÑÑ Ð½ÐµÐ²ÐµÑÑ
СодейÑÑвие адвокаÑам
ÐомоÑÑ Ð² Ñголовном ÑаÑÑледовании, ÑÐ±Ð¾Ñ Ð´Ð¾ÐºÐ°Ð·Ð°ÑелÑÑÑв
Ð¡Ð±Ð¾Ñ ÐºÐ¾Ð¼Ð¿ÑомаÑа
Ð¡Ð±Ð¾Ñ Ð¸Ð½ÑоÑмаÑии о ÑÑидиÑеÑÐºÐ¸Ñ Ð»Ð¸ÑаÑ
ÐÑовеÑка пеÑÑонала
ÐбеÑпеÑение анонимной ÑвÑзи и инÑоÑмаÑионной безопаÑноÑÑи
ÐонÑÑÐ¾Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»Ñного ÑелеÑона
ÐаÑиÑа компÑÑÑеÑной ÑÐµÑ Ð½Ð¸ÐºÐ¸
ÐоÑÑÑановление ÑÑеÑÑнной инÑоÑмаÑии
Ðказание ÑÑидиÑеÑкой помоÑи
Ðказание коллекÑоÑÑÐºÐ¸Ñ ÑÑлÑг
ÐонÑакÑÑ:
+79180520135 – (ÑелеÑон, viber, whatsapp, skype)
Telegram – @RFDetective
поÑÑа – [email protected]
СолиднÑй заÑабоÑок в ÐнÑеÑнеÑе – ÑÑо ÑеалÑно!
ЧÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ ÑезÑлÑÑаÑа?
ÐÑо ÑамÑй пÑоÑÑой ÑпоÑоб наÑаÑÑ Ð·Ð°ÑабаÑÑваÑÑ Ð² ÐнÑеÑнеÑе Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ нÑлÑ.
ÐÑ Ð²Ð°Ñ Ð¿Ð¾ÑÑебÑеÑÑÑ ÑолÑко компÑÑÑÐµÑ Ð¸ Ñмение ÑиÑаÑÑ.
ÐÑÑалÑнÑе дейÑÑÐ²Ð¸Ñ Ð²Ñ Ð¾ÑвоиÑе за ÑÐ°Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ð¸Ð´ÐµÐ¾ÑÑоков.
РабоÑа по наÑей ÑÑ ÐµÐ¼Ðµ бÑÐ´ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ñ Ð²Ð°Ñ Ð´Ð¾ 1 ÑаÑа вÑемени в денÑ.
ÐÑ Ð±ÐµÑеÑе Ñолики из аÑÑ Ð¸Ð²Ð°, заливаеÑе Ð¸Ñ Ð½Ð° канал и опÑимизиÑÑеÑе.
ÐÑли Ð»ÐµÐ½Ñ Ð´ÐµÐ»Ð°ÑÑ ÑамомÑ, Ñо можно поÑÑÑиÑÑ ÑоÑÑÑÐ´Ð½Ð¸ÐºÑ Ð¸Ð»Ð¸ жене.
ÐÑаÑва! ÐаÑабаÑÑвайÑе доÑÑойно на ваÑем ÑайÑе, youtube-канале или гÑÑппе Ñ ÑкÑклÑзивнÑми паÑÑнеÑÑкими пÑогÑаммами казино:
https://www.youtube.com/channel/UCYmxBOW2LC7CFgtcF__-OSg
Сделай Ñвой пеÑвÑй Ñаг к ÑÑÐ¿ÐµÑ Ñ Ð² пÑавилÑном напÑавлении.
ТолÑко акÑÑалÑнÑе ÑиÑÑÐµÐ¼Ñ Ð¾Ð±ÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ заÑабоÑков, никакой водÑ!!! ÐÑÐ±Ð¾Ñ Ð·Ð° Ñобой!!!
ÐодÑобнее!
http://mobgamez.at.ua/forum/2-1-1 лÑбовниÑÑ Ð´Ð¾Ñого
ÐоÑледние новоÑÑи андÑоид здеÑÑ hi-android.net
Kann man damit nur über das Netzwerk oder auch durch das Internet kommunizieren?????
[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 –
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
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
Ð âСÐÐ ÑСÐ-Ð ÑÐ âлеСâ.
ÐÑо Ñ Ð¾ÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð°ÑабоÑок Ð´Ð»Ñ Ð½Ð°ÑинаÑÑÐ¸Ñ , ÑÑ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: ÑпоÑÐ¾Ð±Ñ Ð¿Ð°ÑÑивного заÑабоÑка в инÑеÑнеÑе
Свежие новоÑÑи в миÑе Ñкономики
ÐиÑай обÑÑвил о наÑале ÑнеÑгеÑиÑеÑкой ÑеволÑÑии: найден гоÑÑÑий лед
ÐÑавиÑелÑÑÑво ÐÐÐ ÑообÑило о пÑоÑÑве в ÑнеÑгеÑике:
в ÑÑой ÑÑÑане впеÑвÑе в миÑе ÑдалоÑÑ Ð´Ð¾Ð±ÑÑÑ Ñак назÑваемÑй гоÑÑÑий лед,
коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑийÑи на ÑÐ¼ÐµÐ½Ñ Ð½ÐµÑÑи и газÑ. ЧиÑаÑÑ Ð´Ð°Ð»ÐµÐµ
ХоÑеÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð°ÑабоÑок Ð´Ð»Ñ Ð½Ð°ÑинаÑÑÐ¸Ñ , ÑÑ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: ÑеалÑнÑй заÑабоÑок в инÑеÑнеÑе не Ð»Ð¾Ñ Ð¾ÑÑон оÑзÑвÑ
ÐоÑледние новоÑÑи здеÑÑ kfaktiv.ru
http://clashroyalehackz.mobi/ clash royale free gems
ÐоÑледние женÑкие новоÑÑи здеÑÑ logwoman.ru
Klasse gemacht, gut beschrieben, keine Fragen offen – Danke!!!
http://www.phatflags.com/?page_id=buy-discount-sildenafil-online&category=purchase
http://meendo.lipoly.ru/51a327db6b4b0.gif
Рвам нÑжна ÑабоÑа дома
ÐÐ°Ñ Ð´Ð¾Ñ Ð¾Ð´ Ð¾Ñ 100 000 ÑÑблей в меÑÑÑ Ð³Ð°ÑанÑиÑован, поÑÐ¾Ð¼Ñ ÑÑо:
1.ÐÑ Ð¿Ð¾Ð»ÑÑаеÑе ÑÑÐ°Ð·Ñ 3 (!!!) меÑодики:
заÑабоÑок Ð´Ð»Ñ Ð»ÐµÐ½Ð¸Ð²ÑÑ ;
заÑабоÑок Ð´Ð»Ñ Ð°ÐºÑивнÑÑ ;
заÑабоÑок Ð´Ð»Ñ Ð¿ÐµÐ½ÑионеÑов, Ð´Ð¾Ð¼Ð¾Ñ Ð¾Ð·Ñек, ÑÑÑденÑов и не ÑолÑко
2.ÐаÑеÑÐ¸Ð°Ð»Ñ ÐºÑÑÑа ÑодеÑжаÑ:
поÑаговÑе видео ÑÑоки;
дополниÑелÑнÑе маÑеÑиалÑ;
СмоÑÑеÑÑ ÑпиÑок вÑÐµÑ ÑÑÑлок Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ ÑабоÑÑ
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. 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
http://meendo.lipoly.ru/52b7f17b2fec2.gif
РеÑил вÑбÑаÑÑ Ñебе ÑамогоннÑй аппаÑаÑ.
ÐенаÑ. Ðвое деÑей. Ðе алкоголик. Ðе боÑÐµÑ Ð·Ð° ÑÑезвоÑÑÑ.
Ðо ÑÑÑ Ð¾Ð±ÑÑаи. ÐÑÐ¸Ñ Ð¾Ð´ÑÑ Ð´ÑÑзÑÑ, гоÑÑи, не ÑолÑко в пÑаздники.
Ðе обÑзаÑелÑно, конеÑно, но иногда, ÑовÑем не вÑедно. Тем более, ÑÑо
Ð¸Ð¼ÐµÑ Ñад Ñ Ð¾Ð³ÑомнÑми Ñблоками, пÑопадаÑÑ.
ÐÐµÐ»Ð°Ñ Ð±ÑагÑ, без пеÑегона. Ðе оÑÐµÐ½Ñ Ñо. конеÑно можно пиÑÑ, но на ÑÑол ÑÑавиÑÑ…
Ðе ÑовÑем – Ñо.
ÐÑÑ-Ñавно – бежаÑÑ Ð·Ð° водкой.
аппаÑÐ°Ñ Ñо, ÐÑÑ-Ñавно бÑÐ´Ñ Ð±ÑаÑÑ, ÑмоÑÑел много.
ÐÐ¾Ñ Ðдин, вÑоде опÑималÑнÑй. Ð Ð°Ð·Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑаÑиÑ. Рпо Ñене.
ÐвойнÑÑ Ð¿ÐµÑÐµÐ³Ð¾Ð½ÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð° Ðдин пÑогон.
РобÑем – ÑÑдо маÑина.
http://krn.krapovy.ru/images/gorynych.jpg
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
ÐеÑаллоконÑÑÑÑкÑии пÑоизводим! ÐÑоизводим меÑаллоконÑÑÑÑкÑии по ÑеÑÑежам заказÑика. РазÑабоÑаем ÐРи ÐÐÐ. http://www.nvzmk.ru/
http://meendo.lipoly.ru/50885eb09b3f5.gif
http://meendo.lipoly.ru/51d6815384c42.gif
http://meendo.lipoly.ru/51d67c63d3de9.gif
http://meendo.lipoly.ru/51949f7792622.gif
http://meendo.lipoly.ru/51a32a6bb53f2.gif
http://meendo.lipoly.ru/51d67c66bf5c8.gif
http://meendo.lipoly.ru/51a8b953092ae.gif
http://meendo.lipoly.ru/51a34be62943a.gif
ÐÑоизводÑÑво изделий из меÑалла ÐазеÑÐ½Ð°Ñ Ñезка, гибка, ÑваÑка. ÐоÑоÑÐºÐ¾Ð²Ð°Ñ Ð¾ÐºÑаÑка. ÐÐÐÐÐ
http://meendo.lipoly.ru/51d67a38cf542.gif
It’s going to be finish of mine day, but before finish I am reading this fantastic piece of writing to increase my experience.
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. }
Pingback: [DISKUSSION] vorgehen bei user-to-user/private chat mit php und websockets /
Einfach danke, wirklich sehr gut erklärt!
Wie kann man den Client / Server Code so anpassen, dass hinter dem Namen zwangsweise die IP des Client rechners angezeigt wird?
Sehr verständlich und gut nachvollziehbar verfasst, vielen Dank!
Danke für dieses Tutorial
Tolle Tutorial!!!
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“
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‘));
schönes Tutorial
Kann man dies auch mit Apache2 verbinden? Also das man nicht gleich einen eigenen Webserver starten muss .-. ?
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.
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“: „*“
}
}
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?
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….
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.
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
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.
Vielen Dank für dein Tutorial, für den Anfang war das sehr cool zu sehen wie so eine Beispielapp funktioniert!
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!
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?
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
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.
Du nutzt anscheinend Express 4 anstatt 3, in der
app.configure
nicht mehr existiert. Hast du wie am Ende des Tutorials beschreibennpm install
im entsprechendem Verzeichnis ausgeführt? Dann müsste nämlich Express 3 automatisch installiert werden.Danke für die schnelle Antwort. Hat alles geklappt! Vielen Dank
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.
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.
Perfekt, weil simple gehalten!
Vielen Dank!
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?
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.
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,
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?
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
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…
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
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.
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
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 der1024
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.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?
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.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!
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 ð
Pingback: Beispiel Chat mit Node.JS | IT-Sommerfest /
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
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.
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.
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
Sehr schönes einfach gehaltenes Tutorial, danke sehr.
Hey sau geil
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?
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 ð
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
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
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 ð
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.
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.jsonHallo,
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 ?
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)
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!
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…
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 derindex.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.
Hast du die funktion $(document).ready(function(){}
in der datei client.js korrekt ?
Diese funktion umschliesst allen nachfolgenden code innerhalb der client.js ?
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)
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
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!
Danke dir, geht jetzt =)
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.
Das scheint wohl ein allgemeines Problem mit NPM unter Windows zu sein. Die Lösung besteht scheinbar darin, manuell einen Ordner namens
npm
unterC:\Users\junichs\AppData\Roaming\
anzulegen.http://stackoverflow.com/questions/25093276/nodejs-windows-error-enoent-stat-c-users-rt-appdata-roaming-npm
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?
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:
Ich hoffe, dass ich dir hiermit weiterhelfen konnte. Falls es noch weitere Probleme geben sollte, sag mir einfach bescheid
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?
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.
@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.
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.
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
Hallo, vielen Dank für diese „Schnelleinführung“ in socket.io.
Für Einsteiger einfach, systematisch und verständlich erklärt.
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!
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.
Ich habe tatsächlich fälschlicherweise
socket.emit()
anstattio.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 durchsocket.emit(âtoClientâ, data)
undsocket.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) {
durchio.sockets.on('connection', function (server) {
, und am Clientvar socket = io.connect();
durchvar socket = io.connect();
ersetzen. Dann könntest du mitserver.emit(âchatâ, data)
vom Server zum Client, und mitclient.emit(âchatâ, data)
vom Client zum Server senden. Bei dem verwenden des Variablennamensserver
aber Aufpassen, der gleiche Name schon für das in Zeile 3 geladene HTTP-Modul verwendet wird. Innerhalb vonio.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.
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!
Okay, ich habe einen Absatz unter den Websocket-Code hinzugefügt, in dem ich die Funktionsweise genauer beschreibe.
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
Stimmt, ich habe zweimal
config.js
stattconfig.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.
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.
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