我更喜欢 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 窃取字节。