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) {}
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,647评论 2 56
  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 3,446评论 0 13
  • 接着上一回的继续深挖白骨精: 上一回说到,【几年】是指两年半。 【家人】里,蜘蛛精、七仙女、王母娘娘,都是白骨精的...
    c3c3540e6438阅读 1,747评论 2 3
  • 内部类:在一个类内部定义的类 内部类属于外部类的一个成员,所以内部类可以直接使用外部类的成员 直接创建内部类的对象...
    Jonath阅读 297评论 0 0