JAVAIO-SOCKETS

在数据在互联网中从一个主机到另一个主机的传递之时,它被分割成大小不同但是有限的数据包中(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) {
                
            }
        }

    }

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,881评论 18 139
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,626评论 2 56
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,090评论 0 8
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,131评论 6 174
  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 2,275评论 2 12