更新时间:2022-04-01 11:05:26 来源:极悦 浏览4687次
Java 有大量有用的网络库供您使用。在本文中,我将向您展示如何制作一个可以在您的计算机上运行的简单 Java 服务器。我们的服务器会做一些事情。我们连接的那一刻,它会打印字符串“Hello!”,它还应该让我们选择通过输入“Peace”来终止连接。本教程的目标是向您展示一些有用的 Java 库来实现这一点!在创建服务器时,实际上需要考虑 4 个主要步骤。
在实现服务器的核心细节之前,我们需要找到一种方法来确定我们将如何连接到服务器。这很重要,因为它引入了三个核心网络概念;ip-address,端口和套接字。不要害怕这些术语,我会尽力在下面解释它们。
IP 地址——在最简单的形式中,IP 地址只是表示网络中特定计算机地址的一种奇特方式。这由一个特定的数字表示,例如 192.168.11.11。这是一个唯一的 ID,互联网上的所有其他机器都可以通过它来识别您的计算机。在我们的例子中,我们将在我们的机器上运行我们的服务器,这意味着连接不必通过互联网再回到我们的机器,相反,操作系统足够智能,可以在我们的机器内路由请求,而无需与网络交互。对于这种情况,有一个专门用于此的特殊 IP 地址;127.0.0.1 或有时称为 localhost。如果您在 Linux 终端中键入ip address,您将看到计算机上的网络设备列表。第一个是环回设备,此设备允许您计算机中的任何服务与您机器中的其他服务进行通信,您的操作系统将使用环回地址 127.0.0.1 在您的机器内路由它,而不是通过网络发送它。
端口- 一旦我们有了相关计算机的地址,我们就需要能够连接到该计算机上我们想要的服务。这就是端口的用武之地。端口就像在提供某些服务的计算机上运行的进程,所以一旦您确定了正确的计算机(使用 IP 地址),我们必须选择端口才能连接到该计算机中的正确服务。
套接字- 到目前为止,我们可以使用 ip 地址在网络/互联网中定位计算机。我们可以使用端口识别我们想要连接到的计算机中的哪个服务,但是我们仍然需要在一台计算机和我们的目标计算机之间建立连接。这就是套接字的用武之地。套接字可以在网络中的两台计算机之间实现完全的双向通信。如您所料,套接字需要目标计算机的地址和端口才能创建连接
现在我们已经掌握了网络的基础知识,让我们来创建服务器吧!让我们从创建连接开始。记住连接是使用套接字创建的。
EC-1:创建连接
公共静态无效 连接服务器() {
尝试(服务器套接字服务器套接字= new ServerSocket(9991)) {
套接字连接套接字=服务器套接字。接受();
在 EC-1 中,我们创建了一个方法connectToServer,在这个方法中,我们有一个不完整的尝试语句,它执行以下操作:
(1)创建一个ServerSocket
(2)指定此服务将在其上运行的端口 9991
(3)接受 ServerSocket 连接!
和沙赞!我们已经建立了我们的联系,并且至少建立了联系的基础。我们还没有连接到任何东西。在 Java 中,aServerSocket只是等待连接,一旦连接,接收一些任意输入,处理该输入,然后返回响应!在我们的例子中,我们的服务器只会回显您选择输入的任何内容!根据 的定义ServerSocket,它需要等待连接,在EC-1中,最后一行接受该连接,我们将其保存在一个名为connectionSocketthat 的变量中,该变量的类型为Socket。
太棒了,所以我们已经完成了连接框架的铺设。让我们的服务器交互,允许它在我们连接时进行通信!
为了与我们的服务器来回交互,我们需要一种方法来使用我们刚刚在 EC-1 中设置的连接来来回传输信息。一种很好的方法是使用IOStreams,在我们的例子中是 JavaInputStream和OutputStream类。这些将允许进出服务器的双向通信。让我们在EC-1中实现它
EC-2:实现 IOStream
...
InputStream inputToServer = connectionSocket .getInputStream();
OutputStream outputFromServer = connectionSocket .getOutputStream();
在EC-2中,我们创建了InputStream一个从上面创建的输入connectionSocket,我们还创建OutputStream一个从connectionSocket. 输入流代表我们将发送到服务器的内容,所以它是inputToServer,而输出代表服务器的输出。
EC-3:将 IOStreams 转化为实际可用数据
...
Scanner scanner = new Scanner( inputToServer , "UTF-8");
PrintWriter serverPrintOut = new PrintWriter(new OutputStreamWriter( outputFromServer , "UTF-8"), true);
serverPrintOut .println("你好!输入和平退出。");
在EC-3中,我们采用IOStreams在EC-2中创建的并使用它们。我们首先创建一个Scanner,扫描器将接收服务器的输入并将其转换为服务器可以读取的形式。然后我们创建一个PrintWriter,PrintWriter它将从服务器获取输出并将其打印在我们的屏幕上。创建Scanner和PrintWriter是必不可少的,因为EC-2IOStreams中的单独仅表示传输中的数据,它们不会打印或将数据转换为服务器和用户理解的格式。为了让我们看到我们已经连接到服务器,服务器应该通过打印 Hello! 来通知我们。连接时给我们。
回顾一下,我们现在可以连接到我们的服务器(EC-1) ,通过IOStreams (EC-2)从服务器发送和接收信息,并且可以将流转换为服务器和用户的相关输出(EC-3)。
服务器可以做很多事情,但它仍然不能做一些基本的事情,比如向我们实际打印数据,甚至在客户端请求时终止连接。我们将在这里实现逻辑。
EC-4: 服务器逻辑
boolean done = false;
while(! done &&扫描仪.hasNextLine()) {
字符串行=扫描仪.nextLine();
serverPrintOut .println("<您的姓名>服务器回显:" + line );
if( line .toLowerCase().trim().equals("peace")) {
done = true;
}
}
在EC-4中,我们需要一种方法来检查客户端是否完成了连接。我们首先创建一个boolean名为的标志done并将其设置为false. 然后我们创建一个 while 循环,它热切地观察done值是否变为 true,它还会检查EC-3Scanner中创建的是否仍然正常运行并且可以接受输入。
我们服务器的作用是打印回我们输入的任何内容,Scanner该类检查用户是否发送了新行,我们使用该输入作为服务器的输出,前缀为“Echo from <Your Name Here> Server: ”.
最后,我们需要找到一种方法来根据客户端请求实际终止连接。因此,如果客户端键入单词“peace”,代码会将 done 标志更改为 true,while 循环条件将不再满足,它将终止循环和应用程序。
所以我们现在已经制作了简单的 Hello 服务器,这是一个包含所有代码在一个方法中的要点!
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* Written by Martin Ombura Jr. <@martinomburajr>
*/
public class MyServer {
public static void main(String[] args) {
connectToServer();
}
public static void connectToServer() {
//Try connect to the server on an unused port eg 9991. A successful connection will return a socket
try(ServerSocket serverSocket = new ServerSocket(9991)) {
Socket connectionSocket = serverSocket.accept();
//Create Input&Outputstreams for the connection
InputStream inputToServer = connectionSocket.getInputStream();
OutputStream outputFromServer = connectionSocket.getOutputStream();
Scanner scanner = new Scanner(inputToServer, "UTF-8");
PrintWriter serverPrintOut = new PrintWriter(new OutputStreamWriter(outputFromServer, "UTF-8"), true);
serverPrintOut.println("Hello World! Enter Peace to exit.");
//Have the server take input from the client and echo it back
//This should be placed in a loop that listens for a terminator text e.g. bye
boolean done = false;
while(!done && scanner.hasNextLine()) {
String line = scanner.nextLine();
serverPrintOut.println("Echo from <Your Name Here> Server: " + line);
if(line.toLowerCase().trim().equals("peace")) {
done = true;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
是时候投入我们所有的工作并运行这段代码了。
(1)如何连接
1)从您的 Java IDE 或命令行运行此 Java 应用程序服务器代码。
2)为了让您连接到服务器,您需要一个可以让您执行此操作的工具。在 Linux 和 Mac 上,随意使用netcat或telnet任何其他您想要的连接协议,如果您没有它们,请在谷歌搜索如何在您的操作系统版本上安装它们。对于 Windows,有几个工具以及winrs. 命令如下
NetCat:这是一种流行的网络实用程序,用于连接到网站、服务器等。
数控 127.0.0.1 9991
Telnet: Telnet 是一种旧的双向互联网连接协议。它非常简单,将通过未加密的连接发送数据。这意味着您在传递敏感信息时应避免使用它。但是对于这个简单的例子,它是有效的。
远程登录 127.0.0.1 9991
Curl: Curl 与上面的两个有点不同,因为它将以网页格式连接到服务器。这样做的缺点是,一旦连接,可能不容易将文本直接发送到 curl,因此您无法通过键入“再见”来终止连接。
telnet 127.0.0.1 9991
(2)一旦连接
一旦连接!你应该有一些看起来像这样的东西。
随意玩耍并输入内容,
输入“peace”关闭连接
当你玩它的时候,尝试重新启动连接,添加更多连接等。你会注意到这些重要的点:
(1)这个服务器只能处理一个连接,所以到它的多个连接将被取消。在以后的文章中,我们将让这个服务器并发,允许它处理多个连接。
(2)如果客户端,即你,终止连接,套接字关闭,连接中断,程序结束,这意味着你不能在不重新启动应用程序的情况下再次连接到服务器。
本文的目的是玩转 Java 使用的一些很酷的网络特性!如您所见,可能性是无穷无尽的。我们可以以一种可能基于我们提供的输入数据执行数学计算的方式对我们的服务器进行编码,或者我们的服务器可以是数据库之间的中介,它会执行诸如检索、验证、操作或清理数据库信息之类的操作输入。机会无穷无尽!
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习