Java程序设计基础与实践课件第12章_第1页
Java程序设计基础与实践课件第12章_第2页
Java程序设计基础与实践课件第12章_第3页
Java程序设计基础与实践课件第12章_第4页
Java程序设计基础与实践课件第12章_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

第12章网络编程TCP和UDP的概念基于TCP协议的网络编程方法基于UDP协议的网络编程方法InetAddress类和URL类12.1.1TCP和UDP⑴TCP

TCP的全称为TransmissionControlProtocol,称为网络传输控制协议,主要负责数据的分组和重组,它与IP协议组合,称为TCP/IP。⑵UDP

UDP的全称为UserDatagramProtocol,称为用户数据报协议,和TCP不同,UDP是一种非持续连接的通信协议,它不能保证数据能够正确抵达目标,而且多个数据包抵达目标的顺序可能与发送时的顺序不同。12.1.2InetAddress类

IP地址是每个计算机在网络中的唯一标识,要想进行网路通信,必须获得正确的IP地址。Java提供了IP地址的封装类InetAddress。方法说明getByName(Strings)获取指定主机的IP地址getLocalhost()返回本地主机的InetAddress对象getHostName()获取此主机名getHostAddress()获取此主机IP地址isReachable(inttimeout)在timeout指定的毫秒时间内,测试IP地址是否可达表12.1InetAddress类常用方法例如:获取域名为“”的网络IP地址等信息。import.*;publicclassTest{ publicstaticvoidmain(String[]args){ try{//使用InetAddress类要进行异常处理

InetAddressaddress=InetAddress.getByName(""); StringdomainName=address.getHostName(); StringipName=address.getHostAddress(); InetAddressmine=address.getLocalHost(); System.out.println(domainName); System.out.println(ipName); System.out.println(mine.toString()); } catch(UnknownHostExceptione){e.printStackTrace();}}}12.1.3基于TCP协议的网络编程⑴创建服务器端套接字服务器端套接字是ServerSocket类的实例对象,用于实现服务器程序,ServerSocket类监视指定的端口,并建立客户端到服务器端套接字的连接,也就是负责客户端的呼叫任务。 例如:

try{ ServerSocketss=newServerSocket(1880); }catch(IOExceptione){}⑵创建客户端套接字 客户端端套接字是Socket类的实例对象,用于实现客户端程序。⑶服务器端接受客户端请求 在服务器端利用其accept()方法接收客户端的套接字连接请求。 例如,上面创建的服务器端套接字ss接受客户端请求,代码如下:

try{ mysocket=ss.accept(); }catch(IOExceptione){}⑷客户端发送和接收服务器

Socket类提供了getInputStream()方法和getOutStream()方法来接收和发送数据。例如:一个简单的聊天室客户端程序:importjava.io.*;import.*;publicclassStudent{//学生类

publicstaticvoidmain(Stringargs[]){try{Socketsocket=newSocket("",4700);//向本机的4700端口发出客户请求

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象

PrintWriteros=newPrintWriter(socket.getOutputStream());//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象

Stringreadline;readline=sin.readLine();//从系统标准输入读入一字符串

while(!readline.equals("bye")){//若从标准输入读入的字符串为"bye"则停止循环

os.println(readline);//将从系统标准输入读入的字符串输出到Serveros.flush();//刷新输出流,使Server马上收到该字符串

System.out.println("学生:"+readline);//在系统标准输出上打印读入的字符串

System.out.println("老师:"+is.readLine());//从Server读入一字符串,并打印到标准输出上

readline=sin.readLine();//从系统标准输入读入一字符串

}//继续循环

os.close();//关闭Socket输出流

is.close();//关闭Socket输入流

socket.close();//关闭Socket}catch(Exceptione){System.out.println("Error"+e);//出错,则打印出错信息

}}}服务器端程序:importjava.io.*;import.*;publicclassTeacher{//老师类

publicstaticvoidmain(Stringargs[]){try{ServerSocketserver=null;try{server=newServerSocket(4700);//创建一个ServerSocket在端口4700监听客户请求

}catch(Exceptione){System.out.println("cannotlistento:"+e);//出错,打印出错信息

}Socketsocket=null;try{socket=server.accept();//使用accept()阻塞等待客户请求,有客户

//请求到来则产生一个Socket对象,并继续执行

}catch(Exceptione){System.out.println("Error."+e);//出错,打印出错信息

}Stringline;BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriteros=newPrintWriter(socket.getOutputStream());//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象

System.out.println("学生:"+is.readLine());//在标准输出上打印从客户端读入的字符串

line=sin.readLine();//从标准输入读入一字符串

while(!line.equals("bye")){//如果该字符串为"bye",则停止循环

os.println(line);//向客户端输出该字符串

os.flush();//刷新输出流,使Client马上收到该字符串

System.out.println("老师:"+line);//在系统标准输出上打印读入的字符串

System.out.println("学生:"+is.readLine());//从Client读入一字符串,并打印到标准输出上

line=sin.readLine();//从系统标准输入读入一字符串

}//继续循环

os.close();//关闭Socket输出流

is.close();//关闭Socket输入流

socket.close();//关闭Socketserver.close();//关闭ServerSocket}catch(Exceptione){System.out.println("Error:"+e);//出错,打印出错信息

}}}⑸多客户的Client/Server程序设计为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。例如:多线程实现Socket套接字的示例。客户端端程序:import.*;importjava.io.*;publicclassStudent1{publicstaticvoidmain(String[]args)throwsException{Socketserver=newSocket("localhost",4700);//向本机的4700端口发出客户请求

BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriterout=newPrintWriter(server.getOutputStream());//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象

while(true){Stringstr=br.readLine();//从系统标准输入读入一字符串

out.println(str);//将从系统标准输入读入的字符串输出到Serverout.flush();//刷新输出流,使Server马上收到该字符串

if(str.equals("bye")){//若从标准输入读入的字符串为"bye"则停止循环

break;}System.out.println(in.readLine());//从Server读入一字符串,并打印到标准输出上

}server.close();//关闭Socket}}服务器端程序:import.*;importjava.io.*;publicclassTeacherextendsThread{//多线程

privateSocketsocket;publicTeacher(Socketsocket){this.socket=socket;}publicvoidrun(){//线程主体

try{BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriterout=newPrintWriter(socket.getOutputStream());//由Socket对象得到输出流,并构造PrintWriter对象

while(true){Stringstr=in.readLine();System.out.println("学生说:"+str);//在标准输出上打印从客户端读入的字符串

out.println("学生:"+str);//向客户端输出该字符串

out.flush();//刷新输出流,使Client马上收到该字符串

if(str.equals("bye"))break;}}catch(IOExceptione){System.out.println(e.getMessage());//出错,打印出错信息

}}publicstaticvoidmain(String[]args)throwsIOException{ServerSocketserver=newServerSocket(4700);//创建一个ServerSocket在端口4700监听客户请求

while(true){Sockets=server.accept();//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行

newTeacher(s).start();}}}12.1.4基于UDP协议的网络编程⑴DatagramPacket类

DatagramPacket类是UDP所传递的数据包,即打包数据。⑵DatagramSocket类

DatagramSocket类是用于发送和接收数据的数据包套接字。例如:DatagramSocketreceivedata=newDatagramSocket(7312);bytedata[]=newbyte[100];intlength=60;DatagramPacketdata_pack=newDatagramPacket(data,length);receivedata.receive(data_pack);同学A:import.*;importjava.io.*;classStudentAextendsThread{//实现多线程

DatagramPacketpack=null; bytedata[]=newbyte[8192]; publicvoidrun(){//数据接收

DatagramSocketrecieve_data=null;try{recieve_data=newDatagramSocket(666);//接收端口666 pack=newDatagramPacket(data,data.length);

}catch(Exceptione){}while(true){if(recieve_data==null)break;else{try{recieve_data.receive(pack);//接收数据报packintlength=pack.getLength();Stringmessage=newString(pack.getData(),0,length);//将数据报转换为字符串

System.out.println("接收到StudentB的数据:"+message);//将字符串通过标准输出打印在控制台上

}catch(Exceptione){}}}}publicstaticvoidmain(Stringargs[])throwsException{ StudentAs=newStudentA(); s.start(); BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象

while(true){ Stringstr=br.readLine();//从系统标准输入读入一字符串

bytebuffer[]=str.getBytes(); InetAddressaddress=InetAddress.getByName("localhost"); DatagramPacketdata_pack=newDatagramPacket(buffer,buffer.length,address,888);

//将数据发送到本机888端口

DatagramSocketsent_data=newDatagramSocket(); sent_data.send(data_pack);//发送数据报

} }}同学B:import.*;importjava.io.*;classStudentBextendsThread{//实现多线程

DatagramPacketpack=null; bytedata[]=newbyte[8192]; publicvoidrun(){//数据接收

DatagramSocketrecieve_data=null;try{recieve_data=newDatagramSocket(888);//接收端口888 pack=newDatagramPacket(data,data.length);}catch(Exceptione){}while(true){if(recieve_data==null)break;else{try{recieve_data.receive(pack);//接收数据报packintlength=pack.getLength();Stringmessage=newString(pack.getData(),0,length);//将数据报转换为字符串

System.out.println("接收到StudentA的数据:"+message);//将字符串通过标准输出打印在控制台上

}

温馨提示

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

评论

0/150

提交评论