Java网络编程总结 --URLConnection

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
.cn 域名,1个 12个月
简介: 转自:http://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html       一、网络编程基本概念 1.OSI与TCP/IP体系模型   2.IP和端口 解决了文章最开始提到的定位的问题。

转自:http://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html

 

 

 

一、网络编程基本概念

1.OSI与TCP/IP体系模型

 

2.IP和端口

解决了文章最开始提到的定位的问题。

IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证);网络编程是和远程计算机的通信,所以必须先能定位到远程计算机;IP帮助解决此问题;一台计算机中可能有很多进程,具体和哪一个进程进行通信,这就得靠端口来识别;

IP和端口能唯一定位到需要通信的进程。这里的IP表示地址,区别于IP协议。在OSI体系还是TCP/IP体系中,IP协议位于网际层,来封装IP地址到报文中。 

 

3.TCP和UDP协议

TCPTranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。

UDPUser Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

比较:

UDP:

  1. 每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
  2. UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
  3. UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

TCP:

  1. 面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接时间。
  2. TCP传输数据大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。
  3. TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。

数据桢:

 

应用:

  • TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。
  • UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

 

4.Socket

Socket是网络驱动层提供给应用程序编程接口和一种机制。我们可以把 Socket 比喻成是一个港口码头。应用程序只要把货物放到港口码头上,就算完成了货物的运送。对于接收方应用程序也要创建一个港口码头,只需要等待货物到达码头后将货物取走。

Socket 是在应用程序中创建的,它是通过一种绑定机制与驱动程序建立关系,告诉自己所对应的 IP 和 Port。在网络上传输的每一个数据帧,必须包含发送者的 IP 地址和端口号。创建完 Socket 以后,应用程序写入到 Socket 的数据,由 Socket 交给驱动程序向网络上发送数据,计算机从网络上收到与某个 Socket 绑定的 IP 和 Port 相关的数据后,由驱动程序再交给 Socket ,应用程序就可以从这个 Socket 中读取接收到的数据。网络应用程序就是这样通过 Socket 发送和接收的。

Socket数据发送过程:

 

Socket数据接收过程:

 

5.常用应用层协议

应用层协议是为了解决某一类应用问题,而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。应用层的具体内容就是规定应用进程在通信时所遵循的协议。

 

二、Java网络编程常用类

1.InteAddress类

Java中的InetAddress是一个代表IP地址的封装。IP地址可以由字节数组和字符串来分别表示,InetAddress将IP地址以对象的形式进行封装,可以更方便的操作和获取其属性。InetAddress没有构造方法,可以通过两个静态方法获得它的对象。

复制代码
    //根据主机名来获取对应的InetAddress实例     InetAddress ip = InetAddress.getByName("www.baidu.com");     //判断是否可达    System.out.println("baidu是否可达:" + ip.isReachable(2000));     //获取该InetAddress实例的IP字符串    System.out.println(ip.getHostAddress());     //根据原始IP地址(字节数组形式)来获取对应的InetAddress实例        InetAddress local = InetAddress.getByAddress(new byte[]{127,0,0,1});     System.out.println("本机是否可达:" + local.isReachable(5000));     //获取该InetAddress实例对应的全限定域名    System.out.println(local.getCanonicalHostName());
复制代码
 

2.URL和URLConnection类

网络中的URL(Uniform Resource Locator)是统一资源定位符的简称。它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。 URL可以被认为是指向互联网资源的“指针”,通过URL可以获得互联网资源相关信息,包括获得URL的InputStream对象获取资源的信息,以及一个到URL所引用远程对象的连接URLConnection。 URLConnection对象可以向所代表的URL发送请求和读取URL的资源。通常,创建一个和URL的连接,需要如下几个步骤:

  1. 创建URL对象,并通过调用openConnection方法获得URLConnection对象;
  2. 设置URLConnection参数和普通请求属性;
  3. 向远程资源发送请求;
  4. 远程资源变为可用,程序可以访问远程资源的头字段和通过输入流来读取远程资源返回的信息。

这里需要重点讨论一下第三步:如果只是发送GET方式请求,使用connect方法建立和远程资源的连接即可;如果是需要发送POST方式的请求,则需要获取URLConnection对象所对应的输出流来发送请求。这里需要注意的是,由于GET方法的参数传递方式是将参数显式追加在地址后面,那么在构造URL对象时的参数就应当是包含了参数的完整URL地址,而在获得了URLConnection对象之后,就直接调用connect方法即可发送请求。而POST方法传递参数时仅仅需要页面URL,而参数通过需要通过输出流来传递。另外还需要设置头字段。以下是两种方式的代码:

复制代码
 //1. 向指定URL发送GET方法的请求 String urlName = url + "?" + param;  URL realUrl = new URL(urlName);  //打开和URL之间的连接 URLConnection conn = realUrl.openConnection();  //设置通用的请求属性 conn.setRequestProperty("accept", "*/*");  conn.setRequestProperty("connection", "Keep-Alive");  conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");  //建立实际的连接 conn.connect();      //2. 向指定URL发送POST方法的请求 URL realUrl = new URL(url);  //打开和URL之间的连接 URLConnection conn = realUrl.openConnection();   //设置通用的请求属性 conn.setRequestProperty("accept", "*/*");  conn.setRequestProperty("connection", "Keep-Alive");  conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");   //发送POST请求必须设置如下两行 conn.setDoOutput(true);  conn.setDoInput(true);  //获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream());  //发送请求参数 out.print(param);
复制代码
 

3.URLDecoder和URLEncoder

这两个类可以别用于将application/x-www-form-urlencoded MIME类型的字符串转换为普通字符串,将普通字符串转换为这类特殊型的字符串。使用URLDecoder类的静态方法decode()用于解码,URLEncoder类的静态方法encode()用于编码。具体使用方法如下:

//将application/x-www-form-urlencoded字符串转换成普通字符串  String keyWord = URLDecoder.decode("%E6%9D%8E%E5%88%9A+j2ee", "UTF-8");   System.out.println(keyWord);   //将普通字符串转换成  application/x-www-form-urlencoded字符串  String urlStr = URLEncoder.encode( "ROR敏捷开发最佳指南" , "GBK");   System.out.println(urlStr);
 

4.Socket和ServerSocket类

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。 但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。 Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。 TCP Socket的通信过程如下图:

 

5.DatagramSocket类

UDP协议是一种不可靠的网络协议,它在通讯实例的两端个建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送和接受数据报的对象。 包java.net中提供了两个类DatagramSocketDatagramPacket用来支持数据报通信,DatagramSocket用于在程序之间建立传送数据报的通信连接, DatagramPacket则用来表示一个数据报。 DatagramSocket的构造方法:

DatagramSocket(); DatagramSocket(int prot); DatagramSocket(int port, InetAddress laddr);

其中,port指明socket所使用的端口号,如果未指明端口号,则把socket连接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,否则会生成SocketException类例外。注意:上述的两个构造方法都声明抛弃非运行时例外SocketException,程序中必须进行处理,或者捕获、或者声明抛弃。 用数据报方式编写client/server程序时,无论在客户方还是服务方,首先都要建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。

三、总结

  • 网络编程的核心是IP、端口、协议三大元素
  • 网络编程的本质是进程间通信
  • 网络编程的2个主要问题:1是定位主机,2是数据传输

 

参考资料:

http://blog.csdn.net/driverking/article/details/6573992 http://blog.sina.com.cn/s/blog_6213b4e50100je4g.html http://52android.blog.51cto.com/2554429/482954 http://hi.baidu.com/refresh/blog/item/1ab994dd4f6957315982ddaa.html      

 

 

/////////////////////////////////////////////////////////////////////

 

String url = "http://www.xxxxxx.com";

String params = "clid="+clid_str+"&trid="+clnt.getTrid()+"&checksum="+clnt.getChecksum()+
   "&domainname="+clnt.getDomainname()+"&period="+period+"&ns1="+clnt.getNs1()+"&ns2="+clnt.getNs2()+
   "&reg_company="+reg_company+"&reg_name="+reg_name+"&reg_email="+clnt.getReg_email()+"&reg_addr="+
   reg_addr+"&reg_postcode="+clnt.getReg_postcode()+"&reg_city="+clnt.getReg_city()+"&reg_province="
   +clnt.getReg_province()+"&reg_country="+clnt.getReg_country()+"&reg_phone="+clnt.getReg_phone()+"&reg_fax="+clnt.getReg_fax()
   +"&adm_company="+adm_company+"&adm_name="+adm_name+"&adm_email="+clnt.getAdm_email()+"&adm_addr="+adm_addr+"&adm_postcode="+clnt.getAdm_postcode()
   +"&adm_city="+clnt.getAdm_city()+"&adm_province="+clnt.getAdm_province()+"&adm_country="+clnt.getAdm_country()+"&adm_phone="+clnt.getAdm_phone()+"&adm_fax="+clnt.getAdm_fax()+"&password="+clnt.getPassword();
  

 

//////////////////////////////////////////////////////////////////

 

 

 

import java.sql.Connection; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List;

import org.evision.common.DBConnection;

import checkOnTime.AddDbAndAddUser; import connect.MySqlConnect; import dao.DealDao; import dao.DomDao; import dao.QuoinfoDao; import dao.QuotaDao; import dao.UserDbDao; import email.sendEmail; import entity.Dom; import entity.Quoinfo; import entity.RegDomain; import entity.User; import evisionAPI.CheckSum; import evisionAPI.EvisionAPI;

public class Receive {  private static String sql = "";  private static DBConnection dbconn;  private static sendEmail sdEmail;  private String message;

 public void execute(String[] orderID,String orderId,String description,String price,User user)  {   sendEmail send = new sendEmail();   sdEmail = new sendEmail();   dbconn = new DBConnection(); //  CheckSum chksm = new CheckSum();   EvisionAPI api = new EvisionAPI();   DomDao dmdao = new DomDao();   DealDao dDao = new DealDao();   FTPClass fclass = new FTPClass();   QuotaDao qtDao = new QuotaDao();   Quoinfo account = new Quoinfo();   int count = 0; //  String pwd = "";      sql = "insert into deallist values(null,'"+orderId+"','"+user.getUser_id()+"','"+description+"','"+getNow()+"','"+price+"')";           //insert the value of deal's detail into deal list   dbconn.doExecute(sql);   for(int i = 0;i < orderID.length;i++){    sql = "update `order` set orderStatus='checked' where orderID="+Integer.parseInt(orderID[i])+"";     //   sendEmail send = new sendEmail();    if(dmdao.getRegDomain(Integer.parseInt(orderID[i]), user.getUser_id()) != null)    {     RegDomain temp = new RegDomain();          temp = dmdao.getRegDomain(Integer.parseInt(orderID[i]), user.getUser_id());     temp.setAdm_email(user.getUser_email());     temp.setReg_email(user.getUser_email());     temp.setChecksum(CheckSum.Checksum(7837622, temp.getTrid(), "Wuhaosdwh0213059"));     temp.setReg_time(getNow());     //TODO这边要添加更新域名注册时间的信息          if(api.register(temp))///////////////////////////////////////////     {      String title = "济南新视界网络科技-域名注册提示";            String content = "尊敬的新视界用户"           +user.getUser_name()           +",您好!您在新视界网络科技注册的域名"           +temp.getDomainname()           +"已注册成功!\n"           +"相应的域名管理密码为"           +temp.getPassword()           +",请登录网址http://mgt.dnsoray.com/对网站信息进行维护!谢谢您的支持!";            send.send(user.getUser_email(), title, content); //     sdEmail.send(user.getUser_email(), "济南新视界网络科技-域名注册提示", "尊敬的新视界用户"+user.getUser_name()+",您好!您在新视界网络科技注册的域名"+temp.getDomainname()+"已注册成功!\n"+ //       "相应的域名管理密码为"+temp.getPassword()+",请登录网址http://mgt.dnsoray.com/对网站信息进行维护!谢谢您的支持!");     }    }    else if(dDao.getOrder(Integer.parseInt(orderID[i])).getProductType().equals("quota"))    {     account = fclass.FTPOpen(Integer.parseInt(orderID[i]));     int dbYear=account.getPeriod();//quoinfo.period(year);     int dbsize = 20480;     String user_name = user.getUser_name();     Connection mysqlcon=MySqlConnect.getConnect();     String[] stringArray= new AddDbAndAddUser().createDbAndDbUser(user_name);//返回新生成的数据库名字和密码     String dbName = stringArray[0];     String dbPass = stringArray[1];     UserDbDao userDbDao=new UserDbDao();         userDbDao.makeRecordAddUser(stringArray[0], dbsize, account.getFtpname(), dbYear, mysqlcon);     MySqlConnect.closeConnect(mysqlcon);     String ftptype = null;     if(account.getFtptype() == 1){      ftptype = "JSP";     }     else if(account.getFtptype() == 2){      ftptype = "PHP";     }     else if(account.getFtptype() == 3){      ftptype = "ASP";     }     String title = "新视界网络科技"+ftptype+"类型的域名空间开通通知-no reply";          QuoinfoDao qDao= new QuoinfoDao();     int period = qDao.getPeriod(Integer.parseInt(orderID[i]));                int prodecutid = qDao.getProdecutid(Integer.parseInt(orderID[i]));           String expiration = qDao.getQuotaexpiration(prodecutid);           String time = "";     if("".equals(expiration)){      time="个月";     }else if(period == 7 && !"".equals(expiration)){      time = "天";     }else{      time = "年";     }          String subject = "您好!济南新视界网络科技感谢您的支持!您在新视界账户名为"       + user_name       + "的用户,已开通"       + ftptype       + "类型的域名空间,有效期为"+account.getPeriod()+time+"。\n"       + "\n您上传网站的FTP用户名为   "       + account.getFtpname()       + "\n对应的密码为"       + account.getFtppass()       + "\n数据库用户名为"       + dbName       + "\n数据库密码为"       + dbPass       + "\n请您登录phpadmin.jnevision.net进行数据库操作\n"       + "FTP上传网站的IP地址是58.56.17.148,连接数据库的地址为phpadmin.jnevision.net,另外请到以下地址点击进入虚拟空间管理,绑定您的域名http://www.jnevision.net/user/manager.jsp\n新视界网络现为您提供一个免费域名:free"+ftptype+".jnevision.net/"+user_name+"\n以上信息是您试用新视界空间服务的凭证,请牢记并妥善保存\n\n|||||||||||||||||||||||||||||\n"       + "\n此邮件由系统发出,请勿直接回复!再次感谢您的支持!";     sdEmail.send(user.getUser_email(), title, subject);    } //   dbconn.doExecute(sql);   }//reset the 'orderStatus' of the table `order`  }

 private static String getNow(){   SimpleDateFormat dFormat = new SimpleDateFormat("yyyyMMdd");   String now = dFormat.format(new Date());      return now;  }

 public static void main(String[] args)  {   String[] orderID = {"123","1234","12345"};   EvisionAPI api = new EvisionAPI();   DomDao dmdao = new DomDao();   User user = new User();   user.setUser_email("alba_2@163.com");   user.setUser_name("sb");   user.setUser_id(11);   for(int i = 0;i < orderID.length;i++){    if(dmdao.getRegDomain(Integer.parseInt(orderID[i]), user.getUser_id()) != null)    {     RegDomain temp = new RegDomain();     temp = dmdao.getRegDomain(Integer.parseInt(orderID[i]), user.getUser_id());     temp.setChecksum(CheckSum.Checksum(7837622, temp.getTrid(), "Wuhaosdwuhao830215"));     if(!api.register(temp))     {      String title = "1";//济南新视界网络科技 域名注册提示      String content = "尊敬的新视界用户"+user.getUser_name()+",您好!您在新视界网络科技注册的域名"+temp.getDomainname()+"已注册成功!\n"+          "相应的域名管理密码为"+temp.getPassword()+",请登录网址http://mgt.dnsoray.com/对网站信息进行维护!谢谢您的支持!";      sendEmail send = new sendEmail();      send.send(user.getUser_email(), title, content);      System.out.println(content);     }    }

  }  }

 public String getMessage() {   return message;  }

 public void setMessage(String message) {   this.message = message;  }     }

相关文章
|
10天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
39 11
|
1月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
64 9
|
1月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
45 13
|
1月前
|
安全 Java API
深入探索Java网络编程中的HttpURLConnection:从基础到进阶
本文介绍了Java网络编程中HttpURLConnection的高级特性,包括灵活使用不同HTTP方法、处理重定向、管理Cookie、优化安全性以及处理大文件上传和下载。通过解答五个常见问题,帮助开发者提升网络编程的效率和安全性。
114 9
|
1月前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
69 9
|
1月前
|
数据采集 Java API
java怎么设置代理ip:简单步骤,实现高效网络请求
本文介绍了在Java中设置代理IP的方法,包括使用系统属性设置HTTP和HTTPS代理、在URL连接中设置代理、设置身份验证代理,以及使用第三方库如Apache HttpClient进行更复杂的代理配置。这些方法有助于提高网络请求的安全性和灵活性。
|
1天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
3天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
3天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
19 3