目录
本文是在Java Networking: Socket翻译而来。欢迎大家联系我,跟我一起交流。本人水平有限,如果错误欢迎指正。
在java里,为了在网络间连接服务器(通过TCP/IP),你需要创建一个java.net.Socket,让socket连接到服务器。如果你喜欢用Java NIO,你也可以选择使用Java NIO Socket Chanel。
###创建Socket
例子中的代码连接IP地址78.46.84.171服务器上的80端口。这个服务器在我们的web服务器上(www.jenkov,com),端口80是web服务器的端口。
Socket socket = new Socket("78.46.84.171", 80);
你也可以使用域名来代替ip地址,像这样:
Socket socket = new Socket("jenkov.com", 80);
###向Socket写入数据:
你必须获取到socket的输出流才可以向它写入数据。像这样做:
Socket socket = new Socket("jenkov.com", 80);
OutputStream out = socket.getOutputStream();
out.write("some data".getBytes());
out.flush();
out.close();
socket.close();
就是这么简单!
当你真的、真的想让数据通过网络发送到服务器,别忘了调用flush()方法。操作系统中低层的TCP/IP实现会缓存数据,同时为了适应TCP/IP数据包的大小,数据将会以比较大的缓存块发送。
###从Socket中读取数据
从Socket中读取数据,你需要先获得它的输入流。下面是读取的方法:
Socket socket = new Socket("jenkov.com", 80);
InputStream in = socket.getInputStream();
Int data = in.read;
//… read more data…
in.close;
socket.close;
很简单,对吧?
记住,你不能像读取文件一样,从Socket的输入流中读取数据直到它返回-1。原因是只有当服务器关闭连接时才会返回-1。但是服务器不会总关闭连接。你可能想在同一个连接中发送多个请求。这种情况下关闭连接是不是太蠢了。
另外你必须知道从Socket的输入流中读取了多少字节数。这可以让服务器告诉你发送了多少字节数,活着通过寻找数据末尾特殊字符来完成。
###关闭Socket:
当你使用完Socket,你必须关闭它和服务器之间的连接。调用Socket.close()方法可以实现,如下:
Socket socket = new Socket("jenkov.com", 80);
socket.close();