2014-10-09 225 views
2

我正在使用套接字連接我的客戶端與服務器,我需要一種方式,以便當有人試圖使用某個帳戶在客戶端上登錄時,它會將用戶名和密碼發送給服務器,並檢查該帳戶是否存在。我只需要知道如何在按登錄時將消息發送到服務器。從客戶端發送到服務器的Java消息

我想這使它將消息發送到服務器

public static void sendmsg(String a, String b) 
    { 
     try 
     { 
      String host = "127.0.0.1"; 
      int port = 43655; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 


      String sendMessage = a; 
      bw.write(sendMessage); 
      bw.flush(); 
      System.out.println("Message sent to the server : "+sendMessage); 

      //Get the return message from the server 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String message = br.readLine(); 
      System.out.println("Message received from the server : " +message); 
     } 
     catch (Exception exception) 
     { 
      exception.printStackTrace(); 
     } 
     finally 
     { 
      //Closing the socket 
      try 
      { 
       socket.close(); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

我們需要更多信息。你已經嘗試過一些東西嗎?如果是這樣,你卡在哪裏? – Mekap 2014-10-09 21:03:31

+0

那麼我試着做一個方法,我可以發送消息到服務器這樣 - public void msgServer(String a,String b){但我無法弄清楚如何使它發送消息到服務器。 – dumbnerd111 2014-10-09 21:05:51

+0

好的我編輯了問題 – dumbnerd111 2014-10-09 21:10:14

回答

0

您所做的一切看起來不錯給我,但一切都取決於什麼服務器期望接收。除非已經包含在您的變量String a中,否則什麼是終止字符?

如果服務器要求行字符的結尾(您目前不發),你可以使用PrintWriter代替BufferedWriter這樣

pw = new PrintWriter(socket.getOutputStream(), true); 
pw.println(a); 

那麼你的服務器會做這樣的事情您正在使用套接字工作

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String value = br.readLine(); 
+0

有沒有辦法在不打開另一個套接字的情況下執行此操作? – dumbnerd111 2014-10-09 21:59:21

+0

只有一個插座可以打開。這取代你的代碼 – Brad 2014-10-10 07:24:48

1

不錯,還有我有一個方法,你可以試試,也許,如果它是有用的,你可以考慮爲您實現。

首先,我將創建一個實體來處理這些值並將其填入傳入數據。

class UserAuth { 
    private String username; 
    private String password; 
    //Consider here your getters and setters, I am not including them  
} 

我將使用實體作爲在發送方法的參數,也許你可以填充它,就像這樣:

UserAuth attemptingUser = new UserAuth(...) 

ObjectInputStream的正常工作對這些類型的場景。如果你仍然想使用字符串,你可以使用BufferedReader並嘗試將你的用戶名和密碼合併爲一個字符串,並使用.readLine()方法獲得(用逗號分隔),然後使用String方法,例如Split,但我發現這可能需要更多的時間,如果你用一個對象處理它應該會更好。但這取決於你想添加到你的應用程序的複雜性:)。

class AuthClient { 

    public void sendMsg(UserAuth attemptingUser) { 
     String host = "localhost"; 
     int port = 2055; 
     //1. Create the socket 
     Socket sender = new Socket(host, port); 
     //2. Create an object output stream to write the object into the stream 
     ObjectOutputStream outputWriter = new ObjectOutputStream(sender.getOutputStream()); 
     //3. Write (send the object) 
     outputWriter.writeObject(attemptingUser); 
     //4. Close 
     outputWriter.close(); 
     sender.close(); 
    } 
} 

class AuthServer { 

    ServerSocket ss = new ServerSocket(2055); 

    public void receiveMsg() { 
     //1. Accept the connection 
     Socket conn = ss.accept(); 
     //2. Receive the flow 
     ObjectInputStream readStream = new ObjectInputStream(conn.getInputStream()); 
     //3. Read the object 
     UserAuth userReceived = readStream.readObject(); 
     //4. Verify against file, db or whatever 
     if (userReceived.getUsername().equals("admin") && userReceived.getPassword().equals("admin")) { 
      //Authentication 
     } 
    } 

} 

(這被添加爲我編輯你問我的意見的部分)

public void sendMsg(String username, String password) { 
      String host = "localhost"; 
      int port = 2055; 
      //1. Create the socket 
      Socket sender = new Socket(host, port); 
      //2. Create the UserAuth object based on the parameters you received 
      UserAuth myuser = new UserAuth(); 
      myuser.setUsername(username); 
      myuser.setPassword(password); 
      //3. Follow same instructions for the creation of ObjectOutputStream... 
      ObjectOutputStream objectWriter = new ObjectOutputStream(sender.getOutputStream()); 
      objectWriter.writeObject(myuser); 
      //That is what I would use if I keep your structure 
     } 

如果你想使用字符串,讓您的結構,我將簡化和降低我的影響/ O通過使用String方法。既然你知道你總是期待用戶/密碼,我會合並你的兩個參數在一個單一的字符串或使用特殊的字符和在服務器端處理StringTokenizer類。或者,也許可以用「分割」方法來處理。你在這裏有很多選擇。

到目前爲止,這將是我面對您遇到的問題的方法。希望它以某種方式幫助。最好的問候和快樂的編碼:)。

+0

有沒有辦法做到這一點,而無需打開另一個套接字?服務器已經有一個,所以我不希望它關閉那個我希望它使用相同的那個 – dumbnerd111 2014-10-09 22:34:21

+1

你打開另一個套接字是什麼意思?爲了在這種情況下發送消息,您需要兩個套接字。處理服務器連接和另一個套接字的服務器是接受客戶端的傳入連接。或者你想要做什麼? – 2014-10-09 23:49:09

+0

哦,好吧,當我添加這些時我怎麼會得到錯誤?它與UserAuth嘗試用戶= UserAuth(...)我不知道該怎麼做。 – dumbnerd111 2014-10-10 00:32:45