前提・実現したいこと
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は認識されないのですが、二行目以降は認識され、ちゃんとログインできることが確認できました。なぜ一行目だけちゃんと認識されないのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/07/13 04:37