论文部分内容阅读
摘要:如今,TCP/IP已经成为计算机网络协议事实上的标准,而Java凭借其跨平台的特性以及和对网络编程的强大支持能力,在网络应用中已经占据了主导地位。本文以Java为例介绍了两种网络通信的方式。
关键词:java;网络通信;socket
1 Socket套接字
计算机之间的通信在本质上其实是计算机内中运行的进程之间的通信,全球那么多的计算机,还有计算机中运行的那么的多进程是怎么彼此找到对方从而进行通信的呢?我们需要引入IP地址,端口号两个概念。
1.1IP地址
整个的因特网是一个单一的,抽象的网络。IP地址就是给连接在因特网上的每一个主机或者路由器的每一个接口分配一个在全世界内唯一的标识符号。标识符以32位二进制或者与其对应的十进制数表示。这样就可以很方便的找到连接在因特网上的任何一台计算机。
1.2端口号
在单个计算机中运行的进程是用进程号来标志的。但是在网络环境下,用进程号来标志某一个进程是不行的。因为连接在因特网上的计算机种类有很多,不同种类的计算机对于某一个具体进程分配的进程号可能会不同,这就会让通信变得困难起来。所以引进了一个叫做端口号的16位二进制数来区别在计算机内运行的不同进程。需要说明在不同的计算机中相同端口号是没有关联的。
1.3套接字
有了IP地址和端口号,就可以区别不同主机中的不同进程了。在通信时只需把数据报交给目的主机的某一个端口,剩下的工作就只需要网络中制定的协议来完成就可以了。那么某一台计算机中的某个进程就可以用以下形式表示:
Socket = (IP地址,端口号)
我们称之为套接字。
2 UDP通信
UDP提供的是一种无连接,尽最大努力交付的通信方式。发送数据之前不需要建立连接从而减少了时延,发送数据时不需要确定数据是否到达对方,因此实现简单。发送接收如下:
DatagramSocket udpSocket =
new DatagramSocket(10002);
byte buff[] = new byte[1024];buff = message.getBytes();
DatagramPacket packet = new DatagramPacket(buff, buff.length, ip, port);
udpSocket.send(packet);
在发送之前我们需要指明发送方的端口号,然后直接把需要发送的消息放入数据包packet中并指明需要发送给哪一台机器的哪一个端口之后调用send方法就是发送消息了。
udpSocket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
只需要通过DatagramSocket类提供的receive方法把接收到的数据放在一个新的数据包中就可以接受消息了。
UDP因为实现简单所以运用的比较广泛,例如做一个直播软件时我们只需要每秒发送24張图片给每一个用户就可以了,不需要提供可靠的传输。
3 TCP通信
与UDP相比TCP就要复杂的多了,TCP提供的是一种面向连接的,可靠的通信方式。可以保证数据在传递的时候不丢失,并且按顺序到达。TCP在发送消息之前需要进行“三次握手”来商量确定通信双方需要的参数,在释放连接的时候需要进行“四次挥手”来保证数据完全传送到对方。TCP只提供一对一通信,发送方被成为Client接收方被称为Servers,代码如下:
3.1Client客户端
Socket tcpSocket = new
Socket(ip,SERVERSPORT);String message = “hi!”;
DataOutputStream dos = new
DataOutputStream(tcpSocket.getOutputStream());
dos.writeUTF(message); dos.flush();
使用tcp发送消息时需要用到套接字Socket,需要指明服务器的地址。套接字相当于将通信双方用一个管道连接起来,发送的消息通过管道可以按照顺序的,完好无损的被传送到对方。
3.2Servers服务器端
ServerSocket localScoket = new
ServerSocket(LOCALTCPPORT);
Socket socket = null; socket =
localScoket.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
String message = dis.readUTF();
对于服务器端来说localScoket相当于本地的端口号,通过accept方法去监听是否有客户端连接到服务器。如果有客户端连接,则把客户端的Socket保存下来用于通信,如果没有程序一直会阻塞在accept方法这里,直到有客户端连接。
4 结束语
这里只介绍了两种一对一的通信方式,在网络中消息的传播不只是一对一,还有一对多和多对多。UDP支持一对一,一对多,多对多的通信。TCP只支持一对一的通信,但这并不代表我们不能使用TCP进行一对多的通信。对于一对多的通信我们可以使用多播组的方法(基于UDP)把每个主机都加入到多播组中实现。也可以把服务器作为一个中转站,把使用TCP连接到主机的客户端给保存下来,再把接受到的消息转发给连接到服务器的各个客户机。对于TCP和UDP没有好坏之分,主要要看它们的用途,如果数据发送的正确率并不是那么的重要,比如聊天,直播这类的软件我们可以使用简单的UDP。如果数据发送的正确率很重要我们要使用提供可靠传输的TCP,比如文件传输等。
参考文献:
[1]姚晓芳,舒小松.基于Java Socket网络编程的基础性应用研究[J].无线互联科技,2017.
[2]舒小松.基于Java网络编程中组播技术的应用技术的应用和与研究[J].无线互联科技,2018
作者简介:毕龙阁(1997—) 男,汉族,河南洛阳,河南大学软件学院,2015级本科生,专业:软件工程。
关键词:java;网络通信;socket
1 Socket套接字
计算机之间的通信在本质上其实是计算机内中运行的进程之间的通信,全球那么多的计算机,还有计算机中运行的那么的多进程是怎么彼此找到对方从而进行通信的呢?我们需要引入IP地址,端口号两个概念。
1.1IP地址
整个的因特网是一个单一的,抽象的网络。IP地址就是给连接在因特网上的每一个主机或者路由器的每一个接口分配一个在全世界内唯一的标识符号。标识符以32位二进制或者与其对应的十进制数表示。这样就可以很方便的找到连接在因特网上的任何一台计算机。
1.2端口号
在单个计算机中运行的进程是用进程号来标志的。但是在网络环境下,用进程号来标志某一个进程是不行的。因为连接在因特网上的计算机种类有很多,不同种类的计算机对于某一个具体进程分配的进程号可能会不同,这就会让通信变得困难起来。所以引进了一个叫做端口号的16位二进制数来区别在计算机内运行的不同进程。需要说明在不同的计算机中相同端口号是没有关联的。
1.3套接字
有了IP地址和端口号,就可以区别不同主机中的不同进程了。在通信时只需把数据报交给目的主机的某一个端口,剩下的工作就只需要网络中制定的协议来完成就可以了。那么某一台计算机中的某个进程就可以用以下形式表示:
Socket = (IP地址,端口号)
我们称之为套接字。
2 UDP通信
UDP提供的是一种无连接,尽最大努力交付的通信方式。发送数据之前不需要建立连接从而减少了时延,发送数据时不需要确定数据是否到达对方,因此实现简单。发送接收如下:
DatagramSocket udpSocket =
new DatagramSocket(10002);
byte buff[] = new byte[1024];buff = message.getBytes();
DatagramPacket packet = new DatagramPacket(buff, buff.length, ip, port);
udpSocket.send(packet);
在发送之前我们需要指明发送方的端口号,然后直接把需要发送的消息放入数据包packet中并指明需要发送给哪一台机器的哪一个端口之后调用send方法就是发送消息了。
udpSocket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
只需要通过DatagramSocket类提供的receive方法把接收到的数据放在一个新的数据包中就可以接受消息了。
UDP因为实现简单所以运用的比较广泛,例如做一个直播软件时我们只需要每秒发送24張图片给每一个用户就可以了,不需要提供可靠的传输。
3 TCP通信
与UDP相比TCP就要复杂的多了,TCP提供的是一种面向连接的,可靠的通信方式。可以保证数据在传递的时候不丢失,并且按顺序到达。TCP在发送消息之前需要进行“三次握手”来商量确定通信双方需要的参数,在释放连接的时候需要进行“四次挥手”来保证数据完全传送到对方。TCP只提供一对一通信,发送方被成为Client接收方被称为Servers,代码如下:
3.1Client客户端
Socket tcpSocket = new
Socket(ip,SERVERSPORT);String message = “hi!”;
DataOutputStream dos = new
DataOutputStream(tcpSocket.getOutputStream());
dos.writeUTF(message); dos.flush();
使用tcp发送消息时需要用到套接字Socket,需要指明服务器的地址。套接字相当于将通信双方用一个管道连接起来,发送的消息通过管道可以按照顺序的,完好无损的被传送到对方。
3.2Servers服务器端
ServerSocket localScoket = new
ServerSocket(LOCALTCPPORT);
Socket socket = null; socket =
localScoket.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
String message = dis.readUTF();
对于服务器端来说localScoket相当于本地的端口号,通过accept方法去监听是否有客户端连接到服务器。如果有客户端连接,则把客户端的Socket保存下来用于通信,如果没有程序一直会阻塞在accept方法这里,直到有客户端连接。
4 结束语
这里只介绍了两种一对一的通信方式,在网络中消息的传播不只是一对一,还有一对多和多对多。UDP支持一对一,一对多,多对多的通信。TCP只支持一对一的通信,但这并不代表我们不能使用TCP进行一对多的通信。对于一对多的通信我们可以使用多播组的方法(基于UDP)把每个主机都加入到多播组中实现。也可以把服务器作为一个中转站,把使用TCP连接到主机的客户端给保存下来,再把接受到的消息转发给连接到服务器的各个客户机。对于TCP和UDP没有好坏之分,主要要看它们的用途,如果数据发送的正确率并不是那么的重要,比如聊天,直播这类的软件我们可以使用简单的UDP。如果数据发送的正确率很重要我们要使用提供可靠传输的TCP,比如文件传输等。
参考文献:
[1]姚晓芳,舒小松.基于Java Socket网络编程的基础性应用研究[J].无线互联科技,2017.
[2]舒小松.基于Java网络编程中组播技术的应用技术的应用和与研究[J].无线互联科技,2018
作者简介:毕龙阁(1997—) 男,汉族,河南洛阳,河南大学软件学院,2015级本科生,专业:软件工程。