个人理解:

  了解区分UDP与TCP的不同,正常情况都是两者结合的使用模式!为了更好的传输,经常会开多线程进行传输的!

一、网络通信协议:

1、TCP/IP协议:

四层:应用层、传输层、网络层和链路层:

链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。

传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。

应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。

2、IP地址和端口号:

①、IP地址,它可以唯一标识一台计算机:

  以前为IPV4,现在是IPV6的16个字节表示地址。

②、端口号:两个字节:0-65535。一般为1024以上的端口号。

3、InetAddress类:

  1. import java.net.InetAddress;
  2. import java.net.UnknownHostException;
  3.  
  4. public class Demo01 {
  5. public static void main(String[] args) throws UnknownHostException {
  6. InetAddress inet=InetAddress.getByName("192.168.1.163");//里面是自己的ip地址
  7. //从对象中获取IP地址
  8. System.out.println(inet.getHostAddress());
  9. //获取主机名
  10. System.out.println(inet.getHostName());
  11. //获取本地主机ip对象
  12. InetAddress inet2=InetAddress.getLocalHost();
  13. System.out.println(inet2.getHostAddress());
  14. System.out.println(inet2.getHostName());
  15. }
  16. }

二、UDP与TCP协议:

1、UDP协议:

  User Datagram Protocol 用户数据报协议--无连接的通信协议:不能保证数据的完整性,随缘!!!64K以内。

2、TCP协议:

  Transmission Control Protocol  传输控制协议---面向连接的通信协议:

在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据。

  在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,第三次握手,客户端再次向服务器端发送确认信息,确认连接。

三、UDP通讯:

1、DatagramPacket:数据打包类:

用于封装UDP通信中发送或者接收的数据。

2、DatagramSocket:“码头”:可以发送和接收DatagramPacket数据包

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.net.UnknownHostException;
  7.  
  8. //发送端
  9. public class UDPSend {
  10. public static void main(String[] args) throws IOException {
  11. //封装数据
  12. byte[ ] bytes="你好UDP".getBytes();
  13. //封装ip地址
  14. InetAddress inet=InetAddress.getByName("127.0.0.1");
  15. //1。创建数据打包对象,封装要发送的数据、长度、接收端的IP地址和端口号
  16. DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inet,6000);
  17. //2.创建DatagreamSocket对象(快递公司)
  18. DatagramSocket ds=new DatagramSocket();
  19. //3.发送数据包
  20. ds.send(dp);
  21. //释放资源
  22. ds.close();
  23. }
  24. }
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.SocketException;
  5.  
  6. //接收端
  7. public class UDPReceive {
  8. public static void main(String[] args) throws IOException {
  9. //创建DatagramSocket对象,明确端口号
  10. DatagramSocket ds=new DatagramSocket(6000);
  11. //2.创建字节数组负责接收发来的数据
  12. byte [] bytes=new byte[1024];
  13. //3.创建数据拆包对象
  14. DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
  15. //4.接收数据包
  16. ds.receive(dp);
  17. //5.拆包
  18. //获取接收的数据长度
  19. int length=dp.getLength();
  20. //获取发送端的IP地址
  21. String ip=dp.getAddress().getHostAddress();
  22. //获取发送端的端口号
  23. int port =dp.getPort();
  24. System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"+new String(bytes,0,length));
  25. }
  26. }

四、TCP通信:

1、ServerSocket类:服务器端;Socket类:客户端。

  1. //服务器端
  2. public class TCPServer {
  3. public static void main(String[] args) throws IOException {
  4. //1.创建服务器对象ServerSocket,明确端口号
  5. ServerSocket server=new ServerSocket(8888);
  6. //2.调用accept方法,跟客户端创建连接,并获取连接的客户端对象
  7. Socket socket=server.accept();
  8. //3.明确目的地
  9. File file=new File("D:\\nihao");
  10. //如果该目录不存在则创建
  11. if(!file.exists()){
  12. file.mkdirs();
  13. }
  14. String filename="oracle"+System.currentTimeMillis()+".txt";
  15. //明确目的地
  16. FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
  17. //明确数据源
  18. InputStream in=socket.getInputStream();
  19. //开始复制
  20. int len=0;
  21. byte[] bytes=new byte[1024];
  22. while((len=in.read(bytes))!=-1){
  23. fos.write(bytes,0,len);
  24. }
  25. //回复客户端
  26. //获取字节输出流 ,回复客户端
  27. OutputStream out =socket.getOutputStream();
  28. out.write("上传成功".getBytes());
  29.  
  30. //释放资源
  31. fos.close();
  32. server.close();
  33.  
  34. }
  35. }
  1. //客户端
  2. public class TCPClient {
  3. public static void main(String[] args) throws UnknownHostException, IOException {
  4. //1.创建Socket对象,明确要连接的服务器地址和端口号
  5. Socket socket =new Socket("127.0.0.1",8888);
  6. //2.明确数据源
  7. FileInputStream fis=new FileInputStream("D:\\java\\a.txt");
  8. //3.从socke对象中获取字节输出流,准备把读的文件字节写给服务器
  9. OutputStream out=socket.getOutputStream();
  10. //4.开始复制
  11. int len=0;
  12. byte[] bytes=new byte[1024];
  13. while((len=fis.read(bytes))!=-1){
  14. out.write(bytes,0,len);
  15. }
  16. //结束输出流,告诉服务器结束了,不要读了
  17. socket.shutdownOutput();
  18. //接收服务器的回复
  19. //1.从socket对象中获取字节输入流,接收服务器回复的数据
  20. InputStream in=socket.getInputStream();
  21. len=in.read(bytes);
  22. System.out.println(new String(bytes,0,len));
  23. //释放资源
  24. socket.close();
  25. fis.close();
  26. }
  27. }

2、多线程传输:

  1. //线程任务对象
  2. public class Upload implements Runnable {
  3. private Socket socket;
  4.  
  5. public Upload() {
  6. };
  7.  
  8. public Upload(Socket socket) {
  9. this.socket = socket;
  10. };
  11.  
  12. public void run() {
  13. FileOutputStream fos = null;
  14. try {
  15. // 3.明确目的地
  16. File file = new File("D:\\nihao");
  17. // 如果该目录不存在则创建
  18. if (!file.exists()) {
  19. file.mkdirs();
  20. }
  21. String filename = "oracle" + System.currentTimeMillis() + ".txt";
  22. // 明确目的地
  23. fos = new FileOutputStream(file + File.separator + filename);
  24. // 明确数据源
  25. InputStream in = socket.getInputStream();
  26. // 开始复制
  27. int len = 0;
  28. byte[] bytes = new byte[1024];
  29. while ((len = in.read(bytes)) != -1) {
  30. fos.write(bytes, 0, len);
  31. }
  32. // 回复客户端
  33. // 获取字节输出流 ,回复客户端
  34. OutputStream out = socket.getOutputStream();
  35. out.write("上传成功".getBytes());
  36. } catch (IOException ex) {
  37. ex.printStackTrace();
  38. } finally {
  39. // 释放资源
  40. try {
  41. fos.close();
  42. } catch (IOException e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. }
  47.  
  48. }
  49. }
  1. public class Demo {
  2.  
  3. public static void main(String[] args) throws IOException {
  4. //1.创建服务器对象
  5. ServerSocket server=new ServerSocket(8888);
  6. while(true){
  7. //创建连接获取客户端对象
  8. Socket socket=server.accept();
  9. /*//创建线程(创建线程任务)
  10. new Thread(new Upload(socket)).start();*/
  11. //创建线程任务
  12. Upload up=new Upload(socket);
  13. //创建线程对象
  14. Thread thread=new Thread(up);
  15. //开启线程
  16. thread.start();
  17.  
  18. }
  19.  
  20. }
  21.  
  22. }

JAVA基础之网络通信协议--TCP与UDP的更多相关文章

  1. java基础(31):网络通信协议、UDP、TCP

    1. 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通 ...

  2. Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天

    网络编程 网络模型 *OSI参考模型 *Tcp/IP参考模型 网络通读要素 *IP地址 *端口号 *传输协议 1.找到对方Ip 2.数据要发送到对方指定的的应用程序上,为了标识这些应用程序,所经给这些 ...

  3. java基础篇---网络编程(TCP程序设计)

    TCP程序设计 在Java中使用Socket(即套接字)完成TCP程序的开发,使用此类可以方便的建立可靠地,双向的,持续的,点对点的通讯连接. 在Socket的程序开发中,服务器端使用serverSo ...

  4. java基础:网络编程TCP,URL

    获取域名的两种方法: package com.lanqiao.java.test; import java.net.InetAddress;import java.net.UnknownHostExc ...

  5. 网络通信协议tcp,udp区别

    1 网络通信协议 Tcp udp的区别 重点(*****) Tcp三次握手四次挥手(******) udp客户端多人聊天 import socket udp_client = socket.socke ...

  6. 黑马程序员:Java基础总结----网络编程

    黑马程序员:Java基础总结 网络编程   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...

  7. Socket网络编程TCP、UDP演示样例

    Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(O ...

  8. 【基础网络】TCP与UDP 的区别

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  9. day27 网络通信协议 tcp/udp区别

    今日主要内容: 一.网络通信协议 二.tcp udp协议下的socket 一.网络通信协议 1.1互联网的本质就是一系列的网络协议 本机IP地址('127.0.0.1',xxxx) 互联网连接的电脑互 ...

随机推荐

  1. Redis 客户端安装与远程连接图解

    Linux环境:Centos 6.8 Redis服务端版本:3.2.6 Redis客户端下载链接:https://redisdesktop.com/download 省略Linux系统安装Redis教 ...

  2. [转]JavaScript的实例化与继承:请停止使用new关键字

    JavaScript中的new关键字可以实现实例化和继承的工作,但个人认为使用new关键字并非是最佳的实践,还可以有更友好一些的实现.本文将介绍使用new关键字有什么问题,然后介绍如何对与new相关联 ...

  3. TTY,Console以及Terminal

    TTY可以理解是一种终端显示.可以在/dev文件夹看到多个tty开头的文件,可以通过alt+Fn(n=1~6)来进行切换.这个是不是和GUI场景下的多个Terminal窗口是一致的呢? 伪TTY是指一 ...

  4. MQTT协议简介及协议原理

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...

  5. HDU4391(线段树+剪枝)

    Paint The Wall Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 我对sobel算子的理解

    转自:http://blog.csdn.net/yanmy2012/article/details/8110316 索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分 ...

  7. JavaScript高级程序设计学习笔记第十四章--表单

    1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...

  8. FZU 2057 家谱(dfs)

    Problem 2057 家谱 Accept: 129    Submit: 356Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem ...

  9. 51Nod - 1092 回文字符串(添加删除字符LCS变形)

    回文字符串 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca, ...

  10. C# 写 LeetCode easy #7 Reverse Integer

    7.Reverse Integer Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 ...