Java网络编程

来源:互联网 发布:linux 调试 内核模块 编辑:程序博客网 时间:2024/05/29 04:45

1.Java的基本网络支持

使用InetAddress:

package com.inetAddress;import java.io.IOException;import java.net.InetAddress;import java.net.UnknownHostException;public class InetAddressTest {public static void main(String[] args) throws IOException {//根据主机名来获取对应的InetAddress实例InetAddress ip=InetAddress.getByName("www.baidu.com");//判断是否可达System.out.println("www.baidu.com是否可达:"+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(2000));//获取该InetAddress实例对应的全限定域名System.out.println(local.getCanonicalHostName());}}

使用URLDecoder和URLEncoder

package com.inetAddress;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;/* * 每个中文字符占两个字节,每个字节可以转换成两个十六进制的数字 */public class URLDecoderTest {public static void main(String[] args) throws UnsupportedEncodingException {/* * 将application/x-www-form-urlencoded字符串转换成普通字符串 * 其中的字符串直接从Google搜索栏复制 */String keyWord=URLDecoder.decode("%E7%96%AF%E7%8B%82java%E8%AE%B2%E4%B9%89","utf-8");System.out.println(keyWord);/* * 将普通字符串转换成application/x-www-form-urlencoded字符串 * 其中的字符串直接从Google搜索栏复制 */String urlStr=URLEncoder.encode("疯狂java讲义","utf-8");System.out.println(urlStr);}}

2.向Web站点发送GET请求,POST请求,并从Web站点取得响应

package com.inetAddress;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import java.util.List;import java.util.Map;public class GetPostTest {/* * 向指定URL发送GET方式的请求 * @param url发送请求的URL * @param param 请求参数,格式满足name1=value&name2=value2的形式 * @return URL代表远程资源的响应 */public static String sendGet(String url,String param){String result="";String urlName=url+"?"+param;try{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();//获取所有的响应头字段Map<String,List<String>> map=conn.getHeaderFields();//遍历所有的响应头字段for(String key:map.keySet()){System.out.println(key+"--->"+map.get(key));}try(//定义BufferedReader输入流来读取URL的响应BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"))){String line;while((line=in.readLine())!=null){result+="\n"+line;}}}catch(Exception e){System.out.println("发送Get请求出现异常!"+e);e.printStackTrace();}return result;}/** * 向指定URL发送Post请求 * @param url发送请求的URL * @param param 请求参数,格式满足name1=value&name2=value2的形式 * @return URL代表远程资源的响应 */public static String sendPost(String url,String param){String result="";try{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);try(//获取URLConnection对象对应的输出流PrintWriter out=new PrintWriter(conn.getOutputStream())){//发送请求参数out.print(param);//flush输出流的缓冲out.flush();}try(//定义BufferedReader输入流来读取URL的响应BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"))){String line;while((line=in.readLine())!=null){result+="\n"+line;}}}catch(Exception e){System.out.println("发送POST请求出现异常!"+e);e.printStackTrace();}return result;}//提供主方法,测试发送GET和POST请求public static void main(String[] args) {//发送 GET请求//String s=GetPostTest.sendGet("http://localhost:8080/abc/a", null);//System.out.println(s);//发送POST请求String s1=GetPostTest.sendPost("http://localhost:8080/abc/login.jsp", "name=crazyit.org&pass=leegang");System.out.println(s1);}}
3多线程下载

package com.download.test;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class DownUtil{//定义下载资源的路径private String path;//指定下载的文件保存位置private String targetFile;//定义使用多少个线程下载资源private int threadNum;//定义下载的线程对象private DownThread[] threads;//定义下载的文件的总大小private int fileSize;public DownUtil(String path,String targetFile,int threadNum){this.path=path;this.threadNum=threadNum;this.targetFile=targetFile;//初始化threads数组threads=new DownThread[threadNum];}public void download() throws IOException{URL url=new URL(path);HttpURLConnection conn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(2000);conn.setRequestMethod("GET");conn.setRequestProperty("Accept", "image/gif,image/jpeg,image/pjpeg,image/pjpeg,"+"application/x-shockwave-flash,application/xaml+xml,"+"application/vnd.ms-xpsdocument,application/x-ms-xbap,"+"application/x-ms-application,application/vnd.ms-excel"+"application/vnd.ms-powerpoint,application/msword,*/*");conn.setRequestProperty("Accept-language", "zh—CN");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Connection", "keep-Alive");//得到文件大小fileSize=conn.getContentLength();conn.disconnect();int currentPartSize=fileSize/threadNum+1;RandomAccessFile file=new RandomAccessFile(targetFile,"rw");//设置本地文件大小file.setLength(fileSize);file.close();for(int i=0;i<threadNum;i++){//计算每个线程下载的开始位置int startPos=i*currentPartSize;//每个线程使用一个RandomAccessFile进行下载RandomAccessFile currentPart=new RandomAccessFile(targetFile,"rw");//定位该线程的下载位置currentPart.seek(startPos);//创建下载线程threads[i]=new DownThread(startPos,currentPartSize,currentPart);//启动下载线程threads[i].start();}}//获取下载的完成百分比public double getCompleteRate(){//统计多个线程已经下载的总大小int sumSize=0;for(int i=0;i<threadNum;i++){sumSize+=threads[i].length;}//返回已经完成的百分比return sumSize*1.0/fileSize;}private class DownThread extends Thread{//当前线程的下载位置private int startPos;//定义当前线程负责下载的大小private int currentPartSize;//当前线程需要下载的文件块private RandomAccessFile currentPart;//定义该线程已经下载的字节数public int length;public DownThread(int startPos,int currentPartSize,RandomAccessFile currentPart){this.startPos=startPos;this.currentPartSize=currentPartSize;this.currentPart=currentPart;}public void run(){try{URL url=new URL(path);HttpURLConnection conn=(HttpURLConnection)url.openConnection();conn.setReadTimeout(2000);conn.setRequestMethod("GET");conn.setRequestProperty("Accept", "image/gif,image/jpeg,image/pjpeg,image/pjpeg,"+"application/x-shockwave-flash,application/xaml+xml,"+"application/vnd.ms-xpsdocument,application/x-ms-xbap,"+"application/x-ms-application,application/vnd.ms-excel"+"application/vnd.ms-powerpoint,application/msword,*/*");conn.setRequestProperty("Accept-Language", "zh-CN");conn.setRequestProperty("Charset", "UTF-8");InputStream intStream=conn.getInputStream();//跳过startPos字节,表明该线程只下载自己负责的那部分文件intStream.skip(this.startPos);byte[] buffer=new byte[1024];int hasRead=0;//读取网络数据,并写入本地文件while(length<currentPartSize&&(hasRead=intStream.read(buffer))!=-1){currentPart.write(buffer,0,hasRead);//累计该线程下载的总大小length+=hasRead;}currentPart.close();intStream.close();}catch(Exception ex){ex.printStackTrace();}}}}
package com.download.test;import java.io.IOException;public class MutiThreadDown {public static void main(String[] args) throws IOException {//初始化DownUtil对象final DownUtil downUtil=new DownUtil("http://b.hiphotos.baidu.com/"+"image/pic/item/2cf5e0fe9925bc3165ef6b965cdf8db1cb137009.jpg","ios.png",2);//开始下载downUtil.download();new Thread(()->{while(downUtil.getCompleteRate()<1){//每隔0.1秒查询一次任务的完成进度//GUI程序中可根据该进度来绘制进度条System.out.println("已完成:"+downUtil.getCompleteRate());try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}}).start();}}

4.使用Socket进行通信

package com.socket.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;import java.net.UnknownHostException;public class Client {public static void main(String[] args) throws UnknownHostException, IOException {Socket socket=new Socket("127.0.0.1",3000);//将socket对应的输入流包装成BufferedReaderBufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));//进行普通IO操作String line=br.readLine();System.out.println("来自服务器的数据:"+line);//关闭输入流,关闭socketbr.close();socket.close();}}
package com.socket.test;import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//创建一个serversocket,用于监听客户端socket请求ServerSocket ss=new ServerSocket(3000);//采用循环不断接受来自客户端的请求while(true){//每当接收到客户端socket的请求时,服务器端也对应产生一个socketSocket s=ss.accept();//将socket对应的输出流包装成printStreamPrintStream ps=new PrintStream(s.getOutputStream());//进行普通IO操作ps.println("您好!您收到了来自服务器的响应!");//关闭输出流,关闭socketps.close();s.close();}}}






















































0 0
原创粉丝点击