Java IO ServerSockets

举报
张俭 发表于 2023/12/29 14:47:42 2023/12/29
【摘要】 两种连接终端,客户端初始化连接,还有服务端,响应连接。实现一个服务器,你需要书写一个等待其他主机连接的程序。一个ServerSocket连接到本机的一个特定端口,一旦它顺利地绑定到了一个端口上,如果监听到了来自其他主机(客户端)的请求,就会建立连接。一个端口同时可以连接多个客户端。传递来的数据会根据客户端的ip和端口来区分,ip和端口的组合是唯一的。有且只能有一个客户端监听同一主机上的同一端...

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

}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。