当你想要在 Java 中使用 TCP/IP 通过 Internet 连接到服务器时,就需要创建一个 java.net.Socket 对象并将其连接到服务器。另外,如果你更喜欢使用 Java NIO,则可以使用 Java NIO SocketChannel

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

创建 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

------完------

推荐阅读:

Java IO 简明教程

Java NIO 简明教程

更多学习讨论欢迎进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资料:
https://www.cnblogs.com/czwbig/p/10018118.html
http://ifeve.com/java-io-network/