当前位置: 首页 > 面试题库 >

客户端-服务器网络入门

连厉刚
2023-03-14
问题内容

我是一个优秀的程序员,但是我的网络经验为零。

基本上,我想进入客户端-
服务器网络。例如,我想尝试运行一个服务器进程,该进程允许客户端通过Internet连接并将ping发送到所有其他连接的客户端。然后,也许我将尝试开发一个简单的聊天客户端,或一些简单的多人游戏,然后从那里开始。

我非常了解可能有用的语言:Java,C ++,C。

我该如何开始?我想提前学习最佳实践,因此您可以推荐的良好学习资源(例如书籍,在线资料等)将非常有用。

编辑:我是否也应该研究某种虚拟机来模拟相互交互的各种机器?

编辑2:我提出了50 rep赏金。到目前为止,已经提出了一些很好的答案-
尽管我正在寻找更详细的答案,所以希望这会鼓励这样做。例如,具有此类经验的某人的答案比较不同的学习方法将非常有帮助。谢谢!我还能获得有关整个VM的一些反馈吗?


问题答案:

我更喜欢Java。我将解释TCP:
基本概念是必须在计算机上运行“服务器”。该服务器接受等待连接的客户端。每个连接都通过一个端口(您希望,我希望…)。
始终使用高于1024的端口,因为大多数时间低于1025的端口是标准协议(例如HTTP(80),FTP(21),Telnet等)保留的时间。

但是,用Java创建服务器是通过以下方式完成的:

ServerSocket server = new ServerSocket(8888); // 8888 is the port the server will listen on.

如果您想进行研究,则可能会使用“套接字”这个词。
要将客户端连接到服务器,您必须编写以下代码:

Socket connectionToTheServer = new Socket("localhost", 8888); // First param: server-address, Second: the port

但是现在,仍然没有连接。服务器必须接受等待中的客户端(如我在上文中注意到的):

Socket connectionToTheClient = server.accept();

做完了!您的连接已建立!通讯就像File-IO。您唯一需要记住的是,您必须决定何时刷新缓冲区并真正通过套接字发送数据。
使用PrintStream进行文本编写非常方便:

OutputStream out = yourSocketHere.getOutputStream();
PrintStream ps = new PrintStream(out, true); // Second param: auto-flush on write = true
ps.println("Hello, Other side of the connection!");
// Now, you don't have to flush it, because of the auto-flush flag we turned on.

一个用于文本阅读的BufferedReader是一个很好的选择(最好*):

InputStream in = yourSocketHere.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = br.readLine();
System.out.println(line); // Prints "Hello, Other side of the connection!", in this example (if this would be the other side of the connection.

希望您可以从此信息开始联网!
PS:当然,必须为IOExceptions捕获所有网络代码

编辑:
我忘了写为什么它并不总是最好的选择。BufferedReader使用缓冲区,并尽可能多地读取缓冲区。但是有时您不希望BufferedReader窃取换行符之后的字节并将其放入自己的缓冲区中。
简短示例:

InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
// The other side says hello:
String text = br.readLine();
// For whatever reason, you want to read one single byte from the stream,
// That single byte, just after the newline:
byte b = (byte) in.read();

但是BufferedReader在他的缓冲区中已经有您要读取的字节。因此,调用in.read()将返回读取器缓冲区中最后一个字节之后的字节。

因此,在这种情况下,最好的解决方案是使用DataInputStream和管理它自己的方式,以了解字符串将有多长,并仅读取该数量的字节并将其转换为字符串。或者:您使用

DataInputStream。 ~~readLine()~~

此方法不使用缓冲区,而是逐字节读取并检查换行符。因此,此方法不会从基础InputStream窃取字节。



 类似资料:
  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我实现了一个相当简单的服务器,可以处理多个客户端,我首先接受这样的客户端 从我所读到的内容来看,似乎通常会为每个客户端创建一个新线程,但如果有更简单的方法,我真的不认为有必要解决这个问题。我只需要能够在服务器和客户端之间发送和接收消息。 有没有简单的方法 监听传入消息 确定消息来自哪个客户端 解析消息等。 都在一个循环中,而不为每个客户端创建单独的线程?

  • 本文向大家介绍客户端服务器与对等网络之间的区别,包括了客户端服务器与对等网络之间的区别的使用技巧和注意事项,需要的朋友参考一下 客户端-服务器网络和对等网络都是电信网络,在该电信网络中,信息从源到目的地的传输使传输损失最小。在两种类型的网络中,都有专用的路径用于信息传输,但是,此路径专用于客户端-服务器网络,而不适用于对等网络。 以下是客户端服务器与对等网络之间的重要区别。 序号 键 客户端-服务

  • 前面的章节介绍了所有 Redis 的重要功能组件: 数据结构、数据类型、事务、Lua 环境、事件处理、数据库、持久化, 等等, 但是我们还没有对 Redis 服务器本身做任何介绍。 不过, 服务器本身并没有多少需要介绍的新东西, 因为服务器除了维持服务器状态之外, 最重要的就是将前面介绍过的各个功能模块组合起来, 而这些功能模块在前面的章节里已经介绍过了, 所以本章将焦点放在服务器的初始化过程,

  • 主要内容:一、网络的整体架构,二、服务端的流程,三、源码分析,四、总结一、网络的整体架构 在前面介绍Redis的整体流程时,初步介绍过服务端的网络代码,现在先看一下整体的架构: 1、服务处理(EPoll) 如果没有接触过网张编程的,特别是对LINUX上的编程模型一点都不清楚的。这块可能是个麻烦.Redis为了保证在不两同的平台的高效可行的运行,采用了在不同平台自适应使用不同的网络编程模型,这其中包括一些可能比较专用的平台,如Solaries10中的 evport,m

  • 本文向大家介绍Python socket网络编程TCP/IP服务器与客户端通信,包括了Python socket网络编程TCP/IP服务器与客户端通信的使用技巧和注意事项,需要的朋友参考一下 Python socket网络编程 初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入