Java IO Sockets

举报
张俭 发表于 2023/12/29 14:32:12 2023/12/29
【摘要】 在数据在互联网中从一个主机到另一个主机的传递之时,它被分割成大小不同但是有限的数据包中(datagrams)。如果要发送的数据大于了数据包的最大大小,它就会被分割成数个包发送,这样做的好处是,如果其中有一个包丢失,那么只需要重传一个包,而不必把所有的包重传。如果包抵达的顺序不同,也会在接收点重新组转完毕。这一操作对程序员来说是透明的,我们工作在高层抽象的socket上。socket提供了两个...

在数据在互联网中从一个主机到另一个主机的传递之时,它被分割成大小不同但是有限的数据包中(datagrams)。如果要发送的数据大于了数据包的最大大小,它就会被分割成数个包发送,这样做的好处是,如果其中有一个包丢失,那么只需要重传一个包,而不必把所有的包重传。如果包抵达的顺序不同,也会在接收点重新组转完毕。

这一操作对程序员来说是透明的,我们工作在高层抽象的socket上。socket提供了两个主机之间可靠地连接。这样子,你就不需要考虑数据包的编码, 数据包的分割,数据包的重传或者是数据包的组装。Scoket提供这四种基本操作:

1.远程连接到一个机器
2.发送数据
3.接收数据
4.关闭连接

java.net.socket是一个network socket提供了这四种基本操作。在这四种操作中,没有一个抽象了协议,这个类就是为了网络客户端和服务器的连接设计的。为了创建一个连接,你调用socket构造函数中的一种。每一个socket对象仅仅连接到一个指定的远程主机。如果要连接到不同的主机,你必须创建一个新的socket对象:

  public Socket (String host, int port) throws UnknownHostException, IOException
  public Socket(InteAddress address, int port) throws IOException
  public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
  public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

host可以是像“www.huawei.com"这样子的,或者127.0.9.1这样。这个参数也可以通过java.net.InetAddress传入。

port参数指的是远程主机要连接的端口,0~65535.每一个服务都有他们指定的端口。许多知名的服务都运行在知名的端口上。比如HTTP运行在80端口中。

通过socket来发送接收数据是通过InputStream和 OuputStream

  public InputStream getInputStream() throws IOException
  public OutputStream getOutputStream() throws IOException

同样的,也有关闭socket连接的方法

  public synchronized void close() throws IOException

如下的代码连接到一个网络服务器然后下载一个特定的URL地址。然而这里使用的是Socket而不是URL Connection,所以头部信息需要我们自己处理。

public class SocketTyper {

    public static void main(String[] args) {

        if(args.length==0) {
            System.err.println("Usage: java SocketTyper url1 url2..");
            return;
        }

        for(int i=0;i<args.length;i++) {
            if(args.length<1) {
                System.out.println(args[i]+":");
            }
            try {
                URL u = new URL(args[i]);
                if(u.getProtocol().equalsIgnoreCase("http")){
                    System.err.println("ONLY support http");
                    continue;
                }
                String host = u.getHost();
                int port = u.getPort();
                String file = u.getFile();
                if(port<=0||port>65535) {
                    port = 80;
                }
                Socket s = new Socket(host,port);
                String request = "GET"+file+"HTTP/1.0\\r\\n"+"User-Agent:MechaMozilla\\r\\nAccept:text*\\r\\n\\r\\n";
                byte[] b = request.getBytes();
                OutputStream out = s.getOutputStream();
                InputStream in = s.getInputStream();
                out.write(b);
                out.flush();
                StreamCopier.copy(in,System.out);
                in.close();
                out.close();
                s.close();
            } catch (MalformedURLException e){

            } catch (IOException e) {

            }
        }

    }

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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