成都创新互联网站制作重庆分公司

JavaSocket官方文档学习(二)-创新互联

Java Socket官方文档学习(二)

如何写一个客户端和服务器对

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的三江侗网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

这片文章的内容基本来自Java Socket官方文档的最后一个部分,如何写一个客户端和服务器对:https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

The example consists of two independently running Java programs: the client program and the server program. The client program is implemented by a single class, KnockKnockClient, and is very similar to the EchoClient example from the previous section. The server program is implemented by two classes: KnockKnockServer and KnockKnockProtocol. KnockKnockServer, which is similar to EchoServer, contains the main method for the server program and performs the work of listening to the port, establishing connections, and reading from and writing to the socket. The class KnockKnockProtocol serves up the jokes. It keeps track of the current joke, the current state (sent knock knock, sent clue, and so on), and returns the various text pieces of the joke depending on the current state. This object implements the protocol—the language that the client and server have agreed to use to communicate.

文档中说这个例子中包含两个独立运行的Java程序,其中一个是服务端另一个是客户端程序。客户端程序实现了KnockKnockClient类,文档说它和先前的Echo Client比较像,可以看《Java Socket官方文档学习(一)》。服务端继承了两个类 KnockKnockServer and KnockKnockProtocol。这个东西和先前的Echo Server比较相似。文档说服务端程序包含程序入口,建立链接,向Socket读写和监听的功能。 KnockKnockProtocol这个类提供笑话,它追踪当前的笑话和当前的状态,根据笑话的当前笑话返回笑话的文档。

服务端部分

KnockKnockServer的源码:https://docs.oracle.com/javase/tutorial/networking/sockets/examples/KnockKnockServer.java

这个Server开始创建了一个SocketServer实例来监听某一个特定的端口,在这个案例中,Socket Server的端口是4444

int portNumber = Integer.parseInt(args[0]);

try ( 
    ServerSocket serverSocket = new ServerSocket(portNumber);
    Socket clientSocket = serverSocket.accept();
    PrintWriter out =
        new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream()));
) {

ServerSocket is a java.net class that provides a system-independent implementation of the server side of a client/server socket connection. The constructor for ServerSocket throws an exception if it can’t listen on the specified port (for example, the port is already being used). In this case, the KnockKnockServer has no choice but to exit.

文档说ServerSocket是Java.net包中的一个类,它提供了一个独立于系统的服务端Socket链接的实现。当这个实例不能监听某一特定端口时(比如端口被占用了),它的构造方法会抛出一个异常。在这种情况下,服务器别无选择只能终止运行。

如果服务器成功绑定到了它的目标端口,ServerSocket对象就会被创建,随后服务会执行下一步————接收客户端的链接。

具体实现是这个代码:clientSocket = serverSocket.accept();

ServerSocket类中的accept()方法会等待直到客户端发起在特定端口链接主机的请求。当建立链接的请求被成功接收时,accpet()方法会返回一个已经绑定到该端口的Socket对象。通过这个Socket对象,服务端和客户端可以进行通讯,原ServerSocket用于监听客户端的链接请求。但是在该案例中,并不实现这个功能。引文:https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html#later

中介绍了这个功能如何实现。

当客户端和服务器成功建立起链接之后,通讯部分代码块如下:

try (
    // ...
    PrintWriter out =
        new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream()));
) {
    String inputLine, outputLine;
            
    // Initiate conversation with client
    KnockKnockProtocol kkp = new KnockKnockProtocol();
    outputLine = kkp.processInput(null);
    out.println(outputLine);

    while ((inputLine = in.readLine()) != null) {
        outputLine = kkp.processInput(inputLine);
        out.println(outputLine);
        if (outputLine.equals("Bye."))
            break;
    }

以上代码块实现了如下三个功能:
1.获得Socket的输入和输出流,并且在这些流上建立reader和writer。
2.通过客户端向Socket写入初始化通讯。
3.通过向Socket读写和客户端进行通讯。(注意这个While循环)

客户端部分

当启动客户端时,服务端的程序应该已经开始运行并监听指定端口,等待一个客户端发起链接。所以客户端程序要做的第一件事就是创建一个用于链接到特定host、特定
端口的Socket。

String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);

try (
    Socket kkSocket = new Socket(hostName, portNumber);
    PrintWriter out = new PrintWriter(kkSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(kkSocket.getInputStream()));
)

《Java Socket官方文档学习(一)》有解读过类似的代码块。

接下来程序通过While循环体来实现和服务端的通信,客户端通过监听Socket的输入流来监听服务端发回的数据。如果服务端发送Bye,则终端链接。

while ((fromServer = in.readLine()) != null) {
    System.out.println("Server: " + fromServer);
    if (fromServer.equals("Bye."))
        break;

    fromUser = stdIn.readLine();
    if (fromUser != null) {
        System.out.println("Client: " + fromUser);
        out.println(fromUser);
    }
}

这两个案例程序都是可以在本地跑的,Java Socket官方文档这个做的比较有意思,文章结尾最后附上客户端和服务端源码的链接。

客户端:https://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoClient.java
服务端:https://docs.oracle.com/javase/tutorial/networking/sockets/examples/KnockKnockServer.java

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站标题:JavaSocket官方文档学习(二)-创新互联
网站网址:http://cxhlcq.com/article/csjgdi.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部