serversocket
类的一个对象表示java中的tcp服务器套接字。
serversocket
对象可以接受来自远程客户端的连接请求。
我们可以使用no-args构造函数创建一个未绑定的服务器套接字,并使用其bind()方法将其绑定到本地端口和本地ip地址。
以下代码显示如何创建服务器套接字:
import java.net.inetsocketaddress; import java.net.serversocket; public class main { public static void main(string[] argv) throws exception { // create an unbound server socket serversocket serversocket = new serversocket(); // create a socket address object inetsocketaddress endpoint = new inetsocketaddress("localhost", 12900); // set the wait queue size to 100 int waitqueuesize = 100; // bind the server socket to localhost and at port 12900 with // a wait queue size of 100 serversocket.bind(endpoint, waitqueuesize); } }
您可以通过使用以下任何构造函数在一个步骤中组合create,bind和listen操作。
等待队列大小的默认值为50。
本地ip地址的缺省值是通配符地址,即服务器计算机的所有ip地址。
serversocket(int port) serversocket(int port, int waitqueuesize) serversocket(int port, int waitqueuesize, inetaddress bindaddr)
您可以将套接字创建和绑定步骤合并为一个语句。
以下代码显示如何在端口12900创建服务器套接字,其中100作为等待队列大小,并在localhost回送地址。
serversocket serversocket = new serversocket(12900, 100, inetaddress.getbyname("localhost"));
要接受远程连接请求,请调用服务器套接字上的 accept()
方法。
accept()方法调用阻塞执行,直到来自远程客户端的请求到达其等待队列。
the following code calls on serversocket will wait for a new remote connection request.
socket activesocket = serversocket.accept();
socket类包含两个方法 getinputstream()
和 getoutputstream()
用于读取和写入连接的套接字。
bufferedreader br = new bufferedreader(new inputstreamreader(activesocket.getinputstream())); bufferedwriter bw = new bufferedwriter(new outputstreamwriter(activesocket.getoutputstream())); string s = br.readline(); bw.write("hello"); bw.flush();
最后,使用套接字的close()方法关闭连接。关闭套接字还会关闭其输入和输出流。
activesocket.close();
以下代码显示如何创建服务器套接字。
import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.inputstreamreader; import java.io.outputstreamwriter; import java.net.inetaddress; import java.net.serversocket; import java.net.socket; public class main { public static void main(string[] args) throws exception { serversocket serversocket = new serversocket(12900, 100, inetaddress.getbyname("localhost")); system.out.println("server started at: " + serversocket); while (true) { system.out.println("waiting for a connection..."); final socket activesocket = serversocket.accept(); system.out.println("received a connection from " + activesocket); runnable runnable = () -> handleclientrequest(activesocket); new thread(runnable).start(); // start a new thread } } public static void handleclientrequest(socket socket) { try{ bufferedreader socketreader = null; bufferedwriter socketwriter = null; socketreader = new bufferedreader(new inputstreamreader( socket.getinputstream())); socketwriter = new bufferedwriter(new outputstreamwriter( socket.getoutputstream())); string inmsg = null; while ((inmsg = socketreader.readline()) != null) { system.out.println("received from client: " + inmsg); string outmsg = inmsg; socketwriter.write(outmsg); socketwriter.write("\n"); socketwriter.flush(); } socket.close(); }catch(exception e){ e.printstacktrace(); } } }