Java网络编程基础教程之Socket入门实例
程序员文章站
2024-02-28 21:10:10
当我们想要在java中使用tcp/ip通过网络连接到服务器时,就需要创建java.net.socket对象并连接到服务器。假如希望使用java nio,也可以创建java...
当我们想要在java中使用tcp/ip通过网络连接到服务器时,就需要创建java.net.socket对象并连接到服务器。假如希望使用java nio,也可以创建java nio中的socketchannel对象。
创建socket
下面的示例代码是连接到ip地址为78.64.84.171服务器上的80端口,这台服务器就是我们的web服务器(),而80端口就是web服务端口。
复制代码 代码如下:
socket socket = new socket("78.46.84.171", 80);
我们也可以像如下示例中使用域名代替ip地址:
复制代码 代码如下:
socket socket = new socket("jb51.net", 80);
socket发送数据
要通过socket发送数据,我们需要获取socket的输出流(outputstream),示例代码如下:
复制代码 代码如下:
socket socket = new socket("jb51.net", 80);
outputstream out = socket.getoutputstream();
out.write("some data".getbytes());
out.flush();
out.close();
socket.close();
代码非常简单,但是想要通过网络将数据发送到服务器端,一定不要忘记调用flush()方法。操作系统底层的tcp/ip实现会先将数据放入一个更大的数据缓存块中,而缓存块的大小是与tcp/ip的数据包大小相适应的。(译者注:调用flush()方法只是将数据写入操作系统缓存中,并不保证数据会立即发送)
socket读取数据
从socket中读取数据,我们就需要获取socket的输入流(inputstream),代码如下:
复制代码 代码如下:
socket socket = new socket("jb51.net", 80);
inputstream in = socket.getinputstream();
int data = in.read();
//... read more data...
in.close();
socket.close();
代码也并不复杂,但需要注意的是,从socket的输入流中读取数据并不能读取文件那样,一直调用read()方法直到返回-1为止,因为对socket而言,只有当服务端关闭连接时,socket的输入流才会返回-1,而是事实上服务器并不会不停地关闭连接。假设我们想要通过一个连接发送多个请求,那么在这种情况下关闭连接就显得非常愚蠢。
因此,从socket的输入流中读取数据时我们必须要知道需要读取的字节数,这可以通过让服务器在数据中告知发送了多少字节来实现,也可以采用在数据末尾设置特殊字符标记的方式连实现。
关闭socket
当使用完socket后我们必须将socket关闭,断开与服务器之间的连接。关闭socket只需要调用socket.close()方法即可,代码如下:
复制代码 代码如下:
socket socket = new socket("jb51.net", 80);
socket.close();
(全文完)