質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1607閲覧

文字列の引き渡しがうまくいかない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/07/13 03:10

編集2018/07/13 04:07

前提・実現したいこと

C#をクライアント、javaをサーバとしてUnityでTcpClient通信をしています。

アカウント登録時には、ユーザー名とパスワードをクライアントプログラム側(C#側)で受け付け、それをWriteLineを用いてサーバ側(java側)に受け渡し、サーバはそれをテキストデータとして保存するという作業を行っています。ユーザー名とパスワードはstring型で保管しています。

ログイン時にはサーバがテキストデータに保管しているユーザー名とクライアント側が入力したユーザ名とが一致していた場合trueを返し、ログイン成功になります。

発生している問題・エラーメッセージ

問題はアカウント登録後に再ログインする際に発生しております。 ユーザー名を仮にuser、パスワードをpassとします。アカウント登録は問題なく行えており、サーバ側のテキストデータにもuser,passという風に保存できているのですが、ログインとなると、クライアント側はuser,passを正常にサーバに送れているにもかかわらずサーバが保管しているuserとクライアントが送ったuserが一致しません。エラーメッセージは「アカウントが存在しません」と出ます。一致するかの判定はequalsで行っています。 よろしくお願いします。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine.SceneManagement; 4using UnityEngine; 5using UnityEngine.UI; 6using System.Net; 7using System.Net.Sockets; 8using System.IO; 9 10public class LoginManager : MonoBehaviour { 11 12 13 NetworkStream ns; 14 StreamReader sr; 15 StreamWriter sw; 16 17 public string flag = "false3"; 18 public GameObject buttonMessage; 19 public GameObject buttonMessageText; 20 21 22 string playername; 23 private string password; 24 public InputField nameinputField; 25 public InputField passinputField; 26 27 28 29 public AudioClip mainAudio; 30 public static AudioSource audioSource; 31 public bool DontDestroyEnabled = true; 32 33 34 35 36 // Use this for initialization 37 void Start() 38 { 39 40 41 ns = TitleManager.tc.GetStream(); //違うシーンでtcpをつなげているためストリームの宣言だけ 42 sr = new StreamReader(ns); 43 sw = new StreamWriter(ns); 44 45 buttonMessage.SetActive(false); //警告ボタン非表示 46 47 48 49 } 50 51 // Update is called once per frame 52 void Update() 53 { 54 55 } 56 57 public void PushLoginButton() 58 { 59 60 61 62 playername = nameinputField.text; 63 password = passinputField.text; 64 65 Debug.Log("プレイヤ名は(" + playername + ")"); 66 Debug.Log("パスワードは" + password); 67 68 resetInputField(); 69 70 if (playername.Equals("") || password.Equals("")) 71 { 72 DisplayMessage("プレイヤ名またはパスワードを入力してください"); //何も入力されていないとき 73 74 } 75 else 76 { 77 sw.WriteLine("2"); //ログインかアカウント登録の判定。1はアカウント登録、2はログイン 78 sw.WriteLine(playername); 79 sw.WriteLine(password); //サーバに送信 80 81 sw.Flush(); 82 83 flag = GetData(sr); //サーバからログイン判定の受付 84 if (flag.Equals("false1")) //playernameが存在しないとき 85 { 86 DisplayMessage("アカウントが存在しません"); 87 } 88 else if (flag.Equals("false2")) //playernameが存在するがpassが違うとき 89 { 90 DisplayMessage("パスワードが違います"); 91 } 92 else if (flag.Equals("true")) //ログイン成功 93 { 94 95 /*sr.Close(); 96 sw.Close(); 97 ns.Close();*/ 98 TitleManager.audioSource.Stop(); 99 100 audioSource = gameObject.GetComponent<AudioSource>(); 101 audioSource.clip = mainAudio; 102 audioSource.Play(); 103 if (DontDestroyEnabled) 104 { 105 // Sceneを遷移してもオブジェクトが消えないようにする 106 DontDestroyOnLoad(this); 107 108 } 109 110 SceneManager.LoadScene("MainScene"); 111 } 112 } 113 } 114 115 public void PushAccountButton() 116 { 117 playername = nameinputField.text; 118 password = passinputField.text; 119 120 Debug.Log("プレイヤ名は" + playername); 121 Debug.Log("パスワードは" + password); 122 123 124 if (playername.Equals("") || password.Equals("")) 125 { 126 DisplayMessage("プレイヤ名またはパスワードを入力してください"); 127 128 } 129 else 130 { 131 sw.WriteLine("1"); 132 sw.WriteLine(playername); 133 sw.WriteLine(password); 134 135 sw.Flush(); 136 137 flag = GetData(sr); 138 if (flag.Equals("false")) 139 { 140 DisplayMessage("既に登録されているアカウント名です"); 141 } 142 else if (flag.Equals("true")) 143 { 144 /*sr.Close(); 145 sw.Close(); 146 ns.Close();*/ 147 148 TitleManager.audioSource.Stop(); 149 audioSource = gameObject.GetComponent<AudioSource>(); 150 audioSource.clip = mainAudio; 151 audioSource.Play(); 152 if (DontDestroyEnabled) 153 { 154 // Sceneを遷移してもオブジェクトが消えないようにする 155 DontDestroyOnLoad(this); 156 157 } 158 159 SceneManager.LoadScene("MainScene"); 160 } 161 } 162 163 164 //SceneManager.LoadScene("AccountScene"); 165 } 166 167 void resetInputField() 168 { 169 nameinputField.text = ""; 170 171 passinputField.text = ""; 172 173 174 } 175 176 public void DisplayMessage(string str) 177 { 178 buttonMessage.SetActive(true); 179 buttonMessageText.GetComponent<Text>().text = str; 180 } 181 182 public void PushButtonMessage() 183 { 184 buttonMessage.SetActive(false); 185 } 186 187 string GetData(StreamReader sr)//データ読み取り用メソッド 188 { 189 string gotdata = null; 190 do 191 { 192 gotdata = sr.ReadLine();//入力ストリームから読み取り 193 194 } while (gotdata == null); 195 196 return gotdata; 197 } 198 199 200}

java

1public boolean checkData(String name, String password, int playerNo) { 2 try { 3 4 FileReader fr = new FileReader("PlayerData.txt"); 5 BufferedReader br = new BufferedReader(fr); //入力ファイルオープン 6 String gotline, getst, getname; 7 StringTokenizer st; 8 9 10 System.out.println("checkData("+name+","+password+","+playerNo+")"); //サーバ確認 11 while((gotline=br.readLine()) != null) { 12 st = new StringTokenizer(gotline,",{=}"); 13 getst = st.nextToken(); 14 15 System.out.println(name.equals(getst)); 16 getname = new String(name); 17 18 //名前が一致したら 19 if(name.equals(getst)) { 20 br.close(); 21 22 //パスワードが一致したら 23 if((st.nextToken()).equals(password)) { 24 playerdata[playerNo] = new PlayerData(); 25 //playerdata[playerNo].title = new String[16][2]; 26 27 playerdata[playerNo].name = name; //名前格納 28 playerdata[playerNo].password = password; //パスワード格納 29 30 //TODO 進行度、それぞれの章の金額をクライアントに送信 31 32 pw[playerNo].println("true");//クライアントに成功通知 33 pw[playerNo].flush(); 34 System.out.println("アカウント確認 : 成功"); //サーバ確認 35 br.close(); 36 return true; 37 }else { 38 pw[playerNo].println("false2");//クライアントに失敗通知 39 pw[playerNo].flush(); 40 System.out.println("アカウント確認 : 失敗(パスワード不一致)"); //サーバ確認 41 br.close(); 42 return false; 43 } 44 } 45 } 46 47 pw[playerNo].println("false1");//クライアントに失敗通知 48 pw[playerNo].flush(); 49 System.out.println("アカウント確認 : 失敗(名前不一致)"); //サーバ確認 50 br.close(); 51 }catch(IOException e) { 52 e.printStackTrace(); 53 } 54 return false; 55 } 56 57 58 59 60 61 //アカウントの登録 62 public boolean makeData(String name, String password, int playerNo) { 63 try { 64 System.out.println("makeData("+playerNo+")"); //サーバ確認 65 66 FileReader fr = new FileReader("PlayerData.txt"); 67 BufferedReader br = new BufferedReader(fr); //ファイルオープン 68 String gotline; 69 StringTokenizer st; 70 71 //保存ファイルの読み込み開始 72 while((gotline=br.readLine()) != null) { 73 st = new StringTokenizer(gotline,","); 74 //名前があったら 75 if(st.hasMoreTokens()){ 76 if((st.nextToken()).equals(name)) { 77 pw[playerNo].println("false");//クライアントに失敗通知 78 System.out.println("アカウント登録 : 失敗(名前被り)"); 79 br.close(); 80 return false; 81 } 82 } 83 } 84 br.close(); 85 86 FileWriter fw = new FileWriter("PlayerData.txt", true); 87 BufferedWriter bw = new BufferedWriter(fw); //出力ファイルオープン 88 89 bw.write(name+","+password+","+"仮データ1"+","+"仮データ2\n"); //保存ファイルに書き込み(仮) 90 pw[playerNo].println("true");//クライアントに成功通知 91 System.out.println("アカウント登録 : 成功"); 92 bw.close(); 93 }catch(IOException e) { 94 e.printStackTrace(); 95 } 96 return true; 97 } 98 99

試したこと

テキストデータの一行目のplayernameは認識されないのですが、二行目以降は認識され、ちゃんとログインできることが確認できました。なぜ一行目だけちゃんと認識されないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「テキストデータの一行目のplayernameは認識されない」という点から、BOMが付いていませんか?
本来の文字数と取得した文字数を比較して3文字多いなら多分そうだと思うので、
TXTをBOM無しで保存するか該当文字列の先頭3文字を削れば動くのではないかと。

投稿2018/07/13 04:16

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/13 04:37

テキストデータをUTF-8NにしてBOMなしで保存してみたら一行目が認識されました! どうやらWindowsのメモ帳をテキストデータとして利用すると必ずBOM付きで保存されてしまうみたいですね。頭にBOMがついていたことによる誤認識でした。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問