当前位置:  开发笔记 > 编程语言 > 正文

客户端 - 服务器网络入门

如何解决《客户端-服务器网络入门》经验,为你挑选了3个好方法。

我是一名优秀的程序员,但我没有网络经验.

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

我非常清楚可能有用的语言:Java,C++,C.

我该如何开始?我想预先学习最佳实践,所以你可以推荐的好学习资源(例如书籍,在线资料等)会很棒.

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

编辑2:我已经提出了50个代表的赏金.到目前为止已经提出了一些很好的答案 - 我正在寻找更详细的答案,所以希望这会鼓励这样做.例如,具有这种比较不同学习方法的经验的人的答案将非常有帮助.谢谢!我也可以得到一些关于整个虚拟机的反馈吗?



1> Martijn Cour..:

我更喜欢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"是你可能正在寻找的词.
要将客户端连接到服务器,您必须编写以下内容:

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中窃取字节.



2> brumScouse..:

Beej的网络编程指南绝对响亮.在大学使用它.

http://beej.us/guide/bgnet/

它涵盖了套接字API,我记得它使用C++代码示例.

此外,Tannenbaum的计算机网络也是一本很好的读物.



3> Sekhar..:

    了解有关网络的基本概念.层,IP地址,端口,数据包[特别是UDP/TCP]

    学习关于[1]的编程抽象,比如套接字.

    自己实现"服务器"和"客户端".

    测试一下.

    在您的计算机上安装Wireshark,并查找为每种类型的活动发送的IP地址,数据包类型,端口号等.

    通过使用Java/.Net/C++的Networking API构建知识.从头开始构建所有东西可能是一个非常糟糕的主意.

Java:http://download.oracle.com/javase/tutorial/networking/index.html

.Net:http://msdn.microsoft.com/en-us/library/4as0wz7t.aspx

C++:Richard Stevens的Unix网络编程

希望能帮助到你.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有