您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > linux/Unix相关 > 清华大学张思民Java课件第9章
Java语言程序设计第9章网络通信主讲:张思民清华大学主要内容1、网络编程基础2、基于TCP网络程序设计3、基于UDP网络程序设计4、*基于C/S模式的分布计算一、Java与网络IP协议、TCP协议和UDP协议。1、网络数据通信的几个重要协议源IP地址目的IP地址IP数据报结构传输层数据报文结构:TCP传输层数据报结构:UDP报文2、端口号端口号:TCP/IP协议为每种服务定义了一个端口。服务端口号ftp21http80pop311083、套接字SocketSocket是网络程序中最常用的方式,用于建立两个不同程序之间通过网络进行通信的信道。2、套接字Socket什么是socket?网络服务Mailftpfinger20telnet数据结构I/O缓冲区端口2123客户程序SocketIP,port套接字是IP与端口的组合,可以分辨在internet上运行的程序进程与进程之间建立起连接建立套接字Socket在客户端使用socket类,指定服务器IP和端口号,以便连到服务器上:Socket(host_IP,prot);在服务器端使用ServerSocket类,以等待客户端的连接:ServerSocket(port);客户端呼叫服务器等待12Socket主要方法:在客户端:建立socket连接后,还应该建立输入输出数据流。getInputStream()获得输入流getOutputStream()获得输出流在服务器端:ServerSocket类的accept()方法使服务器处于阻塞状态,等待用户请求。ClientSocket(host,port#)AttempttheconnectionOutputStreamInputStreamCloseSocket二、TCP协议Socket编程ServerServerSocket(port#)ServerSocket.accept()Socket()OutputStreamInputStreamCloseSocket例1:演示服务器与客户之间的交互,服务器等待,客户访问,相互通一次信息。客户端向服务器发出信息:“你好”,服务器接收到信息后,给出回应:“你好,我是服务器。”21.5Socket.21.5Socket创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流读客户端信息向用户发出确认字符串创建Socket实例定义数据成员建立socket流读socket流(接收并显示)送用户名给服务器关闭流waitingforuser4331connetctingclient...提示用户登录成功读socket流16客户机端importjava.io.*;importjava.net.*;classC{publicstaticvoidmain(String[]args){try{Socketsocket=newSocket(127.0.0.1,6565);DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.writeUTF(我是客户机);DataInputStreamin=newDataInputStream(socket.getInputStream());Strings=in.readUTF();System.out.println(客户机收到:+s);}catch(Exceptione){}}}17服务器端importjava.io.*;importjava.net.*;classS{publicstaticvoidmain(String[]args){try{ServerSockets_socket=newServerSocket(6565);Socketsocket=s_socket.accept();DataInputStreamin=newDataInputStream(socket.getInputStream());Strings=in.readUTF();System.out.println(服务器收到:+s);DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.writeUTF(我是服务器);}catch(Exceptione){}}}21.5Socket显示服务器与客户机间的通信(服务器端)DataOutputStreamout=null;DataInputStreamin=null;ServerSockets_socket=null;Socketc_socket=null;Strings;//存放读取到的信息try{s_socket=newServerSocket(4331);}catch(IOExceptione){}try{c_socket=s_socket.accept();……}catch(IOExceptione){}创建服务器(端口号)定义数据成员服务器等待网络连接用循环语句收发信息(见下页)in=newDataInPutStream(clientSocket.getInputStream());out=newDataOutputStream(clientSocket.getOutputStream());创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流等待客户登录out.writeUTF(“这里是服务器);clientSocket.close();While(true){s=in.readUTF();if(s!=null)break;}读客户端信息创建Socket实例DataOutputStreamout=null;DataInputStreamin=null;Stringstring;Socketsocket=null;定义数据成员try{socket=newSocket(127.0.0.1,4331);input=newDataInputStream(socket.getInputStream());output=newPrintStream(socket.getOutputStream());建立socket流catch(IOExceptione){System.out.println(“无法连接”);}Out.writeUTF(“你好”);System.out.println(input.readLine());创建Socket实例定义数据成员建立socket流读socket流(看到提示)从键盘上读送用户名送给服务器端关闭流mysocket.close();System.out.println(“s);读服务器反馈While(true){s=in.readUTF();if(s!=null)break;}考虑多用户第一种解决方案:一台计算机上一次启动多个服务器程序,只是端口号不同。myserver--------myclient----f21.batmyserver2--------myclient2----f9.batServer1(1111)client(2222)Server2(2222)client(1111)多用户的第二种方案(支持多客户)Serverclient1client2serverthreadserverthread将服务器写成多线程的,不同的线程为不同的客户服务.main()只负责循环等待线程负责网络连接,接收客户输入的信息客户1客户2服务器线程run()线程1()线程2()下面简单分析教材P276例4client()Run()Out.writeUTF()In.readUTF()客户端writer.start()按钮事件()socketgetInputStreamgetOutputStream服务器服务器端.服务器(4321)acceptsocket客户IPclient1线程客户IPclient2线程服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的.ServerSocket.accept()等待用户连接,一旦连接上,则调用服务程序.服务程序的主要内容是网络的读写,多客户的原因,网络读写的功能用多线程实现,因此将此部分功能单独分离出来,构成线程类服务器端client1client2serviceRequestserverServerSocketSocketgetOutputStreamgetInputStreamreader.runreader.runaccept()reader.start()read_net_inputwrite_net_output()在Java中,网络类都在java.net类库中。用来存储internet地址的类InetAddress.其主要方法:getHostName()获取InetAddress对象的主机名或域名getHostAddress()获取InetAddress对象的IP地址getLocalHost()获取本机的IP地址例:获取本机的IP地址importjava.net.*;publicclassgetLocalHostTest{publicstaticvoidmain(Stringargs[]){InetAddressmyIP=null;try{myIP=InetAddress.getLocalHost();}catch(UnknownHostExceptione){}System.out.println(myIP);}}创建inetAddress类不用构造函数(不用new)Java与网络下面的例子演示java如何根据域名自动到DNS上查找IP地址(与DNS服务器的连接减至一行)importjava.net.*;publicclassgetIP{publicstaticvoidmain(Stringargs[]){InetAddresspku=null;try{pku=InetAddress.getByName(“”);}catch(UnknownHostExceptione){}System.out.println(pku);}}三、基于数据报DatagramTCP/IP传输层由两个并列的协议:TCP,UDP.UDP数据报的每个数据包要包含目的地址和端口号.socketserverclientDatagram数据报serverclient在UDP中,要使用二个类:(1)DatagramSocket类发送时,用send()方法发送数据;接收时,用receive()方法接收数据。(2)DatagramPacket类用于打包或拆包发送时打包:包由数据、接收地址、端口号组成;接收时拆包:取出包中的数据、接收地址、端口号。Datagram工作过程建立数据报socket();建立一个报文包packet等待请求报文建立数据报socket建立一个请求包发出请求获得对方地址构成信息包发送出去创建接收包等待接收Datagram一、服务器端发出报文的步骤如下:1.定义数据成员DatagramSocketsocket;DatagramPacketpacket;InetAddressaddress;(用来存放接收方的地址)intport;;(用来存放接收方的端口号)2.创建数据报文Socket对象try{socket=newDatagramSocket(1111);}catch(java.net.SocketExceptione){}socket绑定到一个本地的可用端口,等待接收客户的请求.Datagram3.分配并填写数据缓冲区(一个字节类型的数组)byte[]Buf=newbyte[256];存放从客户端接收的请求信息.4.创建一个DatagramPacketpacket=newDatagramPacket(Bu
本文标题:清华大学张思民Java课件第9章
链接地址:https://www.777doc.com/doc-7028386 .html