基于Socket类以及ServerSocket类的实例讲解
socket类
套接字是网络连接的端点,套接字使应用可以从网络中读取数据,可以向网络中写入数据。不同计算机上的两个应用程序可以通过连接发送或接收字节流,以此达到相互通信的目的。
为了从一个应用程序向另一个应用程序发送消息,需要知道另一个应用程序中套接字的 ip 地址和端口号,在java中,套接字由java.net.socket 表示。
要创建一个套接字,可以使用socket类中众多构造函数中的一个。其中一个构造函数接收两个参数:主机号和端口号。
public socket (string host, int port)
其中参数host是远程主机的名称或ip地址,参数port是连接远程应用程序的端口号,例如,想要通过80端口连接yahoo.com,可以使用如下语句创建socket对象
new socket ("yahoo.com", 80);
一旦成功创建了socket类的实例,就可以使用该实例发送或接收字节流,要发送字节流,需要调用socket类的getoutputstream() 方法获取一个java.io.outputstream对象,
要发送文本到远程应用程序,通常需要使用返回的outputstream对象创建一个java.io.printwriter对象。若想要从连接的另一端接收字节流,需要调用socket类的getinputstream()
方法,该方法会返回一个java.io.inputstream对象。
下面的代码创建了一个套接字,用于与本地http服务器进行通信,发送http请求,接收服务器的相应信息,以下代码创建了一个stringbuffer对象来保存信息,并输出。
socket socket = new socket("127.0.0.1", "8080"); outputstream os = socket.getoutputstream(); boolean autoflush = true; printwriter out = new printwriter( socket.getoutputstream(), autoflush); bufferedreader in = new bufferedreader( new inputstreamreader(socket.getinputstream())); //send an http request to the web server out.println("get /index.jsp http/1.1"); out.println("host: localhost:8080"); out.println("connection close"); out.println(); //read the response boolean loop = true; stringbuffer sb = new stringbuffer(8096); while (loop) { if (in.ready()) { int i = 0; while (i != -1){ i = in.read(); sb.append((char) i); } loop = flase; } thread.currentthread().sleep(50); } system.out.println(sb.tostring()); socket.close();
serversocket类
socket类表示一个客户端套接字,即,当想要连接远程服务器应用程序时创建的套接字。但如果你想要实现一个服务器应用程序(例如一个http服务器或ftp服务器),
你需要另一种方法,因为服务器必须时刻待命,它并不知道客户端应用程序会在什么时候发起连接,正因为如此,需要使用java.net.serversocket类。这是服务器套接字的实现。
serversocket类和socket类并不相同,服务器套接字要等待来自客户端的连接请求,当服务器套接字收到了连接请求后,它会创建一个socket实例来处理与客户端的通信。
要创建一个服务器套接字,可以使用serversocket类提供的4个构造函数中的任意一个,需要指明ip地址和服务器套接字侦听的端口号,典型情况下,ip地址可以为127.0.0.1,
即服务器套接字会侦听本地机器接收到的连接请求,服务器套接字侦听的ip地址称为绑定地址。服务器套接字的另一个重要属性是backlog,后者表示在服务器拒绝接收传入的
请求之前,传入的连接请求的最大队列长度。
serversocket类的其中一个构造函数的签名如下:
public serversocket (int port, int backlog, inetaddress bindingaddress);
值得注意的是,在这个构造函数中,参数绑定地址必须是java.net.inetaddress类的实例。创建inetaddress对象的一种简单方法是调用其静态方法getbyname(),
传入包含主机名的字符串,代码如下所示:
inetaddress.getbyname("127.0.0.1");
下面的一行代码创建了一个serversocket对象,serversocket对象侦听本地主机的8080端口,其backlog值为1;
new serversocket(8080, 1, inetaddress.getbyname("127.0.01"));
创建了serversocket实例后,可以使其等待传入的连接请求,该连接请求会通过服务器套接字侦听的端口上绑定地址传入,这些工作可以通过调通serversocket类的accept方法
完成。只有当接收到连接请求后,该方法才会返回,其返回值是一个socket实例,然后,就可以如上所述使用该socket对象与客户端应用程序进行字节流的发送/接收。
以上这篇基于socket类以及serversocket类的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: shiro之INI配置详解