我是一名优秀的程序员,但我没有网络经验.
基本上,我想进入客户端 - 服务器网络.例如,我想尝试获取服务器进程,允许客户端通过Internet连接并将ping发送到所有其他连接的客户端.那么也许我会尝试开发一个简单的聊天客户端,或者一些简单的多人游戏,我会从那里开始.
我非常清楚可能有用的语言:Java,C++,C.
我该如何开始?我想预先学习最佳实践,所以你可以推荐的好学习资源(例如书籍,在线资料等)会很棒.
编辑:我是否还应该研究某种虚拟机来模拟彼此交互的各种机器?
编辑2:我已经提出了50个代表的赏金.到目前为止已经提出了一些很好的答案 - 我正在寻找更详细的答案,所以希望这会鼓励这样做.例如,具有这种比较不同学习方法的经验的人的答案将非常有帮助.谢谢!我也可以得到一些关于整个虚拟机的反馈吗?
我更喜欢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中窃取字节.
Beej的网络编程指南绝对响亮.在大学使用它.
http://beej.us/guide/bgnet/
它涵盖了套接字API,我记得它使用C++代码示例.
此外,Tannenbaum的计算机网络也是一本很好的读物.
了解有关网络的基本概念.层,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网络编程
希望能帮助到你.