2014-10-09 191 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

相关问题