JAVAIO-ServerSockets

两种连接终端,客户端初始化连接,还有服务端,响应连接。实现一个服务器,你需要书写一个等待其他主机连接的程序。一个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) {}
    }

}

你可能感兴趣的:(JAVAIO-ServerSockets)