LoginSignup
takuma408529
@takuma408529

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

他デバイスからローカルサーバーに接続出来ない

他デバイスからローカルサーバーに接続出来ない

環境
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

0

3Answer

Node.jsによるサーバ#5.5.1 なぜ他のパソコンで開けないか
自分のマシンをwebサーバにするというのは、誰にでも自分のマシンをアクセスできるようにするということになります。
あまり手軽にできてしまうと危険なので、Windowsファイアウォールの「接続していいリスト」にないものはブロックされるのが基本だと考えてください。
セキュリティソフトを使用している場合、そのセキュリティソフトのファイアウォールでも接続許可設定をする必要があると思います。

2

Comments

  1. @takuma408529

    Questioner

    回答ありがとうございます。
    なるほど、ファイアウォールですか。
    設定等をいじったことが無く、しばらく時間がかかりそうなため、差し当たって返信させていただきました。また理解できないことができ次第追って連絡させていただきます。

  2. @takuma408529

    Questioner

    お世話になっております。結論から先に申し上げますと、解決できました。

    Windows Defenderファイアウォールの設定→Windows Defenderを介したアプリまたは機能を許可→設定の変更→「Node.js JavaScript Runtime」のパブリックの項目にチェック
    で解決できました。ありがとうございます。質問なのですが、画像のように同じ名前の項目が複数あるのはなぜでしょうか。どの項目のパブリックにチェックを入れても、他デバイスから接続できました。単に「プライベートチェック用」と「パブリックチェック用」で複数用意されているのでしょうか?
    スクリーンショット (97).png

  3. ふつうはこんなにたくさんはなかったと思うので、インストールを繰り返すとそのたびに設定が追加されたとかですかね?
    「プライベートネットワーク用」「パブリックネットワーク用」「両方」を一つずつ残して、重複してるものは削除してもいいと思います。

  4. @takuma408529

    Questioner

    理由はわかりませんが、ファイアウォール設定をいじっているとまた増えました。そのようにします。ありがとうございます。

誰にでもアクセスを許可するというのは @albireo さんもおっしゃるとおり危険だと思います。そのうえで以下ご確認ください。

  1. 公開している(サーバを立てている)マシンのIPアドレスは何で確認しましたか?
  2. アクセスしようとしているデバイスに打ち込んだアドレスはプライベートIPアドレスですか?

自宅で開発されている場合はおそらくグローバルIPアドレスではおそらくアクセスが難しいと思われます。

1

Comments

  1. @takuma408529

    Questioner

    回答ありがとうございます。
    powersellでipconfigと入力し、確認しました。アクセスしようとしているデバイスには、ローカルIPアドレスを入力しています。
    念のため確認なのですが、「同じwifiに接続している=同じローカルネットワーク内におり、プライベートIPアドレスを入力することで接続できる」という認識で合っていますか。

アクセスしようとしているデバイスには、ローカルIPアドレスを入力しています。

プライベートIPアドレスの打ち間違いでしょうか?細かいようですが別物なので念のため

「同じwifiに接続している=同じローカルネットワーク内におり、プライベートIPアドレスを入力することで接続できる」

よほど特殊な環境でなければその認識で問題ないかと思います。ただし、家庭用では同じWiFiルーターを介していても周波数帯が異なれば別ネットワーク扱いになることが多いのでその点ご注意ください。

…いまふと気づいたのですが

server.listen(8000, 'localhost', () => {
  console.log('ポート8000!');
});

ここのコードってこのままですか?
そうであればlocalhostの部分をPCのプライベートIPアドレスに変えたらアクセスできませんかね?

0

Comments

  1. @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に変更しましたが、それ以外は変更していません。試してみましたが、それを変更しただけでは変わらずできませんでした。

Your answer might help someone💌