在计算机网络通信中,UDP协议和TCP协议是两种最常用的通信协议
UDP协议常被用于对速度要求高,对数据的传输准确率不那么高的环境下如视频对话等
而TCP协议常用于对传输重要信息,对信息的精确率要求高,尽管速度不如UDP传输
使用Java进行UDP传输通信:
1.数据发送端
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class MyClass {
public static void main(String[] args) throws IOException {
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");//创建目标地址对象,使用静态方法创建
DatagramSocket ds=new DatagramSocket();//创建发送端对象
Scanner sc=new Scanner(System.in);
while (true) {
System.out.println("please input your Messages");
String msg=sc.nextLine();
if(msg.equals("886")){
break;
}
byte[] bytes = msg.getBytes();//将要发送的字符串信息转换成字节数组
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inetAddress,10086);//创建数据包对象
ds.send(dp);//发送数据
}
ds.close();
}
}
五步:
1.创建目标地址(要指定接收地址)
2.创建发送端对象(无参表示自动选择空闲端口号进行发送)
3.创建字节数组以及数据包对象(要指定接收对象接收数据的端口号)
4.发送端对象发送数据包
5.关闭发送端
打个比方:
在以上代码中DatagramSocket类相当于快递发送站,因为他写在只负责发送快递,不用指明所在地,用户打包好的DatagramPacket类,可以看作装着数据的包裹发送出去,在包裹打包好时要将物品(String)先转换到bytes数组,打包时要指明物品的大小,以及一个重要的InetAdress类,类似包裹外的地址单,这些都准备好后,DatagramSocket就把包裹send出去。
2.数据接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class MyRecieveClass {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10086);
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
while (true) {
ds.receive(dp);
byte[] data = dp.getData();
String hostAddress = dp.getAddress().getHostAddress();
System.out.println("You have received a message "+new String(data,0,data.length));
System.out.println("from adress:"+hostAddress);
}
}
}
接收端接收数据步骤:
1.创建接收端对象(同时指定接收端口)
2.创建字节数组以及数据包对象,并用字节数组长度指定数据包大小
3.接收端对象接收数据包
4.提取各种包装好的数据包内容
DatagramSocket类相当于快递接收站,创建时就要指定他的门牌地址,并指定一个容器,bytes数组,存储接收到的数据,这里DatagramPacket表示重新给用户包装了一次,发送的数据装到bytes里,之后执行一次receive方法,dp包裹被得到了,再调用方法将其输出
使用Java进行TCP传输通信:
数据发送端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class MyClass {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",12086);
OutputStream outputStream=socket.getOutputStream();
outputStream.write("我是".getBytes());
outputStream.close();
socket.close();
}
}
1.创建socket对象,一次性指明目标地址和端口号。
2.获取到socket的输出流ops
3.使用ops流对象写入信息,此处相当于io流输出
4.关闭输出流和socket对象
数据接收端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;
public class MyRecieveClass {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(12086);
Socket socket=ss.accept();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
int b;
while ((b=bufferedReader.read())!=-1){
System.out.print((char)b);
}
socket.close();
ss.close();
}
}
1.创建socket对象,一次性指明接收数据的端口号。
2.socket对象执行accept方法,等待数据到达
3.数据到达后,获取到socket方法的inputstream
4.使用输入流读取数据
4.关闭输入流和socket对象