2014-01-07 66 views
0

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

具体来说,我想要一台运行时间一直很长的服务器,以及一台可以连接到服务器并按需与服务器通信的客户端。

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

+2

欢迎来到StackOverflow http://stackoverflow.com/questions/how-to-ask – gtgaxiola

+1

我投了这个问题,这里是为什么:这实际上是一个非常明确和谨慎的问题。他要求一个非常简单的事情,“我如何通过网络发送消息”可能有很多方法可以做到这一点,但这很好,只要以单一方式回答就可以解决问题。 –

+0

服务器应该是多线程的,不一定要但可能更容易,并且应该始终监听新的连接。当它收到一个新的连接时,将它放到一个新的线程中,去做它的业务,然后再听另一个连接。在那里寻找教程,你会发现它。通过练习和尝试新技术,你会发现哪些是有效的,哪些没有。我上面列出的选项仅仅是解决您的项目的众多解决方案之一。祝你好运:) –

回答

2

本教程Reading from and Writing to a Socket开始,你可以用它采用了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(); 
} 

然后你可以使用“远程登录本地主机4444”,以测试它,或者写一个完整的客户端简单echo server启动;也许就像上面教程中的客户端一样。

+0

现在我该如何让客户接洽? XD – user3170707

+0

@ user3170707 [Here](http://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoClient.java)。 –

2

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