《Java程序设计基础与实践 第12章 网络编程.ppt》由会员分享,可在线阅读,更多相关《Java程序设计基础与实践 第12章 网络编程.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第12章 网络编程TCP和UDP的概念基于TCP协议的网络编程方法基于UDP协议的网络编程方法InetAddress类和URL类12.1.1 TCP和UDP TCP TCP的全称为Transmission Control Protocol,称为网络传输控制协议,主要负责数据的分组和重组,它与IP协议组合,称为TCP/IP。UDP UDP的全称为User Datagram Protocol,称为用户数据报协议,和TCP不同,UDP是一种非持续连接的通信协议,它不能保证数据能够正确抵达目标,而且多个数据包抵达目标的顺序可能与发送时的顺序不同。12.1.2 InetAddress类 IP地址是每个计
2、算机在网络中的唯一标识,要想进行网路通信,必须获得正确的IP地址。Java提供了IP地址的封装类InetAddress。方法方法说明说明getByName(String s)获取指定主机的获取指定主机的IP地址地址getLocalhost()返回本地主机的返回本地主机的InetAddress对象对象getHostName()getHostName()获取此主机名获取此主机名getHostAddress()getHostAddress()获取此主机获取此主机IP地址地址isReachable(int isReachable(int timeout)timeout)在在timeout指定的毫秒时间
3、内,测试指定的毫秒时间内,测试IP地址是地址是否可达否可达表表12.1 InetAddress类常用方法类常用方法例如:获取域名为例如:获取域名为“”的网络的网络IP地址等信息。地址等信息。import .*;public class Test public static void main(String args)try/try/使用使用InetAddress类要进行异常处理类要进行异常处理InetAddress address=InetAddress.getByName();String domainName=address.getHostName();String ipName=addr
4、ess.getHostAddress();InetAddress mine=address.getLocalHost();System.out.println(domainName);System.out.println(ipName);System.out.println(mine.toString();catch(UnknownHostException e)e.printStackTrace();12.1.3 基于TCP协议的网络编程 创建服务器端套接字 服务器端套接字是ServerSocket类的实例对象,用于实现服务器程序,ServerSocket类监视指定的端口,并建立客户端到服务
5、器端套接字的连接,也就是负责客户端的呼叫任务。例如:tryServerSocket ss=new ServerSocket(1880);catch(IOException e)创建客户端套接字客户端端套接字是Socket类的实例对象,用于实现客户端程序。服务器端接受客户端请求在服务器端利用其accept()方法接收客户端的套接字连接请求。例如,上面创建的服务器端套接字ss接受客户端请求,代码如下:trymysocket=ss.accept();catch(IOException e)客户端发送和接收服务器 Socket类提供了getInputStream()方法和getOutStream()方
6、法来接收和发送数据。例如:一个简单的聊天室例如:一个简单的聊天室客户端程序客户端程序:import java.io.*;import .*;public class Student /public class Student /学生类学生类 public static void main(String args)try Socket socket=new Socket(127.0.0.1,4700);/向本机的向本机的4700端口发出客户请求端口发出客户请求 BufferedReader sin=new BufferedReader(new InputStreamReader(System.i
7、n);/由系统标准输入设备构造由系统标准输入设备构造BufferedReader对象对象 PrintWriter os=new PrintWriter(socket.getOutputStream();/由由Socket对象得到输出流,并构造对象得到输出流,并构造PrintWriter对象对象 BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();/由由Socket对象得到输入流,并构造相应的对象得到输入流,并构造相应的BufferedReader对象对象 String readli
8、ne;readline=sin.readLine();/readline=sin.readLine();/从系统标准输入读入一字符串从系统标准输入读入一字符串 while(!readline.equals(bye)/若从标准输入读入的字符串为若从标准输入读入的字符串为 bye则停止循环则停止循环 os.println(readline);/将从系统标准输入读入的字符串输出到将从系统标准输入读入的字符串输出到Server os.flush();/刷新输出流,使刷新输出流,使Server马上收到该字符串马上收到该字符串 System.out.println(System.out.println(学
9、生学生:+readline);/在系统标准输出上打印读入的字符串在系统标准输出上打印读入的字符串 System.out.println(System.out.println(老师老师:+is.readLine();/从从Server读入一字符串,并打印到标准输出上读入一字符串,并打印到标准输出上 readline=sin.readLine();/readline=sin.readLine();/从系统标准输入读入一字符串从系统标准输入读入一字符串 /继续循环继续循环 os.close();/os.close();/关闭关闭Socket输出流输出流 is.close();/is.close();
10、/关闭关闭Socket输入流输入流 socket.close();/socket.close();/关闭关闭Socket catch(Exception e)System.out.println(Error+e);/System.out.println(Error+e);/出错,则打印出错信息出错,则打印出错信息 服务器端程序服务器端程序:import java.io.*;import .*;public class Teacher/public class Teacher/老师类老师类 public static void main(String args)try ServerSocket
11、server=null;try server=new ServerSocket(4700);/创建一个创建一个ServerSocket在端口在端口4700监听客户请求监听客户请求 catch(Exception e)System.out.println(can not listen to:+e);/出错,打印出错信息出错,打印出错信息 Socket socket=null;try socket=server.accept();/使用使用accept()阻塞等待客户请求,有客户阻塞等待客户请求,有客户 /请求到来则产生一个请求到来则产生一个Socket对象,并继续执行对象,并继续执行 catch
12、(Exception e)System.out.println(Error.+e);/出错,打印出错信息出错,打印出错信息 String line;BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();/由由Socket对象得到输入流,并构造相应的对象得到输入流,并构造相应的BufferedReader对象对象 PrintWriter os=new PrintWriter(socket.getOutputStream();/由由Socket对象得到输出流,并构造对象得到输出流,并构造
13、PrintWriter对象对象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in);/由系统标准输入设备构造由系统标准输入设备构造BufferedReader对象对象 System.out.println(System.out.println(学生学生:+is.readLine();/在标准输出上打印从客户端读入的字符串在标准输出上打印从客户端读入的字符串 line=sin.readLine();/从标准输入读入一字符串从标准输入读入一字符串 while(!line.equals(bye)/如果该字符串为
14、如果该字符串为 bye,则停止循环,则停止循环 os.println(line);/向客户端输出该字符串向客户端输出该字符串 os.flush();/刷新输出流,使刷新输出流,使Client马上收到该字符串马上收到该字符串 System.out.println(System.out.println(老师老师:+line);/在系统标准输出上打印读入的字符串在系统标准输出上打印读入的字符串 System.out.println(System.out.println(学生学生:+is.readLine();/从从Client读入一字符串,并打印到标准输出上读入一字符串,并打印到标准输出上 line
15、=sin.readLine();/从系统标准输入读入一字符串从系统标准输入读入一字符串 /继续循环继续循环 os.close();/os.close();/关闭关闭Socket输出流输出流 is.close();/is.close();/关闭关闭Socket输入流输入流 socket.close();/socket.close();/关闭关闭Socket server.close();/server.close();/关闭关闭ServerSocket catch(Exception e)System.out.println(Error:+e);/出错,打印出错信息出错,打印出错信息 多客户的C
16、lient/Server程序设计 为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。例如:多线程实现例如:多线程实现Socket套接字的示例。套接字的示例。客户端客户端端程序端程序:import .*;import java.io.*;public class Student1 public static void main(String args)throws Exception Socket server=new Socket(localhost,4700);/向本机的向本机的4700端口发出客户请求端口发出客户请求 BufferedReade
17、r in=new BufferedReader(new InputStreamReader(server.getInputStream();/由由Socket对象得到输入流,并构造相应的对象得到输入流,并构造相应的BufferedReader对象对象 PrintWriter out=new PrintWriter(server.getOutputStream();/由由Socket对象得到输出流,并构造对象得到输出流,并构造PrintWriter对象对象 BufferedReader br=new BufferedReader(new InputStreamReader(System.in);
18、/由系统标准输入设备构造由系统标准输入设备构造BufferedReader对象对象 while(true)String str=br.readLine();/从系统标准输入读入一字符串从系统标准输入读入一字符串 out.println(str);/将从系统标准输入读入的字符串输出到将从系统标准输入读入的字符串输出到Server out.flush();/刷新输出流,使刷新输出流,使Server马上收到该字符串马上收到该字符串 if(str.equals(bye)/若从标准输入读入的字符串为若从标准输入读入的字符串为 bye则停止循环则停止循环 break;System.out.println(
19、in.readLine();/从从Server读入一字符串,并打印到标准输出上读入一字符串,并打印到标准输出上 server.close();/关闭关闭Socket 服务器端程序服务器端程序:import .*;import java.io.*;public class Teacher extends Thread /public class Teacher extends Thread /多线程多线程 private Socket socket;public Teacher(Socket socket)this.socket=socket;public void run()/public v
20、oid run()/线程主体线程主体 try BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream();/由由Socket对象得到输入流,并构造相应的对象得到输入流,并构造相应的BufferedReader对象对象 PrintWriter out=new PrintWriter(socket.getOutputStream();/由由Socket对象得到输出流,并构造对象得到输出流,并构造PrintWriter对象对象 while(true)String str=in.readLine(
21、);System.out.println(System.out.println(学生说:学生说:+str);/在标准输出上打印从客户端读入的字符串在标准输出上打印从客户端读入的字符串 out.println(out.println(学生学生:+str);/向客户端输出该字符串向客户端输出该字符串 out.flush();/刷新输出流,使刷新输出流,使Client马上收到该字符串马上收到该字符串 if(str.equals(bye)break;catch(IOException e)System.out.println(e.getMessage();/出错,打印出错信息出错,打印出错信息 pub
22、lic static void main(String args)throws IOException ServerSocket server=new ServerSocket(4700);/创建一个创建一个ServerSocket在端口在端口4700监听客户请求监听客户请求 while(true)Socket s=server.accept();/使用使用accept()阻塞等待客户请求,有客户请求到来则产生一个阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行对象,并继续执行 new Teacher(s).start();12.1.4 基于UDP协议的网络编程 Data
23、gramPacket类 DatagramPacket类是UDP所传递的数据包,即打包数据。DatagramSocket类 DatagramSocket类是用于发送和接收数据的数据包套接字。例如:例如:DatagramSocket receivedata=new DatagramSocket(7312);byte data=new byte100;int length=60;DatagramPacket data_pack=new DatagramPacket(data,length);receivedata.receive(data_pack);同学同学A:import .*;import j
24、ava.io.*;class StudentA extends Thread /实现多线程实现多线程DatagramPacket pack=null;byte data=new byte8192;public void run()/数据接收数据接收DatagramSocket recieve_data=null;try recieve_data=new DatagramSocket(666);/接收端口接收端口666pack=new DatagramPacket(data,data.length);catch(Exception e)while(true)if(recieve_data=nul
25、l)break;else try recieve_data.receive(pack);/接收数据报接收数据报pack int length=pack.getLength();String message=new String(pack.getData(),0,length);/将数据报转换为字符串将数据报转换为字符串 System.out.println(System.out.println(接收到接收到StudentB的数据:的数据:+message);/将字符串通过将字符串通过标准输出打印在控制台上标准输出打印在控制台上 catch(Exception e)public static v
26、oid main(String args)throws ExceptionStudentA s=new StudentA();s.start();BufferedReader br=new BufferedReader(new InputStreamReader(System.in);/由系统标准输入设备构造由系统标准输入设备构造BufferedReader对象对象while(true)String str=br.readLine();/从系统标准输入读入一字符串从系统标准输入读入一字符串byte buffer=str.getBytes();InetAddress address=InetAd
27、dress.getByName(localhost);DatagramPacket data_pack=new DatagramPacket(buffer,buffer.length,address,888);/将数据发送到本机将数据发送到本机888端口端口DatagramSocket sent_data=new DatagramSocket();sent_data.send(data_pack);/发送数据报发送数据报同学同学B:import .*;import java.io.*;class StudentB extends Thread /实现多线程实现多线程DatagramPacket
28、 pack=null;byte data=new byte8192;public void run()/数据接收数据接收DatagramSocket recieve_data=null;try recieve_data=new DatagramSocket(888);/接收端口接收端口888pack=new DatagramPacket(data,data.length);catch(Exception e)while(true)if(recieve_data=null)break;else try recieve_data.receive(pack);/接收数据报接收数据报pack int
29、length=pack.getLength();String message=new String(pack.getData(),0,length);/将数据报转换为字符串将数据报转换为字符串 System.out.println(System.out.println(接收到接收到StudentA的数据:的数据:+message);/将字符串通过标准输出打印在控制台上将字符串通过标准输出打印在控制台上 catch(Exception e)public static void main(String args)throws ExceptionStudentB s=new StudentB();s
30、.start();BufferedReader br=new BufferedReader(new InputStreamReader(System.in);/由系统标准输入设备构造由系统标准输入设备构造BufferedReader对象对象while(true)String str=br.readLine();/从系统标准输入读入一字符串从系统标准输入读入一字符串byte buffer=str.getBytes();InetAddress address=InetAddress.getByName(localhost);DatagramPacket data_pack=new Datagram
31、Packet(buffer,buffer.length,address,666);/将数据发送到本机将数据发送到本机666端口端口DatagramSocket sent_data=new DatagramSocket();sent_data.send(data_pack);/发送数据报发送数据报12.1.5 URL类 URL代表一个统一资源定位符,它是指向互联网“资源”的指针。简单的可以把URL理解为包含协议、主机名、端口、路径、查询字符串和参数等对象,每一段可以独立设置。例如:使用例如:使用URL下载网页的示例。下载网页的示例。import .*;import java.io.*;class Testpublic static void main(String args)throws IOExceptionInputStream in=null;try URL u=new URL(http:/ c=in.read();c!=-1;c=in.read()System.out.write(c);catch(MalformedURLException ex)ex.printStackTrace();finally if(in!=null)in.close();