Node.jsによるサーバ#5.5.1 なぜ他のパソコンで開けないか
自分のマシンをwebサーバにするというのは、誰にでも自分のマシンをアクセスできるようにするということになります。
あまり手軽にできてしまうと危険なので、Windowsファイアウォールの「接続していいリスト」にないものはブロックされるのが基本だと考えてください。
セキュリティソフトを使用している場合、そのセキュリティソフトのファイアウォールでも接続許可設定をする必要があると思います。
他デバイスからローカルサーバーに接続出来ない
他デバイスからローカルサーバーに接続出来ない
環境
OS Windows10
コーディングソフト VScode
使用言語 JavaScript
その他環境 Nodejsを仕使用し、サーバー側、クライアント側共にJSで記入。Nodemonを使用。
サーバー関連の処理を学び始めたばかりの初心者です。サーバーを立てているPC自体のブラウザから、「localhost:8000」と検索すると接続できました。
ほかデバイスからも接続してみたいと思い調べてみたところ、「同じWifiに接続し、『[IPアドレス]:8000(xx.x.xxx.xx:8000)』と入力すると接続できる」ようなのですが、自分の環境だと接続できません。
恐らく常識的な何かを見落としているのだとは思うのですが、調べても分からなかったので、思い当たるところを教えていただけると幸いです。よろしくお願いします。
このサイトにアクセスできません。
xx.x.xxx.xxからの応答が長すぎます。
ERR_CONNECTION_TIMED_OUT
該当するソースコード
const http = require('http');
const fs = require('fs');
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html');
let path;
switch (req.url) {
case '/':
path = './views/index.html';
// ステータスコードを割り当て
res.statusCode = 200;
break;
case '/about':
path = './views/about.html';
// ステータスコードを割り当て
res.statusCode = 200;
break;
// リダイレクトさせたいページ
case '/about1':
// 別のcaseを設定する
res.setHeader('Location', '/about');
// ステータスコードをリダイレクトに割り当て
res.statusCode = 301;
res.end();
break;
default:
path = './views/404.html';
// ステータスコードを割り当て(404ページでも200になってしまうため)
res.statusCode = 404;
break;
}
// fs.readFile('./views/index.html', (err, data) => {
fs.readFile(path, (err, data) => {
if (err) {
console.log(err);
res.end();
} else {
res.end(data);
}
});
});
server.listen(8000, 'localhost', () => {
console.log('ポート8000!');
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>htmlファイルですあいうえお</h1>
</body>
</html>
{
"name": "nodejs-tutorial-youtube",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"poka": "nodemon index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"http": "^0.0.1-security"
},
"dependencies": {
"ws": "^8.17.0"
}
}
自分で試したこと
他デバイスからの接続ですが、以下のOS、ブラウザで試しました。
Android
Brave
Androidブラウザ
Chrome
iPhone
Brave
Safari
参考にした動画
https://www.youtube.com/watch?v=Zk7tpzaKv0U&t=875s
https://www.youtube.com/watch?v=W4bd81KPtp4
3Answer
Comments
@takuma408529
Questioner回答ありがとうございます。
なるほど、ファイアウォールですか。
設定等をいじったことが無く、しばらく時間がかかりそうなため、差し当たって返信させていただきました。また理解できないことができ次第追って連絡させていただきます。@takuma408529
Questionerふつうはこんなにたくさんはなかったと思うので、インストールを繰り返すとそのたびに設定が追加されたとかですかね?
「プライベートネットワーク用」「パブリックネットワーク用」「両方」を一つずつ残して、重複してるものは削除してもいいと思います。@takuma408529
Questioner理由はわかりませんが、ファイアウォール設定をいじっているとまた増えました。そのようにします。ありがとうございます。
誰にでもアクセスを許可するというのは @albireo さんもおっしゃるとおり危険だと思います。そのうえで以下ご確認ください。
- 公開している(サーバを立てている)マシンのIPアドレスは何で確認しましたか?
- アクセスしようとしているデバイスに打ち込んだアドレスはプライベートIPアドレスですか?
自宅で開発されている場合はおそらくグローバルIPアドレスではおそらくアクセスが難しいと思われます。
Comments
@takuma408529
Questioner回答ありがとうございます。
powersellでipconfigと入力し、確認しました。アクセスしようとしているデバイスには、ローカルIPアドレスを入力しています。
念のため確認なのですが、「同じwifiに接続している=同じローカルネットワーク内におり、プライベートIPアドレスを入力することで接続できる」という認識で合っていますか。
アクセスしようとしているデバイスには、ローカルIPアドレスを入力しています。
プライベートIPアドレスの打ち間違いでしょうか?細かいようですが別物なので念のため
「同じwifiに接続している=同じローカルネットワーク内におり、プライベートIPアドレスを入力することで接続できる」
よほど特殊な環境でなければその認識で問題ないかと思います。ただし、家庭用では同じWiFiルーターを介していても周波数帯が異なれば別ネットワーク扱いになることが多いのでその点ご注意ください。
…いまふと気づいたのですが
server.listen(8000, 'localhost', () => {
console.log('ポート8000!');
});
ここのコードってこのままですか?
そうであればlocalhost
の部分をPCのプライベートIPアドレスに変えたらアクセスできませんかね?
Comments
@takuma408529
QuestionerプライベートIPアドレスの打ち間違いでしょうか?細かいようですが別物なので念のため
ほとんどのサイトは同義として扱われていました。自分が記入している物がどちらなのか「ローカルIPアドレス 調べ方」「プライベートIPアドレス 調べ方」どちらの場合でも同じやり方が出てきたので、問題ないと思います。
https://e-words.jp/w/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABIP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9.html
このサイトによると使われる場面で言葉が違うだけのように感じますが、この認識だとまずいでしょうか。よほど特殊な環境でなければその認識で問題ないかと思います。ただし、家庭用では同じWiFiルーターを介していても周波数帯が異なれば別ネットワーク扱いになることが多いのでその点ご注意ください。
ありがとうございます。周波数は同じものをつかっています。
ここのコードってこのままですか?
そうであればlocalhostの部分をPCのプライベートIPアドレスに変えたらアクセスできませんかね?もともと3000だったのを8000に変更しましたが、それ以外は変更していません。試してみましたが、それを変更しただけでは変わらずできませんでした。