当前位置:   article > 正文

Java中TCP编程与UDP编程介绍(基本使用与比较)_java项目端口属于tcp还是udp

java项目端口属于tcp还是udp

什么是计算机网络编程。

首先我们应当TCP/IP 协议泛指互联网协议,其中最重要的两个协议是 TCP协议 和 IP协议 。只有使用 TCP/IP协议 的计算机才能够联入互联网。

IP协议:一种分组交换传输协议

TCP协议:一种面向连接,可靠传输的协议;

UDP协议:一种无连接,不可靠传输的协议。

Java网络编程

      在 java.net 包中提供了两种常见的网络协议的支持

  1. TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
  2. UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

        

Socket套接字网络编程:

那么什么是套接字呢?

一个 Socket 套接字就是由IP地址和端口号(范围0~65535)组成,可以把 Socket 简单理解为 IP 地址加端口号。端口号总是由操作系统分配,它是一个 0 ~ 65535 之间的数字,其中,小于 1024 的端口属于 特权端口,需要管理员权限,大于 1024 的端口可以由任意用户的应用程序打开。

套接字使用TCP提供了两台计算机之间的通信机制。
1、客户端Client程序创建一个套接字,并尝试连接服务器的套接字。
2、当连接建立时,服务器(Server)会创建一个 Socket 对象。
3、客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

以下是基于TCP/IP协议的客户端(Client)示意代码

  1. public class Demo01 {
  2. public static void main(String[] args) {
  3. //客户端
  4. try(Socket client = new Socket("192.168.254.166",8848);//连接服务器的ip地址以及端口号
  5. OutputStream ops = client.getOutputStream(); //客户端的一个输出流
  6. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\tupian\\hyz.png"));) {
  7. byte[] buff = new byte[1024];
  8. int len = -1;
  9. while((len=bis.read(buff))!=-1) {
  10. ops.write(buff,0,len);
  11. }//通过输出流OPS的write方法写入D:\\tupian\\hyz.png的图片
  12. client.shutdownOutput();//关闭输出流
  13. try(BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));) {
  14. String reply = reader.readLine();
  15. System.out.println("服务器反馈"+reply);//输入流 获取服务器端的反馈
  16. }
  17. } catch (UnknownHostException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

以下是基于TCP/IP协议的服务器端(Server)示意代码

  1. public class Demo02Server {
  2. public static void main(String[] args) {
  3. try {
  4. ServerSocket server = new ServerSocket(8848);//监听的端口号
  5. //死循环,确保服务器开启
  6. while (true) {
  7. Socket client = server.accept();//.accept() 表示每当有新的客户端连接进来后,就返回一个 Socket 实例,这个 Socket 实例就是用来和刚连接的客
  8. //户端进行通信的。
  9. InetAddress clientadd = client.getInetAddress();//获取客户端ip地址
  10. System.out.println("客户端"+clientadd.getHostAddress()+"开始连接.................");
  11. String imageName = clientadd.getHostAddress().replaceAll("\\.", "-")+".jpg";//客户端收到的图片名字
  12. try (InputStream in = client.getInputStream();
  13. BufferedInputStream bis = new BufferedInputStream(in);//读取client传的图片
  14. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\tupian11\\"+imageName));){
  15. byte[] buff = new byte[1024];
  16. int len = -1;
  17. while((len=bis.read(buff))!=-1) {
  18. bos.write(buff,0,len);
  19. }//写入到本机的磁盘
  20. System.out.println("图片读取完毕");
  21. try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));) {
  22. writer.write("upload Success");
  23. writer.newLine();
  24. }//将读取成功upload Success输出到Client
  25. }
  26. }
  27. } catch (FileNotFoundException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. } catch (IOException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35. }

Java UDP编程

首先我们应当明确,在UDP编程中发送端与接收端是两个独立的运行程序。UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。

UDP数据报通过数据报套接字 DatagramSocket 发送和接收。

服务器端用 DatagramSocket(port) 监听端口;

客户端使用 DatagramSocket.connect() 指定远程地址和端口;

双方通过 receive() 和 send() 读写数据;

DatagramSocket 没有 IO 流接口,数据被直接写入 byte[] 缓冲区。

以下是基于UDP协议的客户端(Client)示意代码

  1. package com.my.hyz3;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetSocketAddress;
  6. import java.util.Scanner;
  7. //客户端Client
  8. public class Demo01 {
  9. public static void main(String[] args) {
  10. Scanner input = new Scanner(System.in);
  11. while(true){//死循环确保联系
  12. String word = input.nextLine();
  13. if(word.equals("gg")) {
  14. break;//当打 gg使循环中止
  15. }
  16. try (DatagramSocket clientSocket = new DatagramSocket()) {
  17. clientSocket.setSoTimeout(20000); //timeout时间
  18. clientSocket.connect(new InetSocketAddress("192.168.254.185",8849));//获取与服务器端连接
  19. //String word = input.nextLine();
  20. byte[] wordBuff = word.getBytes(); //获取英文单词的字节数组
  21. DatagramPacket packet = new DatagramPacket(wordBuff, wordBuff.length);
  22. clientSocket.send(packet);//发送读取到的word
  23. //读取
  24. byte[] resultByte = new byte[1024];
  25. DatagramPacket resultPacket = new DatagramPacket(resultByte, resultByte.length);
  26. clientSocket.receive(resultPacket);//接收读取到的结果
  27. String result = new String(resultPacket.getData(),resultPacket.getOffset(),resultPacket.getLength());
  28. System.out.println("服务器告诉你:"+result);
  29. } catch (IOException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. }

以下是基于UDP协议的服务器端(Server)示意代码

  1. public class Demo01Server {
  2. public static void main(String[] args) {
  3. Map<String, String> wordMap = new HashMap<String, String>();
  4. wordMap.put("one", "一");
  5. wordMap.put("two", "二");
  6. wordMap.put("three", "三");
  7. wordMap.put("four", "4");
  8. wordMap.put("five", "5");
  9. wordMap.put("six", "6");
  10. try (DatagramSocket serverSocket = new DatagramSocket(8849)) {
  11. while(true) {
  12. //准备空的包
  13. byte[] buff = new byte[1024];
  14. DatagramPacket packet = new DatagramPacket(buff, buff.length);
  15. //读取Client发送的包
  16. serverSocket.receive(packet);
  17. //获取包中的“数据” (字节数组)中
  18. //获取包中的“数据”读取位置(int类型)
  19. //获取包中的长度
  20. String word = new String(packet.getData(),packet.getOffset(),packet.getLength());
  21. System.out.println("【服务器】:获取来自Client的Word为"+word);
  22. String chinese = wordMap.get(word);
  23. if(chinese==null) {
  24. chinese="你在干嘛?在干嘛?白给吗";
  25. }
  26. //客户端发
  27. byte[] resultbyte = chinese.getBytes();
  28. packet.setData(resultbyte);
  29. serverSocket.send(packet);
  30. }
  31. } catch (IOException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. }
  36. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/850714
推荐阅读
相关标签
  

闽ICP备14008679号