两种连接终端,客户端初始化连接,还有服务端,响应连接。实现一个服务器,你需要书写一个等待其他主机连接的程序。一个ServerSocket连接到本机的一个特定端口,一旦它顺利地绑定到了一个端口上,如果监听到了来自其他主机(客户端)的请求,就会建立连接。
一个端口同时可以连接多个客户端。传递来的数据会根据客户端的ip和端口来区分,ip和端口的组合是唯一的。有且只能有一个客户端监听同一主机上的同一端口。通常情况下,ServerSocket只用来接收连接,而和客户端的通信放在独立的线程里去处理。而把将要建立的连接放在队列里面逐个处理。
java.net.ServerSocket类代表着一个ServerSocket。有如下的构造函数,可以确定监听的端口,队列的长度以及ip地址(默认为本机)
public ServerSocket (int port) throws IOException
public ServerSocket (int port, int backlog) throws IOException
public ServerSocket (int port, int backlog, InetAddress bindAddr) throws IOException
通常情况下你指定你想要监听的端口
try {
ServerSocket ss = new ServerSocket(99);
} catch (IOException e) {
e.printStackTrace();
}
如果此时该端口已经被其他程序占用,就会导致BindException。当你拥有了ServerSocket之后,你需要等待连接,通过调用accept方法,这个方法会阻塞,直到一个连接到来,然后返回一个Socket,你可以使用它来和客户端通信,调用close方法会关闭ServerSocket
public Socket accept() throws IOException
public void close() throws IOException
下面的例子展示了一个程序,监听端口,当建立连接之时,它返回客户端和自身的ip和端口,然后关闭连接
public class HelloServer {
public final static int DEFAULT_PORT = 2345;
public static void main(String[] args) {
int port = DEFAULT_PORT;
try {
port = Integer.parseInt(args[0]);
} catch (Exception e) {}
if(port<=0||port>=65536) {
port = DEFAULT_PORT;
}
try {
ServerSocket ss = new ServerSocket(port);
while (true) {
try{
Socket s = ss.accept();
String response = s.getInetAddress()+""+s.getPort()+"\n";
response += s.getLocalAddress()+""+s.getLocalPort();
OutputStream out = s.getOutputStream();
out.write(response.getBytes());
out.flush();
out.close();
} catch (IOException e) {}
}
} catch (IOException e) {}
}
}