当你想要在 Java 中使用 TCP/IP 通过 Internet 连接到服务器时,就需要创建一个 java.net.Socket 对象并将其连接到服务器。另外,如果你更喜欢使用 Java NIO,则可以使用 Java NIO SocketChannel 。
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
创建 Socket(Creating a Socket)
下面的示例是连接到 IP 地址为 115.28.161.199 的服务器上的 80 端口,这台服务器就是我们的 Web 服务器(www.qirishuzhai.com),80 端口就是 Web 服务器的服务端口。
Socket socket = new Socket("115.28.161.199", 80);
你也可以使用域名代替 IP 地址,像如下示例:
Socket socket = new Socket("qirishuzhai.com", 80);
写入 Socket(Writing to a Socket)
要向 Java Socket 写入数据,必须要获取 Socket 的 OutputStream,示例如下:
Socket socket = new Socket("qirishuzhai.com", 80);
OutputStream out = socket.getOutputStream();
out.write("some data".getBytes());
out.flush();
out.close();
socket.close();
就是如此简单!!
但是当你想要通过网络将数据通过 Internet 发送到服务器端时,一定不要忘记调用 flush() 方法。操作系统中的 TCP/IP 实现会先将数据放入一个更大的数据缓存块中,而缓存块的大小是与 TCP/IP 的数据包大小相适应的。(编者注:调用 flush() 方法只是通知系统发送,但系统并不保证数据会立即发送出去。)
从 Socket 中读取数据(Reading from a Socket)
要从 Socket 中读取数据,你需要获取 Socket 的 InputStream,示例如下:
Socket socket = new Socket("qirishuzhai.com", 80);
InputStream in = socket.getInputStream();
int data = in.read();
//... read more data...
in.close();
socket.close();
实现如此的简单,对吧!?
但也请记住,从套接字的输入流(Socket's InputStream)中读取数据并不能像读取文件那样,一直调用 read() 方法直到返回 -1 为止,因为对 Socket 而言,只有当服务端关闭连接时套接字的输入流(Socket's InputStream)才会返回 -1,然而现实中服务器并不会不停地关闭连接。比如我们想要通过一个连接发送多个请求,那么在这种情况下关闭连接就显得非常愚蠢。
相反,你必须要知道的是从套接字的输入流(Socket's InputStream)中读取多少的字节数。这可以通过让服务器在数据中告知发送了多少字节来实现,或者也可以在数据末尾设置特殊字符标记的方式来实现。
关闭 Socket(Closing a Socket)
使用完 Socket 后必须将其关闭以断开与服务器之间的连接。关闭 Socket 只需要调用 Socket.close() 方法,代码如下:
Socket socket = new Socket("qirishuzhai.com", 80);
socket.close();
英文原文链接:http://tutorials.jenkov.com/java-networking/sockets.html
------完------
推荐阅读:
参考资料:
https://www.cnblogs.com/czwbig/p/10018118.html
http://ifeve.com/java-io-network/