my-网络编程.doc_第1页
my-网络编程.doc_第2页
my-网络编程.doc_第3页
my-网络编程.doc_第4页
my-网络编程.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络编程URLIP地址与InetAddress类Socket网络编程(TCP/UDP)JDK中的网络类通过包中的类,java程序能够使用TCP或UDP协议在互联网上进行通讯 Java 通过扩展已有的流式输入/输出接口和增加在网络上建立输入/输出对象特性这两个方法支持TCP/IP。 Java支持TCP和UDP协议族。TCP用于网络的可靠的流式输入/输出。UDP支持更简单的、快速的、点对点的数据报模式URL(创建和使用URL访问网上资源)URL(Uniform Resource Locator)是统一资源定位符的简称,它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。URL是最为直观的一种网络定位方法。使用URL符合人们的语言习惯,容易记忆,所以应用十分广泛。而且在目前使用最为广泛的TCP/IP中对于URL中主机名的解析也是协议的一个标准,即所谓的域名解析服务。使用URL进行网络编程,不需要对协议本身有太多的了解,功能也比较弱,相对而言是比较简单的。一个URL 包括两个主要部分: 协议标识符:HTTP,FTP,File等 资源名字:主机名,文件名,端口号,引用 例如::80/javase/tutorial/index.html创建URL在Java程序中,可以创建表示URL地址的URL对象。URL对象表示一个绝对URL地址,但URL对象可用绝对URL、相对URL和部分URL构建 如果创建失败:try URL myURL = new URL(. . .) /必须写http前缀,注意:不是在浏览器里面打开catch(MalformedURLException e) / exception handler code here URLConnection为获得URL的实际比特或内容信息,用它的openConnection( )方法从它创建一个URLConnection对象,例:url.openConnection() openConnection( ) 有下面的常用形式:URLConnection openConnection( ) 与调用URL对象相关,它返回一个URLConnection对象。它可能引发IOException异常 URLConnection是访问远程资源属性的一般用途的类。如果你建立了与远程服务器之间的连接,你可以在传输它到本地之前用URLConnection来检察远程对象的属性。这些属性由HTTP协议规范定义并且仅对用HTTP协议的URL对象有意义Example:TestUrl.javaimport .URL;public class TestUrlpublic static void main(String args) throws ExceptionURL url = new URL(/javase/tutorial/index.html);String protocol = url.getProtocol();String host = url.getHost();String file = url.getFile();int port = url.getPort();String ref = url.getRef();System.out.println(protocol + , + host + , + file + , + port+ , + ref);TestUrlConnection1.javaimport java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import .URL;import .URLConnection;public class TestUrlConnection1public static void main(String args) throws ExceptionURL url = new URL();URLConnection conn = url.openConnection();InputStream is = conn.getInputStream();OutputStream os = new FileOutputStream(c:163.txt);byte buffer = new byte2048;int length = 0;while(-1 != (length = is.read(buffer, 0, buffer.length)os.write(buffer, 0, length);is.close();os.close();TestUrlConnection2.javaimport java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import .URL;import .URLConnection;public class TestUrlConnection2public static void main(String args) throws ExceptionURL url = new URL();/URLConnection conn = url.openConnection();/InputStream is = conn.getInputStream();InputStream is = url.openStream();OutputStream os = new FileOutputStream(c:csdn.html);byte buffer = new byte2048;int length = 0;while(-1 != (length = is.read(buffer, 0, buffer.length)os.write(buffer, 0, length);is.close();os.close();TestUrlConnection3.java下载网页,打印到控制台import java.io.BufferedReader;import java.io.InputStreamReader;import .URL;public class TestUrlConnection3public static void main(String args) throws ExceptionURL url = new URL();BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream();String line = null;while(null != (line = br.readLine()System.out.println(line);br.close();IP地址与InetAddress类无论你是在打电话、发送邮件或建立与Internet的连接,地址是基础。InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名。你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解。InetAddress 类内部隐藏了地址数字。InetAddress 类没有明显的构造函数。为生成一个InetAddress对象,必须运用一个可用的工厂方法。工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。对于InetAddress,三个方法 getLocalHost( )、getByName( )以及getAllByName( )可以用来创建InetAddress的实例getLocalHost( )仅返回象征本地主机的InetAddress对象getByName( )方法返回一个传给它的主机名的InetAddress。如果这些方法不能解析主机名,它们引发一个UnknownHostException异常。在Internet上,用一个名称来代表多个机器是常有的事。getAllByName( )工厂方法返回代表由一个特殊名称分解的所有地址的InetAddresses类数组。在不能把名称分解成至少一个地址时,它将引发一个Unknown HostException异常。 Java中处理IP地址的类是InetAddress类,它在软件包中l getByName方法返回InetAddress对象,得到指定计算机的计算机名和IP地址,如果为null,那么在本地机上产生计算机名为localhost的主机l getLocalHost方法返回InetAddress对象,得到本地机的计算机名和IP地址此方法得到的永远是本地机(即运行程序的电脑)的计算机名和IP地址l getHostName方法返回InetAddress对象的计算机名字符串l getHostAddress方法返回InetAddress对象的IP地址字符串Example:import .InetAddress;public class TestInetAddresspublic static void main(String args) throws ExceptionInetAddress address = InetAddress.getLocalHost();System.out.println(address);address = InetAddress.getByName();System.out.println(address); / 根据主机名来获取对应的InetAddress实例InetAddress ip = InetAddress.getByName();/ 判断是否可达System.out.println(163是否可达: + ip.isReachable(2000); / 获取该InetAddress实例的IP字符串System.out.println(ip.getHostAddress();/ 根据原始IP地址来获取对应的InetAddress实例InetAddress local = InetAddress.getByAddress(new byte127,0,0,1);System.out.println(本机是否可达: + local.isReachable(5000); / 获取该InetAddress实例对应的全限定域名System.out.println(local.getCanonicalHostName();TestURLDecoder.javaimport .URLDecoder;import .URLEncoder;public class TestURLDecoderpublic static void main(String args) throws Exception/ 将application/x-www-form-urlencoded字符串/ 转换成普通字符串String keyWord = URLDecoder.decode(Java%D3%EB%C4%A3%CA%BD, GBK);System.out.println(keyWord);/ 将普通字符串转换成/ application/x-www-form-urlencoded字符串String urlStr = URLEncoder.encode(Java与模式, GBK);System.out.println(urlStr);Socket网络编程套接字(Socket)的引用为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。 随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。什么是Socket? Socket是连接运行在网络上的两个程序间的双向通讯的端点 使用TCP/IP的套接字(Socket)进行通信1. 建立连接设计服务器客户机程序的第一步是建立双方的连接作为服务器的Socket程序必须首先建立ServerSocket对象当ServerSocket对象建立后,就调用ServerSocket类的accept方法准备接受客户机程序的访问,同时这个方法还会返回一个Socket对象注:accept方法有些与众不同,它会一直等待直到收到访问请求,自身就有点儿循环的功能2. Socket的通讯当连接成功后,在服务器上调用getInputStream方法把Socket对象变成一个普通的输入流例如:BufferedReader in = new BufferedReader(new InputStream(socket1.getInputStream();同理,在客户机程序上调用getOutputStream方法把socket对象变成普通的输出流例如:PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socked1.getOutputStream(),true);这样,客户机向out写入内容即向服务器传送数据,服务器从in中读的数据就是来自客户机Example1:TCPClient.javaimport java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import .Socket;import .UnknownHostException;public class TCPClientpublic static void main(String args)trySocket socket = new Socket(, 10000);OutputStream os = socket.getOutputStream();os.write(hello.getBytes();os.close();socket.close();catch (UnknownHostException e)e.printStackTrace();catch (IOException e)e.printStackTrace();TCPServer.javaimport java.io.IOException;import java.io.InputStream;import .ServerSocket;import .Socket;public class TCPServerpublic static void main(String args)tryServerSocket serverSocket = new ServerSocket(10000);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();byte b = new byte1024;int len = is.read(b);System.out.println(服务端收到的消息 + new String(b,0,len);is.close();socket.close();catch (IOException e)e.printStackTrace();Example2:TCPClient2.javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .Socket;public class TCPClient2public static void main(String args) throws IOException Socket socket = new Socket(, 10000);/ 将Socket对应的输入流包装成BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream();String line = br.readLine();System.out.println(来自服务器的数据: + line);TCPServer2.javaimport java.io.IOException;import java.io.PrintStream;import .ServerSocket;import .Socket;public class TCPServer2public static void main(String args)try/创建一个ServerSocket,用于监听客户端Socket的连接请求ServerSocket ss = new ServerSocket(10000);/采用循环不断地接收来自客户端的请求while(true)/每当接收到客户端Socket的请求时,服务端也对应产生一个SocketSocket s = ss.accept();/将Socket对应的输出流包装成PrintStreamPrintStream ps = new PrintStream(s.getOutputStream();ps.println(您好,您收到了服务器的祝福!);ps.close();s.close();catch (IOException e)e.printStackTrace();Example3:MyClient.javaimport java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import .Socket;public class MyClientpublic static void main(String args) throws ExceptionSocket s = new Socket(, 10000);/ 客户端启动ClientThread线程不断读取来自服务器的数据new Thread(new ClientThread(s).start(); / / 获取该Socket对应的输出流PrintStream ps = new PrintStream(s.getOutputStream();String line = null;/ 不断读取键盘输入BufferedReader br = new BufferedReader(new InputStreamReader(System.in);while (line = br.readLine() != null)/ 将用户的键盘输入内容写入Socket对应的输出流ps.println(line);class ClientThread implements Runnable/ 该线程负责处理的Socketprivate Socket s;/ 该线程所处理的Socket所对应的输入流BufferedReader br = null;public ClientThread(Socket s) throws IOExceptionthis.s = s;br = new BufferedReader(new InputStreamReader(s.getInputStream();public void run()tryString content = null;/ 不断读取Socket输入流中的内容,并将这些内容打印输出while (content = br.readLine() != null)System.out.println(content);catch (Exception e)e.printStackTrace();MyServer.javaimport java.io.IOException;import .ServerSocket;import .Socket;import java.util.ArrayList;public class MyServer/ 定义保存所有Socket的ArrayListpublic static ArrayList socketList = new ArrayList();public static void main(String args) throws IOExceptionServerSocket ss = new ServerSocket(10000);while(true)/ 此行代码会阻塞,将一直等待别人的连接Socket s = ss.accept();socketList.add(s);/ 每当客户端连接后启动一条ServerThread线程为该客户端服务new Thread(new ServerThread(s).start();/* * 负责处理每个线程通信的线程类 * * author Administrator * */class ServerThread implements Runnable/ 定义当前线程所处理的SocketSocket s = null;/ 该线程所处理的Socket所对应的输入流BufferedReader br = null;public ServerThread(Socket s) throws IOExceptionthis.s = s;/ 初始化该Socket对应的输入流br = new BufferedReader(new InputStreamReader(s.getInputStream();public void run()tryString content = null;/ 采用循环不断从Socket中读取客户端发送过来的数据while (content = readFromClient() != null)/ 遍历socketList中的每个Socket,/ 将读到的内容向每个Socket发送一次for (Socket s : MyServer.socketList)PrintStream ps = new PrintStream(s.getOutputStream();ps.println(content);catch (IOException e)e.printStackTrace();/ 定义读取客户端数据的方法private String readFromClient()tryret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论