如何通过网络发送消息?

时间:2014-01-07 20:41:28

标签: java networking client-server

我希望能够通过网络发送简单的消息。任何消息。

具体来说,我想要一个一直在运行的服务器,以及一个可以根据需要连接到服务器并与之通信的客户端。

我不知道从哪里开始。通过网络发送消息的最简单方法是什么?

2 个答案:

答案 0 :(得分:2)

从教程Reading from and Writing to a Socket开始,您可以从使用echo server的简单ServerSocket开始,

public static void main(String[] args) throws Exception {
  // create socket
  int port = 4444;
  ServerSocket serverSocket = new ServerSocket(port);
  System.err.println("Started server on port " + port);

  // repeatedly wait for connections, and process
  while (true) {
    // a "blocking" call which waits until a connection is requested
    Socket clientSocket = serverSocket.accept();
    System.err.println("Accepted connection from client");

    // open up IO streams
    BufferedReader in = new BufferedReader(new InputStreamReader(
            clientSocket.getInputStream()));
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
    // waits for data and reads it in until connection dies
    // readLine() blocks until the server receives a new line from
    // client
    String s;
    try {
        while ((s = in.readLine()) != null) {
            out.println(s);
            out.flush();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    // close IO streams, then socket
    System.err.println("Closing connection with client");
    out.close();
    in.close();
    clientSocket.close();
}

然后你可以使用“telnet localhost 4444”来测试它,或写一个完整的客户端;也许就像上面教程中的客户端一样。

答案 1 :(得分:2)

好的,这个问题非常开放。首先,有几个问题需要回答:您是要实现自己的服务器还是使用现有技术。 JMS-API显然将成为后一种情况的起点。存在许多实现提供程序,Glassfish本身的参考实现,HornetQ既可以是独立的,也可以作为JBoss实例的一部分,仅举两个例子。在理解一些基本概念时,使用JMS发送消息非常简单,它们可以包含文本和二进制数据。 使用现有解决方案的另一种方法是实现客户端可以连接的WebService,这将是基于REST的Web服务的JAX-RS,例如:这种方法也更具独立性,在撰写本文时我不知道支持JMS的Android客户端库,而且大多数其他编程语言都完全支持基于REST的服务。但是,当您不想使用任何现有协议时,您必须坚持使用自己的服务器和客户端实现。所以这就是提到的套接字 - 编程。好吧,这个任务并不容易:你的服务器不会同时处理多个客户端,在另一个请求完成之前不会阻塞一个请求,提供一些机制来授权客户端对服务器进行应用程序访问。当您同时处理多个客户端时,您将拥有在服务器上的客户端之间共享的资源,因此必须同步对此资源的访问,这些主题与并发编程相关,并且是其自身信息技术的一个安静有趣的领域。应用程序设计的其他有趣方面可能是使用支持JNDI进行资源绑定或实现CDI容器的决策,以便客户端可以轻松地调整您的消息交换格式。这很有趣,但不是一天内的任务。 ;)