




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络典型例题Java提供了两个不同层次的网络支持机制:利用URL访问网络资源利用Socket通信一、统一资源定位符URL类 1、URL用来网络资源定位,它的值由5部分组成,格式如下所示:/:/其中传输协议(protocol)指明获取资源所使用的传输协议,如http、ftp、file等。http表示通过HTTP访问网络资源。ftp表示通过网络协议FTP访问网络资源。file表示本机上文件,是所指定的资源。news表示通过NNTP访问指定新闻地址的资源。主机名(hostname)指定资源所在的计算机,可以是IP地址,如,也可以是主机名或域名,如。一个计算机中可能有多种服务(应用程序),端口号(port)用来区分不同的网络服务,如http服务的默认端口号是80,ftp服务的默认端口号是21等。理论上有0-65535个端口,其中1024号以下端口一般都给定了用途,例如HTTP使用80端口;FTP默认21端口;Telnet使用23端口。平常我们使用1024号以上端口。文件名(filename)包括该文件的完整路径。在http协议中,缺省的文件名是index.html,因此,就相等同于 /index.html。引用(reference)为资源内的某个引用,用来定位显示文件内容的位置,如/index.html#chapter1。但并非所有的URL都包含这些元素。对于多数的协议,主机名和文件名是必需的,但端口号和文件内部的引用则是可选的。2、URL类位于包中,是指向互联网资源的指针,使用URL可以通过给定的URL地址访问到需要的资源。资源可以是简单的文件和目录,也可以是对象的引用、对数据库或搜索引擎的查询。URL类的对象代表一个URL地址。URL对象的创建示例:其构造方法:1)通过指定的URL字符串创建URL对象URL gamelan= new URL(/pages/G.html);2)通过指定的协议、主机地址、路径字符串创建URL对象URL gamelan =new URL(http, , /pages/G.html); 3)通过指定的协议、主机地址、端口号、路径字符串创建URL对象URL gamelan = new URL(http, , 80, pages/Gwork.html); 上两种方法将一个URL地址分解,按不同部分分别指定协议、主机、端口、文件。4) 通过指定的上下文中对指定的协议的解析创建对象:URL(URLcontext, Stringspec) 这种方法基于一个已有的URL对象创建一个新的URL对象,多用于访问同一个主机上不同路径的文件,例如:URL u1=new URL(u, ”ro.html”);创建URL后,可以对其操作:public int getDefaultItPort(); 获取与此URL关联的默认端口号public String getFile();获取此URL的文件名public String getHost();获取此URL的主机名public String getPath();获取此URL的路径部分public int getPort();获取此URL的端口号public String getProtocol ();获取此URL的协议名称public String getQuery();获取此URL的查询部分public InputStream openStream();打开到此URL的连接并返回一个用于从该连接读入的InputStream。3、URLConnection抽象类该抽象类代表应用程序和URL之间的通信链接。创建一个到URL的连接步骤:1)对影响到远程资源连接的参数操作,通过在URL上调用openConnection方法创建连接对象。2)除了设置参数和一般请求属性。3)使用connect方法建立到远程对象的实际连接,与资源交互;查询头字段和内容。4)远程对象变为可用。远程对象的头字段和内容变为可访问。建立到远程对象的连接后,可以使用以下方法对头字段和内容进行访问。public Object getContent() throws IOException; 获取此URL链接的内容public String getHeaderField(int n); 获取指定头字段的值public InputStream getInputStream() throws IOException; 获取输入流,如果读超时,会抛出SockeTimeoutException。public OutputStream getOutputStream() throws IOException; 获取输出流public String getContentEncoding(); 获取content-encoding的值public int getContentLength(); 获取content-length的值public String getContentType(); 获取content-type的值public long getDate(); 获取date的值public long getLastModified(); 获取last-modified的值,结果为距离格林威治标准时间的毫秒数。以下是测试一例。import java.io.*;import .*;import java.util.*;/写URL的测试类,获取网站的信息,并将网站主页下载到本地磁盘上public class URLTest/主方法 public static void main(String args) try /定义urlName的字符串,如果args数组长度大于0,则将args0的值赋给urlName String urlName= /index.asp; if (args.length 0) urlName = args0; URL url = new URL(urlName);/创建URL对象 System.out.println(打印url的一些信息:); System.out.println(getProtocol: + url.getProtocol();/获取协议名称 System.out.println(getthost: + url.getHost();/获取主机名称 System.out.println(gettfile: + url.getFile();/获取此 URL 的文件名 System.out.println(getPath: + url.getPath();/获取路径 System.out.println(getPort: + url.getPort();/获取端口号,未设置返回-1 System.out.println(getDefaultPort: + url.getDefaultPort();/返回默认端口号 URLConnection connection = url.openConnection();/打开远程对象的连接,返回连接值 connection.connect();/连接到服务器,打开此URL引用的资源的通信链接 /获取并打印头字段的值 System.out.println(打印头字段信息:); int n = 1; String key; while (key = connection.getHeaderFieldKey(n) != null) String value = connection.getHeaderField(n);/返回第n个头字段的值 System.out.println(key + : + value);/打印头字段的键、值 n+; /打印引用资源的一些属性 System.out.println(打印引用资源的一些属性); System.out.println(getContentType: + connection.getContentType();/返回引用资源的内容类型 System.out.println(getContentLength: + connection.getContentLength();/返回引用资源的内容长度 System.out.println(getContentEncoding: + connection.getContentEncoding();/返回引用资源的内容编码 /返回引用资源的发送日期,为距离格林威治标准时间1970年1月1日的毫秒数。 System.out.println(getDate: + connection.getDate(); /返回引用资源上次的修改日期,若未知返回0 System.out.println(getLastModifed: +connection.getLastModified(); /下载引用文件到本地磁盘,读取文件 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(); / /打印输出源文件前10行/ String line;/ n = 1;/ while (line = in.readLine() != null & n = 10)/ /读出文件并输出/ System.out.println(line);/ n+;/ / if (line != null)/ System.out.println(. . . . . .); /创建输出流,并指定目标文件 BufferedWriter bw=new BufferedWriter(new FileWriter(e:/URLTest.html); /对输出流做进一步进行封装 PrintWriter pw=new PrintWriter(bw); /声明临时字符串引用 String temps=null; /从输入流中获取资源并测试是否读取完毕 while(temps=in.readLine()!=null) /将获取的数据写如目标文件 pw.println(temps); /打印提示信息 System.out.println(您好,网站主页已经下载完毕,已经写入了URLTest.html); pw.close();/关闭输出流 in.close();/关闭输入流 catch (IOException exception) exception.printStackTrace(); 二、Socket编程传统的C/S模式的网络程序主要通过服务器端和客户端的网络连接来实现数据传输。服务器端和客户端的网络连接主要是TCP Socket连接。在包中提供了Socket和ServerSocket类来实现连接。在Socket编程中发送方和接收方的两个Socket之间必须先连接,再才能在TCP协议的基础上进行通信。服务器的任务就是等候建立一个连接,然后用那个连接产生的Socket 创建一个InputStream 以及一个OutputStream。之后,从InputStream 读入的所有东西都会反馈给OutputStream,直到接收到行中止(END)为止,最后关闭连接。客户机连接与服务器的连接,然后创建一个OutputStream。文本行通过OutputStream 发送。客户机也会创建一个InputStream,用它收听服务器说些什么。服务器与客户机(程序)都使用同样的端口号,而且客户机利用本地主机地址连接位于同一台机器中的服务器(程序),所以不必在一个物理性的网络里完成测试。注意,ServerSocket 只要一个端口编号,不需要IP 地址(因为它就在这台机器上运行)。调用accept()时,方法暂时陷入停顿状态,直到某个客户尝试同它建立连接。建好一个连接以后,accept()会返回一个Socket对象,它是那个连接的代表。假如ServerSocket 构建器失败,则程序简单地退出(注意必须保证ServerSocket 的构建器在失败之后不会留下任何打开的网络套接字)。针对这种情况,main()会“掷”出一个IOException 违例,所以不必使用一个try 块。若ServerSocket 构建器成功执行,则其他所有方法调用都必须到一个try-finally 代码块里寻求保护,以确保无论块以什么方式留下,ServerSocket 都能正确地关闭。同样的道理也适用于由accept()返回的Socket。若accept() 失败,那么我们必须保证Socket 不再存在或者含有任何资源,以便不必清除它们。但假若执行成功,则后续的语句必须进入一个try-finally 块内,以保障在它们失败的情况下,Socket 仍能得到正确的清除。由于套接字使用了重要的非内存资源,所以在这里必须特别谨慎,必须自己动手将它们清除。无论ServerSocket 还是由accept()产生的Socket 都打印到System.out 里。这意味着它们的toString方法会得到自动调用。这样便产生了:ServerSocketaddr=,PORT=0,localport=8080Socketaddr=,PORT=1077,localport=8080在后面的程序中大家会看到它们如何与客户程序做的事情配合。服务器端程序:mport java.io.*;import .*;/写服务器端,对端口进行监听,接受客户端请求并为客户端服务public class TcpServerpublic static void main(String args)/服务器对8888端口进行监听,接受到客户端连接请求后,创建和启动服务线程,long count = 0;/声明用来计数的变量ServerSocket serverSocket = null;/声明服务器套接字try serverSocket = new ServerSocket(8888);/创建绑定到8888端口的ServerSocket对象System.out.println(服务器对8888端口实施监听.);/打印提示信息/服务器循环接收客户端的请求,为不同的客户端提供服务while (true) Socket socket = serverSocket.accept();/接收客户端的连接请求,若有连接请求返回连接对应的Socket对象count+;ServerThread serverThread = new ServerThread(socket, count);/创建服务器线程serverThread.start();/启动服务器线程 catch (IOException e) e.printStackTrace();/定义ServerThread类,继承自Thread类class ServerThread extends Thread/根据客户端和计数器来创建服务器线程Socket socket;long count;/构造方法public ServerThread(Socket socket, long c)this.count = c;this.socket = socket;/重写run方法public void run()int timeCounter=0;try InputStream ins = socket.getInputStream();/获取套接字的输入流InputStreamReader isr = new InputStreamReader(ins);/封装输入流BufferedReader br = new BufferedReader(isr);/封装输入流OutputStream os = socket.getOutputStream();/获取套接字的输入流PrintStream pw = new PrintStream(os);/封装输出流while (true) timeCounter+;/声明用来计数的变量String str = br.readLine();/定义字符串为读取br的值if(str.equals(exit)/如果客户端输入的是“exit”,则关闭客户端pw.println(exit);pw.flush();socket.close();break;/告知客户端是第几次转换,有几个客户端,并输出转换的字符串pw.println(这是 + socket.toString() + 第+timeCounter+次发送转换请求,现在有+count+个客户在线,转换后的字符串为+ str.toUpperCase();pw.flush(); catch (IOException e) e.printStackTrace();客户端程序:import java.io.*;import .Socket;/客户端程序public class TcpClientpublic static void main(String args)try Socket socket = new Socket(, 8888);/创建套接字,传入IP和端口boolean flag=true;/定义布尔型变量OutputStream os = socket.getOutputStream();/返回套接字输出流PrintStream ps = new PrintStream(os);/封装输出流InputStream ins = socket.getInputStream();/返回套接字输入流InputStreamReader isr = new InputStreamReader(ins);/封装输入流BufferedReader br = new BufferedReader(isr);/封装输入流String str = null;/定义字符串/获取输入的字符串BufferedReader kbr = new BufferedReader(new InputStreamReader(System.in);while (flag) /提示用户输入小写字母,服务器将转换成大写System.out.println(请输入您要转换的小写字母,服务器将为您转换成大写字母);System.out.print(请输入:);String inputString = kbr.readLine();/定义获取的字符串ps.println(inputString);/写到服务器端if (str = br.readLine() != null) /读取数据if (str.equals(exit)/如果输入exit,退出循环flag=false;System.out.println(服务器返回转换信息:+str);socket.close();/关闭客户端 catch (Exception e) e.printStackTrace();本程序操作方法:开始、运行、CMD、cd到工作目录,打start,产生二个DOS命令操作界面,分别在二个界面中编译与执行服务器端程序和客户端程序。在客户端输入小写字母等,将显示将其中小写字符变成大写字符的效果。三、UDP Socket编程UDP Socket的信息传输方式类似于发传真,发送端先准备好要发送的资料,打电话给接收端,接收端准备好纸张,回一个信号,再开始传真。数据报套接字(DatagramSocket)不需要创建两个Socket,不可以使用输入、输出流。import .*;/定义UDP接收端public class UDPServer public static void main(String args) byte bufferIn=new byte26;byte bufferOut;try /建立信箱,创建数据包套接字并绑定到13端口DatagramSocket ds=new DatagramSocket(13);System.out.println(UDP接收端启动,在13端口. );int num=0;while(num100)num+;/准备收件信封,接收长度为length的数据包DatagramPacket packetIn=new DatagramPacket(bufferIn,bufferIn.length);ds.receive(packetIn);/收信,接受数据报InetAddress ia=packetIn.getAddress();/通过信封得到发信人的地址和端口号int port=packetIn.getPort();/获取端口String str=new String(bufferIn);/获取字符串str=str.toUpperCase();/把字符串变成大写bufferOut=str.getBytes();/给输出数组赋值System.out.println(收到的第+num+封信,来源ip是+ia.toString()+,端口号为+port);/发信的信封DatagramPacket packetOut=new DatagramPacket(bufferOut,bufferOut.length,ia,port);ds.send(packetOut);/发信(回信)ds.close(); catch (Exception e) e.printStackTrace();客户端程序:import java.io.*;import .*;/定义UDP发送端public class UDPClient public static void main(String args) byte bufferOut=new byte26;byte bufferIn=new byte26;for(int i=0;i 0) /* * 收到用户退出的系统信息,删除集合中对应项,通知所有用户 */if (msg.startsWith(SYSTEM_MSG + USER_LOGOUT) synchronized (lock) users.remove(this.username);sendAll(SYSTEM_MSG + DELETE_USER + this.username);s.close();System.out.print(rOnline: + -online + );/* * 收到聊天信息,解析出发送对象和信息内容,并发送 */else touser = msg.substring(0, msg.indexOf(NAME_END);msg = msg.replaceFirst(touser + NAME_END, );send(msg, touser);/* * 登陆时出现用户名已存在情况,通知用户 */catch (ExistException e) out.println(SYSTEM_MSG + USER_EXIST);out.flush(); catch (Exception e) finally try s.close(); catch (Exception e) /* * 发送信息给所有用户 */2、private void sendAll(String msg) Set s = users.keySet();Iterator it = s.iterator();while (it.hasNext() UserThread t = (UserThread) users.get(it.next();if (t != this)t.sendUser(msg);/* * 给本线程发送在线用户列表 */private void listAll() Set s = users.keySet();Iterator it = s.iterator();while (it.hasNext() this.sendUser(SYSTEM_MSG + EXIST_USERS + it.next();/* * 判断用户名是否已经有人使用 */private boolean isExist(String name) Set s = users.keySet();Iterator it = s.iterator();while (it.hasNext() if (name.equals(String) it.next() return true;return false;/* * 给本线程对应的用户发信息 */private void sendUser(String msg) out.println(msg);out.flush();/ System.out.println(to + this.username + : + msg);/ 调试用代码/* * 给指定对象发送信息 */private void send(String msg, String touser) /* * 调用相应函数,给所有人发信息时 */if (touser.equals(All) sendAll(this.username + NAME_END + msg);return;/* * 根据发送目标的名字获得相应线程,调用目标线程的函数给目标发送信息 */if (users.containsKey(touser)/ 加判断,防止用户已经离线(UserThread) users.get(touser).sendUser(MSG_FROM+ this.username + NAME_END + msg);/* * 主方法:启动服务器 */public static void main(String args) /* * 根据参数的情况,获得端口号,无效时使用默认值,并返回相应信息 */int port = DEFAULT_PORT;if (args.length 0) int newport;try newport = Integer.parseInt(args0);/* * 无效端口 */if (newport 65535 | newport 0) System.out.println(The port + newport + is invalid.);/* * 操作系统预留端口 */else if (newport = 1024) System.out.println(The port 01024 is not allowed.); else port = newport;/* * 不能转换成整数的参数 */catch (NumberFormatException e) System.out.println(Invalid port number!);try ServerSocket ss = new ServerSocket(port);System.out.print(Server is running.nPort: + port + nOnline:0);while (true) Socket s = ss.accept();Thread t = new UserThread(s);t.start();/* * 端口绑定失败 */catch (IOException e) System.out.println(Failed to bind + port + port.);3、客户端代码:/聊天室客户端public class Client /主方法:启动登
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年兽医防疫员考试题及答案
- 2025年英语中考试卷及答案
- 含铝废渣综合利用项目技术方案
- xx市供热管网改造工程节能评估报告
- 学生思想工作总结4篇
- 智算中心硬件选型与部署方案
- 2025年人教版七级下册数学期末考试卷及答案
- 高新技术园区物业让与担保与孵化服务合同
- 长江沿线城市污水管网整治工程建设工程方案
- 大宗固废综合利用技术与环境监控系统
- 2021人工智能训练师职业技能标准(职业编码:4-04-05-05)
- 第二十章-颅内和椎管内血管性疾病
- 消防救援队伍作战训练安全行动手册
- 质保金支付申请表
- 苏科版一年级上册《心理健康教育》全一册全部教案(共9课)
- 建筑工程质量安全检查记录表
- 35kV变电站施工组织设计资料
- 保障农民工工资支付协调机制和工资预防机制
- 聚焦于人:人力资源领先战略
- ISO50001内部审核检查表
- DB31∕T 1191-2019 绿化土壤肥力质量综合评价方法
评论
0/150
提交评论