大家知道java局域网通信吗?下面是学习啦小编为你整理相关的内容,希望大家喜欢!

一:首先看一下网络通讯的两种方式

1.TCP(传输控制协议)方式

TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据

2. UDP(用户数据报协议)方式

UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得

这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。

总结一下UDP和TCP协议的区别

-使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

–对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间

–使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

–TCP没有这方面的限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。

–UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

–TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据

-TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。

—相比之下UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序

二:基于url的网络编程

1.创建一个URL

为了表示URL, java.net中实现了类URL。我们可以通过下面的构造方法来初始化一个URL对象:

(1) public URL (Stringspec);

通过一个表示URL地址的字符串可以构造一个URL对象

URL urlBase=new URL("http://www.263.net/")

(2) public URL(URL context,String spec);

通过基URL和相对URL构造一个URL对象。

URL net263=new URL("http://www.263.net/");

URL index263=new URL(net263,"index.html")

(3) public URL(Stringprotocol, String host, String file);

new URL("http","www.gamelan.com", "/pages/Gamelan.net. html");

(4) public URL(Stringprotocol, String host, int port, String file);

URL gamelan=new URL("http","www.gamelan.com", 80, "Pages/Gamelan.network.html");

注意:类URL的构造方法都声明抛弃非运行时例外(MalformedURLException),因此生成URL对象时,我们必须要对这一例外进行处理,通常是用try-catch语句进行捕获。格式如下:

try{

URL myURL= new URL(…)

}catch (MalformedURLException e){

…}

2. 解析一个URL

一个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性:

publicString getProtocol() 获取该URL的协议名。

publicString getHost() 获取该URL的主机名。

publicint getPort() 获取该URL的端口号,如果没有设置端口,返回-1。

publicString getFile() 获取该URL的文件名。

publicString getRef() 获取该URL在文件中的相对位置。

publicString getQuery() 获取该URL的查询信息。

publicString getPath() 获取该URL的路径

public String getAuthority() 获取该URL的权限信息

publicString getUserInfo() 获得使用者的信息

public String getRef()获得该URL的锚

3.从URL读取WWW网络资源

当我们得到一个URL对象后,就可以通过它读取指定的WWW资源。这时我们将使用URL的方法openStream(),其定义为:

InputStream openStream();

方法openSteam()与指定的URL建立连接并返回InputStream类的对象以从这一连接中读取数据。

URL url = new URL("http://www.baidu.com");

//使用openStream得到一输入流并由此构造一个BufferedReader对象

BufferedReaderbr = new BufferedReader(new InputStreamReader( url.openStream()));

Stringline = null;

while(null!= (line = br.readLine()))

{

System.out.println(line);

}

br.close();

三:客户端网络编程步骤

按照前面的基础知识介绍,无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成

1.客户端网络编程步骤

客户端(Client)是指网络编程中首先发起连接的程序,客户端一般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,无论客户端复杂还是简单,以及客户端实现的方式,客户端的编程主要由三个步骤实现:

1、 建立网络连接

客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。

2、 交换数据

连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。

根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。

3、 关闭网络连接

在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。

最基本的步骤一般都是这三个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,由于网络编程是比较耗时的操作,所以一般开启专门的现场进行网络通讯。

2.服务器端网络编程步骤

服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是:

1、 监听端口

服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。

这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。

2、 获得连接

当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。

一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。

3、 交换数据

服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。

其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。

当然,服务器端的数据交换也是可以多次进行的。

在数据交换完成以后,关闭和客户端的连接。

4、 关闭连接

当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。

四:一个基础的网络类——InetAddress类

该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。

关于该类的使用,下面通过一个基础的代码示例演示该类的使用,代码如下:

[java] view plaincopyprint?

publicclass InetAddressDemo {

publicstaticvoid main(String[] args) {

try {

// 使用域名创建对象

InetAddress inet1 = InetAddress.getByName("www.163.com");

System.out.println(inet1);

// 使用IP创建对象

InetAddress inet2 = InetAddress.getByName("127.0.0.1");

System.out.println(inet2);

// 获得本机地址对象

InetAddress inet3 = InetAddress.getLocalHost();

System.out.println(inet3);

// 获得对象中存储的域名

String host = inet3.getHostName();

System.out.println("域名:" + host);

// 获得对象中存储的IP

String ip = inet3.getHostAddress();

System.out.println("IP:" + ip);

} catch (Exception e) {

}

}

}

注:InetAddress 类没有明显的构造函数。为生成一个InetAddress对象,必须运用一个可用的工厂方法。

–工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。对于InetAddress,三个方法 getLocalHost( )、getByName( )以及getAllByName( )可以用来创建InetAddress的实例

•如果这些方法不能解析主机名,它们引发一个UnknownHostException异常。

五:TCP编程

在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以 java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。

在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接

客户端

1) 建立Socket连接

Socketsocket2 = new Socket(“www.sohu.com”,80);

2)按照“请求-响应”模型进行网络数据交换

在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:

OutputStreamos = socket1.getOutputStream(); //获得输出流

InputStreamis = socket1.getInputStream(); //获得输入流

这里获得的只是最基本的输出流和输入流对象,还可以根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。

3)关闭网络连接

socket1.close();

服务器端

首先需要说明的是,客户端的步骤和服务器端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。

1)监听端口

ServerSocketss = new ServerSocket(10000);

2)获得连接

当有客户端连接到达时,建立一个和客户端连接对应的Socket连接对象,从而释放客户端连接对于服务器端端口的占用

Socketsocket = ss.accept();

该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是accept和前面IO部分介绍的read方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。

3)按照“请求-响应”模型进行网络数据交换

这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反

InputStreamis = ss.getInputStream(); //获得输入流

OutputStreamos = ss.getOutputStream(); //获得输出流

4)关闭服务器端连接

ss.close();

以上就是基本的TCP类型的服务器和客户端代码实现的步骤,下面以一个简单的echo(回声)服务实现为例子,介绍综合使用示例,实现的代码如下:

[java] view plaincopyprint?

publicclass Constants {

publicstaticvoid main(String[] args) {

ServerSocket serverSocket = null;

Socket socket = null;

OutputStream os = null;

InputStream is = null;

// 监听端口号

int port = 10000;

try {

// 建立连接

serverSocket = new ServerSocket(port);

// 获得连接

socket = serverSocket.accept();

// 接收客户端发送内容

is = socket.getInputStream();

byte[] b = newbyte[1024];

int n = is.read(b);

// 输出

System.out.println("客户端发送内容为:" + new String(b, 0, n));

// 向客户端发送反馈内容

os = socket.getOutputStream();

os.write(b, 0, n);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

// 关闭流和连接

os.close();

is.close();

socket.close();

serverSocket.close();

} catch (Exception e) {

}

}

}

}

UDP编程

UDP(UserDatagram Protocol),中文意思是用户数据报协议使用该种方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对于服务器的压力要比TCP小很多,所以也是一种常见的网络编程方式。但是使用该种方式最大的不足是传输不可靠,当然也不是说经常丢失,就像大家发短信息一样,理论上存在收不到的可能

在JavaAPI中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:

l DatagramSocket

DatagramSocket类实现“网络连接”,包括客户端网络连接和服务器端网络连接。虽然UDP方式的网络通讯不需要建立专用的网络连接,但是毕竟还是需要发送和接收数据,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。

l DatagramPacket

DatagramPacket类实现对于网络中传输的数据封装,也就是说,该类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。其实DatagramPacket类的作用类似于现实中的信件,在信件中包含信件发送到的地址以及接收人,还有发送的内容等,邮局只需要按照地址传递即可。在接收数据时,接收到的数据也必须被处理成DatagramPacket类型的对象,在该对象中包含发送方的地址、端口号等信息,也包含数据的内容。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。

UDP客户端编程涉及的步骤也是4个部分:建立连接、发送数据、接收数据和关闭连接。

1)建立连接:

DatagramSocketds = new DatagramSocket();

该客户端连接使用系统随机分配的一个本地计算机的未用端口号

当然,可以通过制定连接使用的端口号来创建客户端连接。

DatagramSocketds = new DatagramSocket(5000);

一般在建立客户端连接时没有必要指定端口号码。

2)发送数据

在发送数据时,需要将需要发送的数据内容首先转换为byte数组,然后将数据内容、服务器IP和服务器端口号一起构造成一个DatagramPacket类型的对象,这样数据的准备就完成了了,发送时调用网络连接对象中的send方法发送该对象即可

代码示例:

[java] view plaincopyprint?

String s = "Hello";

String host = "127.0.0.1";

int port = 10001;

//将发送的内容转换为byte数组

byte[] b = s.getBytes();

//将服务器IP转换为InetAddress对象

InetAddress server = InetAddress.getByName(host);

//构造发送的数据包对象

DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port);

//发送数据

ds.send(sendDp);

在该示例代码中,不管发送的数据内容是什么,都需要转换为byte数组,然后将服务器端的IP地址构造成InetAddress类型的对象,在准备完成以后,将这些信息构造成一个DatagramPacket类型的对象,在UDP编程中,发送的数据内容、服务器端的IP和端口号,都包含在 DatagramPacket对象中。在准备完成以后,调用连接对象ds的send方法把DatagramPacket对象发送出去即可。

3)UDP客户端编程中接收数据

首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。然后以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象的receive方法接收数据即可。接收到的服务器端反馈数据存储在 DatagramPacket类型的对象内部

示例代码:

[java] view plaincopyprint?

//构造缓冲数组

byte[] data = newbyte[1024];

//构造数据包对象

DatagramPacket receiveDp = new DatagramPacket(data,data.length);

//接收数据

ds.receive(receiveDp);

//输出数据内容

byte[] b = receiveDp.getData(); //获得缓冲数组

int len = receiveDp.getLength(); //获得有效数据长度

String s = new String(b,0,len);

System.out.println(s);

代码讲解:首先构造缓冲数组data,这里设置的长度1024是预估的接收到的数据长度,要求该长度必须大于或等于接收到的数据长度,然后以该缓冲数组为基础,构造数据包对象,使用连接对象ds的receive方法接收反馈数据,由于在Java语言中,除String以外的其它对象都是按照地址传递,所以在 receive方法内部可以改变数据包对象receiveDp的内容,这里的receiveDp的功能和返回值类似。数据接收到以后,只需要从数据包对象中读取出来就可以了,使用DatagramPacket对象中的getData方法可以获得数据包对象的缓冲区数组,但是缓冲区数组的长度一般大于有效数据的长度,换句话说,也就是缓冲区数组中只有一部分数据是反馈数据,所以需要使用DatagramPacket对象中的getLength方法获得有效数据的长度,则有效数据就是缓冲数组中的前有效数据长度个内容,这些才是真正的服务器端反馈的数据的内容

4)关闭连接

ds.close();

UDP方式服务器端网络编程

1)首先UDP方式服务器端网络编程需要建立一个连接,该连接监听某个端口:

DatagramSocketds = new DatagramSocket(10010);

由于服务器端的端口需要固定,所以一般在建立服务器端连接时,都指定端口号

2)接收客户端发送过来的数据

其接收的方法和客户端接收的方法一直,其中receive方法的作用类似于TCP方式中accept方法的作用,该方法也是一个阻塞方法,其作用是接收数据。

ds.receive()

接收到客户端发送过来的数据以后,服务器端对该数据进行逻辑处理,然后将处理以后的结果再发送给客户端,在这里发送时就比客户端要麻烦一些,因为服务器端需要获得客户端的IP和客户端使用的端口号,这个都可以从接收到的数据包中获得。示例代码如下:

//获得客户端的IP

InetAddressclientIP = receiveDp.getAddress();

//获得客户端的端口号

IntclientPort = receiveDp.getPort();

3)关闭连接

ds.close()

好了,占时就总结到这吧,总结的不是很全面,但很基础,应该适合初学者学习,

java局域网通信_java局域网通信相关推荐

  1. java 串口波特率_JAVA串口通信的方法

    以前经常用C语言操作串口,实现一些发送接收之类的小功能,最近项目中也用到了串口通信,不过语言变成了Java,这个搞起来略蛋疼. Java说起来就是各种库各种引用,所以得到某些需求先google搜一把~ ...

  2. java socket 端口_Java Socket通信如何摆平自身端口问题

    Java Socket通信在使用的时候有不少的问题,在端口编程上来说是一个十分重要的.下面我们就看看Java Socket通信如何才能更好的使用相关的代码.希望大家有所帮助. 事实上网络编程简单的理解 ...

  3. java共享内存_Java进程通信之映像文件共享内存

    Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信 ...

  4. java群聊_Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /*** 服务端*/ public classServer {private static ServerSocket server = null ...

  5. java web 通信_Java Web_Java通信

    Java通信 Java通信3.0API是一个Java的扩展,有利于发展独立于平台的通信应用,如智能卡,嵌入式系统,销售点设备,金融服务设备,传真机,调制解调器,显示终端,以及机器人设备的技术. Jav ...

  6. java socket通信安全_Java Socket通信

    原理: 1.基于TCP协议,建立稳定连接的点对点的通信 a.实时,快速,安全性高,占用系统资源多,效率低 2.请求-响应模式 a.客户端 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Clien ...

  7. Java如何实现不同局域网TCP通信+群聊(云服务器实现)

    最近在CSDN上学习了Socket通信群聊的方法,就觉得这样就可以实现QQ的样子了.然后让女朋友用电脑试了一下,运行用户端代码,发现连连接到服务器都做不到.后来经过自己的研究,实现了QQ群聊的功能,后 ...

  8. 树莓派与安卓手机app的WIFI通信(局域网通信)

    参考:树莓派与安卓手机app的WIFI通信(局域网通信) 作者:图触靓 发布时间: 2020-07-29 10:18:12 网址:https://blog.csdn.net/bhbhhyg/artic ...

  9. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信

    目录 前言 IP地址 简介 公有IP 私有IP 局域网之间网络通信 前提 功能描述 源码 运行结果 局域网与广域网网络通信 前提 源码 结语 前言 本系列博客是笔者学习Python Socket的过程 ...

最新文章

  1. linux平台调试终端,10款Linux平台上优秀的调试器,总有一款适合你!
  2. 【组队学习】【35期】深入浅出Pytorch
  3. JavaScript Math和Number对象
  4. 实验一基于 的词法分析实验_[源码和文档分享]基于JAVA实现的基于DFA的词法分析程序...
  5. Attention技术应用的最新进展概述
  6. 鸿蒙系统出来没有,呜呼哀哉!历尽艰辛研发出鸿蒙系统,却无厂商敢用
  7. // 、| || 的区别
  8. Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
  9. iOS 算法的前世今生:算法原理、常用算法(一)排序算法
  10. Gitlab文件管理之把文档传到指定文件夹
  11. SVG中中文字体的显示
  12. arrayblockingqueue java_Java ArrayBlockingQueue take()用法及代码示例
  13. 如何制作千人千面的NFT?如何存储NFT?#Crystals #nft.storage #ipfs
  14. Fusion 360 最新动态 - 温度场和热应力分析
  15. c#股票接口源代码算法
  16. 统计200~1000之间能被7整除数的个数。
  17. 7-3 打印九九口诀表
  18. 今天19:30 | 复旦大学青年副研究员许嘉蓉—《基于图数据的鲁棒机器学习 》
  19. 深入浅出傅里叶变换(目前看到的讲得最好的一篇文章)
  20. 计算机专业高级工程师考哪些专业,高级工程师职称考试项目有哪些

热门文章

  1. 泰州职称计算机考试电话,泰州市人事考试网
  2. Bootstrap系列之treeview实现菜单树
  3. MATLAB—离散一元、二元、多元函数求导求梯度(二维、三维、多维空间)(diff和gradient)
  4. 什么是人工智能数据采集?
  5. java mysql多媒体积件管理库的开发与应用源码+论文
  6. xp下IIS500错误解决方案
  7. 光纤信号衰减的原理及分析
  8. Windows + XMAPP + TestLink 初探
  9. 基于AT89C51单片机的智能浇花系统设计
  10. SIGSEGV(SEGV_MAPERR)