《java局域网通信.docx》由会员分享,可在线阅读,更多相关《java局域网通信.docx(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java局域网通信java局域网通信大家知道java局域网通信吗?下面是学习啦我为你整理相关的内容,希望大家喜欢!一:首先看一下网络通讯的两种方式1.TCP(传输控制协议)方式TCP方式就类似于拨打,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,假如数据发送失败,则客户端会自动重发该数据2.UDP(用户数据报协议)方式UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,假如发送失败则客户端无法获得这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式
2、进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。由于TCP需要建立专用的虚拟连接以及确认传输能否正确,所以使用TCP方式的速度略微慢一些,而且传输时产生的数据量要比UDP略微大一些。总结一下UDP和TCP协议的区别-使用UDP时,每个数据报中都给出了完好的地址信息,因而无需要建立发送方和接收方的连接。对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。TCP没有这方面的限制,一旦连接建立起来,双方的socket就能够按统一的格式
3、传输大量的数据。UDP是一个不可靠的协议,发送方所发送的数据报并不一定以一样的次序到达接收方。TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据-TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。相比之下UDP操作简单,而且仅需要较少的监护,因而通常用于局域网高可靠性的分散系统中client/server应用程序二:基于url的网络编程1.创立一个URL为了表示URL,中实现了类URL。我们能够通过下面的构造方法来初始化一个URL对象:(1)publicURL(Stringspec);通过一个表示URL地址
4、的字符串能够构造一个URL对象URLurlBase=newURL(2)publicURL(URLcontext,Stringspec);通过基URL和相对URL构造一个URL对象。URLnet263=newURL(URLindex263=newURL(net263,index.)(3)publicURL(Stringprotocol,Stringhost,Stringfile);newURL(,gamelan,/pages/G.(4)publicURL(Stringprotocol,Stringhost,intport,Stringfile);URLgamelan=newURL(,gamela
5、n,80,Pages/Gwork.注意:类URL的构造方法都声明抛弃非运行时例外(MalformedURLException),因而生成URL对象时,我们必需要对这一例外进行处理,通常是用try-catch语句进行捕获。格式如下:tryURLmyURL=newURL()catch(MalformedURLExceptione)2.解析一个URL一个URL对象生成后,其属性是不能被改变的,但是我们能够通过类URL所提供的方法来获取这些属性:publicStringgetProtocol()获取该URL的协议名。publicStringgetHost()获取该URL的主机名。publicintge
6、tPort()获取该URL的端口号,假如没有设置端口,返回-1。publicStringgetFile()获取该URL的文件名。publicStringgetRef()获取该URL在文件中的相对位置。publicStringgetQuery()获取该URL的查询信息。publicStringgetPath()获取该URL的途径publicStringgetAuthority()获取该URL的权限信息publicStringgetUserInfo()获得使用者的信息publicStringgetRef()获得该URL的锚3.从URL读取WWW网络资源当我们得到一个URL对象后,就能够通过它读取指
7、定的WWW资源。这时我们将使用URL的方法openStream(),其定义为:InputStreamopenStream();方法openSteam()与指定的URL建立连接并返回InputStream类的对象以从这一连接中读取数据。URLurl=newURL(baidu/使用openStream得到一输入流并由此构造一个BufferedReader对象BufferedReaderbr=newBufferedReader(newInputStreamReader(url.openStream();Stringline=null;while(null!=(line=br.readLine()Sy
8、stem.out.println(line);br.close();三:客户端网络编程步骤根据前面的基础知识介绍,无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成1.客户端网络编程步骤客户端(Client)是指网络编程中首先发起连接的程序,客户端一般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,无论客户端复杂还是简单,以及客户端实现的方式,客户端的编程主要由三个步骤实现:1、建立网络连接客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会构成一条虚拟的连接,后续的操作就能够通过该连接实现数据交
9、换了。2、交换数据连接建立以后,就能够通过这个连接交换数据了。交换数据严格根据请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反应一个响应数据给客户端,假如客户端不发送请求则服务器端就不响应。根据逻辑需要,能够屡次交换数据,但是还是必须遵循请求响应模型。3、关闭网络连接在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。最基本的步骤一般都是这三个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,由于网络编程是比拟耗时的操作,所以一般开启专门的现场进行网络通讯。2.服务器端网络编程步骤服务器端(Server)是指在网络编程中被动等待连接的程序,服务
10、器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是:1、监听端口服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。2、获得连接当客户端连接到服务器端时,服务器端就能够获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。3、交换数据服务
11、器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来讲,就是先接收再发送,这个和客户端的数据交换数序不同。其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是能够屡次进行的。在数据交换完成以后,关闭和客户端的连接。4、关闭连接当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存能够释放出来,实现了连接的关闭。四:一个基础的网络类InetAddress类该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在
12、该类的内部。关于该类的使用,下面通过一个基础的代码示例演示该类的使用,代码如下:javaviewplaincopyprint?publicclassInetAddressDemopublicstaticvoidmain(Stringargs)try/使用域名创立对象InetAddressinet1=InetAddress.getByName(163System.out.println(inet1);/使用IP创立对象InetAddressinet2=InetAddress.getByName(127.0.0.1System.out.println(inet2);/获得本机地址对象InetAdd
13、ressinet3=InetAddress.getLocalHost();System.out.println(inet3);/获得对象中存储的域名Stringhost=inet3.getHostName();System.out.println(域名:+host);/获得对象中存储的IPStringip=inet3.getHostAddress();System.out.println(IP:+ip);catch(Exceptione)注:InetAddress类没有明显的构造函数。为生成一个InetAddress对象,必须运用一个可用的工厂方法。工厂方法(factorymethod)仅是一
14、个类中静态方法返回一个该类实例的约定。对于InetAddress,三个方法getLocalHost()、getByName()以及getAllByName()能够用来创立InetAddress的实例假如这些方法不能解析主机名,它们引发一个UnknownHostException异常。五:TCP编程在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以.Socket类代表客户端连接,以.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比拟高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就能够建立连接了。在客户端网络编程
15、中,首先需要建立连接,在JavaAPI中以.Socket类的对象代表网络连接客户端1)建立Socket连接Socketsocket2=newSocket(sohu,80);2)根据请求-响应模型进行网络数据交换在Java语言中,数据传输功能由JavaIO实现,也就是讲只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:OutputStreamos=socket1.getOutputStream();/获得输出流InputStreamis=socket1.getInputStream();/获得输入流这里获得的只是
16、最基本的输出流和输入流对象,还能够根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,进而方便数据的操作。3)关闭网络连接socket1.close();服务器端首先需要讲明的是,客户端的步骤和服务器端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。1)监听端口ServerSocketss=newServerSocket(10000);2)获得连接当有客户端连接到达时,建立一个和客户端连接对应的Socket连接对象,进而释放客户端连接对于服务器端端口的占用Socketsocket=ss.accept();该代码实现的功能是获得当前连接到服务器
17、端的客户端连接。需要讲明的是accept和前面IO部分介绍的read方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就能够通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又能够继续接受其它的连接了。3)根据请求-响应模型进行网络数据交换这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤恰好相反InputStreamis=ss.getInputSt
18、ream();/获得输入流OutputStreamos=ss.getOutputStream();/获得输出流4)关闭服务器端连接ss.close();以上就是基本的TCP类型的服务器和客户端代码实现的步骤,下面以一个简单的echo(回声)服务实现为例子,介绍综合使用示例,实现的代码如下:javaviewplaincopyprint?publicclassConstantspublicstaticvoidmain(Stringargs)ServerSocketserverSocket=null;Socketsocket=null;OutputStreamos=null;InputStreami
19、s=null;/监听端口号intport=10000;try/建立连接serverSocket=newServerSocket(port);/获得连接socket=serverSocket.accept();/接收客户端发送内容is=socket.getInputStream();byteb=newbyte1024;intn=is.read(b);/输出System.out.println(客户端发送内容为:+newString(b,0,n);/向客户端发送反应内容os=socket.getOutputStream();os.write(b,0,n);catch(Exceptione)e.pr
20、intStackTrace();finallytry/关闭流和连接os.close();is.close();socket.close();serverSocket.close();catch(Exceptione)UDP编程UDP(UserDatagramProtocol),中文意思是用户数据报协议使用该种方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对于服务器的压力要比TCP小很多,所以也是一种常见的网络编程方式。但是使用该种方式最大的缺乏是传输不可靠,当然也不是讲经常丢失,就像大家发短信息一样,理论上存在收不到的可能在JavaAPI中,实现UDP方式的编程,包含客户端网络编程和
21、服务器端网络编程,主要由两个类实现,分别是:lDatagramSocketDatagramSocket类实现网络连接,包括客户端网络连接和服务器端网络连接。固然UDP方式的网络通讯不需要建立专用的网络连接,但是毕竟还是需要发送和接收数据,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既能够用于实现客户端连接,可以以用于实现服务器端连接。lDatagramPacketDatagramPacket类实现对于网络中传输的数据封装,也就是讲,该类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收
22、的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。其实DatagramPacket类的作用类似于现实中的信件,在信件中包含信件发送到的地址以及接收人,还有发送的内容等,邮局只需要根据地址传递即可。在接收数据时,接收到的数据也必须被处理成DatagramPacket类型的对象,在该对象中包含发送方的地址、端口号等信息,也包含数据的内容。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,构造也要比TCP方式的网络编程简单一些。UDP客户端编程涉及的步骤也是4个部分:建立连接、发送数据、接收数据和关闭
23、连接。1)建立连接:DatagramSocketds=newDatagramSocket();该客户端连接使用系统随机分配的一个本地计算机的未用端口号当然,能够通过制定连接使用的端口号来创立客户端连接。DatagramSocketds=newDatagramSocket(5000);一般在建立客户端连接时没有必要指定端口号码。2)发送数据在发送数据时,需要将需要发送的数据内容首先转换为byte数组,然后将数据内容、服务器IP和服务器端口号一起构造成一个DatagramPacket类型的对象,这样数据的准备就完成了了,发送时调用网络连接对象中的send方法发送该对象即可代码示例:javaview
24、plaincopyprint?Strings=HelloStringhost=127.0.0.1intport=10001;/将发送的内容转换为byte数组byteb=s.getBytes();/将服务器IP转换为InetAddress对象InetAddressserver=InetAddress.getByName(host);/构造发送的数据包对象DatagramPacketsendDp=newDatagramPacket(b,b.length,server,port);/发送数据ds.send(sendDp);在该示例代码中,不管发送的数据内容是什么,都需要转换为byte数组,然后将服务
25、器端的IP地址构造成InetAddress类型的对象,在准备完成以后,将这些信息构造成一个DatagramPacket类型的对象,在UDP编程中,发送的数据内容、服务器端的IP和端口号,都包含在DatagramPacket对象中。在准备完成以后,调用连接对象ds的send方法把DatagramPacket对象发送出去即可。3)UDP客户端编程中接收数据首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反应数据,该数组的长度必须大于或等于服务器端反应的实际有效数据的长度。然后以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象的receive方法接收数据即可。接
26、收到的服务器端反应数据存储在DatagramPacket类型的对象内部示例代码:javaviewplaincopyprint?/构造缓冲数组bytedata=newbyte1024;/构造数据包对象DatagramPacketreceiveDp=newDatagramPacket(data,data.length);/接收数据ds.receive(receiveDp);/输出数据内容byteb=receiveDp.getData();/获得缓冲数组intlen=receiveDp.getLength();/获得有效数据长度Strings=newString(b,0,len);System.ou
27、t.println(s);代码讲解:首先构造缓冲数组data,这里设置的长度1024是预估的接收到的数据长度,要求该长度必须大于或等于接收到的数据长度,然后以该缓冲数组为基础,构造数据包对象,使用连接对象ds的receive方法接收反应数据,由于在Java语言中,除String以外的其它对象都是根据地址传递,所以在receive方法内部能够改变数据包对象receiveDp的内容,这里的receiveDp的功能和返回值类似。数据接收到以后,只需要从数据包对象中读取出来就能够了,使用DatagramPacket对象中的getData方法能够获得数据包对象的缓冲区数组,但是缓冲区数组的长度一般大于有
28、效数据的长度,换句话讲,也就是缓冲区数组中只要一部分数据是反应数据,所以需要使用DatagramPacket对象中的getLength方法获得有效数据的长度,则有效数据就是缓冲数组中的前有效数据长度个内容,这些才是真正的服务器端反应的数据的内容4)关闭连接ds.close();UDP方式服务器端网络编程1)首先UDP方式服务器端网络编程需要建立一个连接,该连接监听某个端口:DatagramSocketds=newDatagramSocket(10010);由于服务器端的端口需要固定,所以一般在建立服务器端连接时,都指定端口号2)接收客户端发送过来的数据其接收的方法和客户端接收的方法一直,其中r
29、eceive方法的作用类似于TCP方式中accept方法的作用,该方法也是一个阻塞方法,其作用是接收数据。ds.receive()接收到客户端发送过来的数据以后,服务器端对该数据进行逻辑处理,然后将处理以后的结果再发送给客户端,在这里发送时就比客户端要费事一些,由于服务器端需要获得客户端的IP和客户端使用的端口号,这个都能够从接收到的数据包中获得。示例代码如下:/获得客户端的IPInetAddressclientIP=receiveDp.getAddress();/获得客户端的端口号IntclientPort=receiveDp.getPort();3)关闭连接ds.close()好了,占时就总结到这吧,总结的不是很全面,但很基础,应该合适初学者学习,java局域网通信大家知道java局域网通信吗?下面是学习啦我为你整理相关的内容,希望大家喜欢!一:首先看一下网络通讯的两种方式1.TCP(传输控制协议)方式TCP方式就类似于拨打,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可推荐度: