公司有计划打算做消息推送,自己也是闲着没事稍微了解一下,从基础开始学习以便真正使用的时候不用太过紧张吧。消息推送在各种应用非常的常见,这是网络编程的一种,还是从根本上开始了解吧。

一、IP和端口号

网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接收数据的计算机或者发送数据的计算机。这个标识号就是IP地址,唯一标识计算机,IP地址现在广泛使用版本是IPv4。一张图说明IP地址和端口号的作用。

二、InteAddress

JDK中提供一个类InteAddress,该类封装了IP地址,提供与IP地址相关的方法。

方法声明

功能描述

InetAddress getByName(String host)

参数host代表指定主机,给定主机的主机名,确定主机IP

InetAddress getLocalhost()

创建一个本地主机的InetAddress对象

String getHostName()

得到IP地址对于的主机名,若是本机则是计算机名,不是则是域名,没有域名则是IP地址

boolean isReachable(int timeout)

判断指定时间内地址能否到达

String getHostAddress()

得到字符串格式的IP地址

用demo说明上述方法

package test;import java.net.InetAddress;public class InetAddressDemo
{/*** @Title: main* @Description: InetAddress的常用方法* @author 贾文静* @param args* @throws Exception* @throws* @date:2017-5-16.上午9:04:36*/public static void main(String[] args) throws Exception{// 创建表示本机的InetAddress对象InetAddress localAddress = InetAddress.getLocalHost();// 在给定主机名的前提下创建InetAddress对象InetAddress remoteAddress = InetAddress.getByName("www.baidu.com");// 获取PC的ip地址System.out.println("本机的IP地址:" + localAddress.getHostAddress());// 根据主机名创建的InetAddress获取IP地址System.out.println("baidu的IP地址:" + remoteAddress.getHostAddress());// 判断本机在指定时间中能否到底目标主机,demo演示3秒钟本机能否到百度的地址System.out.println("3秒是否可达:" + remoteAddress.isReachable(3000));// 得到IP地址的主机名System.out.println("baidu的主机名:" + remoteAddress.getHostName());// 获取本地的主机名System.out.println("本机的主机名:" + localAddress.getHostName());}}

运行显示:

三、通信

通信协议有两种UDP和TCP,从简单的程度来说UDP发送端和接收端不需要建立逻辑连接,一次发送就可以解决。而TCP需要“三次握手”才能完成。所以这两种方式的通信过程是不同的。

1、UDP

发送过程需要两个类DatagramPacket和DatagramSocket。

DatagramPacket类似于物流中心两个站点发送的货物,发送的货物一般都在装载到集装箱中。而UDP中发送和接收的数据也需要一个集装箱进行打包,DatagramPacket就承担了这项任务,对数据进行装载。有了集装箱还有需要有站点来接收货物,DatagramSocket就类似于站点接收“集装箱”。

接收端

package test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class DatagramPacketServer
{/*** @Title: main* @Description: UDP接收端Demo* @author 贾文静* @param args* @throws Exception* @throws* @date:2017-5-16.上午9:51:30*/public static void main(String[] args) throws Exception{// 用于存放接收的数据byte[] buf = new byte[1024];// DatagramSocket类似于码头,接收DatagramPacket的数据包// 定义一个datagramsocket对象,端口号为8954DatagramSocket ds = new DatagramSocket(8954);// DatagramPacket类似于集装箱,封箱发送端和接收端的数据// 指定了封装数据字节数组和数据的大小DatagramPacket dp = new DatagramPacket(buf, 1024);System.out.println("等待接收数据");// 接收发送端的数据,如果没有则进入堵塞状态ds.receive(dp);// 获取发送数据的具体内容,长度,获取发送的IP地址字符串格式的ip地址,以及端口号String str = new String(dp.getData(), 0, dp.getLength()) + "from"+ dp.getAddress().getHostAddress() + ":" + dp.getPort();// 打印获取到的内容System.out.println(str);// 释放资源ds.close();}}

展示一下什么叫做进入堵塞状态,就是在发送端还没有传递数据的时候即发送端没有运行的时候:
    

发送端:

package test;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @ClassName: DatagramPacketClient* @Description: 发送端展示* @author 贾文静* @date 2017-5-16 上午9:52:02* */
public class DatagramPacketClient
{public static void main(String[] args) throws Exception{// 创建一个datagramsocket对象,指定端口为3000,如果不指定,在运行期间端口随意分配DatagramSocket ds = new DatagramSocket(3000);// 要发送的数据String str = "hello world";// 创建一个要发送的数据包,包括发送数据,数据长度,接收端ip地址以及端口号DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(),InetAddress.getByName("jiawenjing"), 8954);System.out.println("发送信息");// 发送数据ds.send(dp);// 释放资源ds.close();}
}

此时运行发送端之后再看接收端的显示内容。

2、TCP

TCP和UDP一样都是两台计算机之间的通信,通信端都需要创建Socket对象,区别在于UDP只需要发送端和接收端,不区分客户端和服务端,计算机之间可以任意发送数据。而TCP通信严格区分客户端和服务端,必须由客户端首先去连接服务端才能实现通信。服务端不能主动连接客户端,而且服务端程序需要事先启动,等待客户端连接。

JDK中提供Socket类表示客户端,ServerSocket表示服务端。首先创建一个ServerSocket对象,相当于开启一个线程,等待客户端连接。客户端创建一个Socket对象发送请求连接。

服务端:

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TcpServer
{public static void main(String[] args) throws Exception{// 创建TCPServer对象,调用listen()方法new TcpServer().listen();}// 创建一个通信端口private static final int PORT = 7788;public void listen() throws Exception{// 创建ServerSocket对象,并且指定了端口号ServerSocket serverSocket = new ServerSocket(PORT);// 调用ServerSocket对象的accept()方法接收数据Socket client = serverSocket.accept();// 获取客户端的输出流OutputStream os = client.getOutputStream();System.out.println("开始与客户端交换数据");//输出到客户端os.write(("欢迎你来访").getBytes());// 模拟执行其他功能占用的时间Thread.sleep(5000);System.out.println("结束与客户端交互数据");os.close();client.close();}}

客户端:

import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;public class TcpSocket
{public static void main(String[] args) throws Exception{// 创建TCPSocket连接,客户端去连接数据new TcpSocket().connect();}// 创建通信端口与要连接的服务端一致private static final int PORT = 7788;public void connect() throws Exception{// 创建Socket对象,连接到给出地址以及端口号Socket client = new Socket(InetAddress.getLocalHost(), PORT);// 得到接收数据的流InputStream is = client.getInputStream();// 定义1024个字节数组的缓冲区byte[] buf = new byte[1024];// 将数据读到缓冲区中int len = is.read(buf);// 将缓冲区中的数据输出System.out.println(new String(buf, 0, len));// 关闭socket对象,释放资源client.close();}}

总结

IP和端口是网络编程开始的前提,对常用方法个人认为必须有个很好的认知。网络编程涉及到UDP和TCP通信的几个类,还有相关的方法具体还需要多多练习使用。

转载于:https://my.oschina.net/u/3705835/blog/1550105

【网络编程】——UDP和TCP通信方式相关推荐

  1. Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制

    三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0);       //获取文件的Mode值     fcntl(sockfd, F ...

  2. 关于JAVA网络编程UDP和TCP(上)

    对于JAVA的网络编程我们又称之为socket编程.首先,网络编程,顾名思义,要涉及到网络,其中网络协议是必不可少的对于我们而言,一个重要的网络协议是大家要会的:TCP/IP协议,udp协议. 一.网 ...

  3. Linux网络编程-UDP和TCP协议详解

    1|0一. 引言 网络协议是每个程序员都要掌握的基础知识,干啥都离不开网络,就算在家里新买了个路由器不是吗,同事连不上网,你的女朋友手机没有网看剧了正看到高潮部分,到那时候你打开百度......那嫌弃 ...

  4. 网络编程——TCP网络编程UDP编程

    1.计算机网络:将分布在不同区域不同地方的多台计算机和网络设备通过线程连接起来组成一套大型系统,来实现计算机之间的信息传递和资源共享的设备. 2.网络编程:编写一个程序来实现网络间信息传递. 网络编程 ...

  5. 【Linux】网络编程三:TCP通信和UDP通信介绍及代码编写

    参考连接:https://www.nowcoder.com/study/live/504/2/16. [Linux]网络编程一:网络结构模式.MAC/IP/端口.网络模型.协议及网络通信过程简单介绍 ...

  6. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  7. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    TCP/IP网络编程之基于TCP的服务端/客户端(一) 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于 ...

  8. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接 ...

  9. java网络编程,通过TCP,Socket实现多对一的局域网聊天室

    java网络编程,通过TCP,Socket实现多对一的局域网聊天室 可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端 这是服务器端的代码 View Code import j ...

  10. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

最新文章

  1. 程序员伤不起的年龄——30岁
  2. requests payload_python+Requests接口自动化测试之传递 URL 参数
  3. python matplotlab.pyplot.scatter() 函数的用法
  4. web前端技术分享:web前端的求职前景好不好?
  5. 时光机穿梭---版本回退
  6. 上传Text文档并转换为PDF
  7. win10安装masm32 SDK并运行一个小程序
  8. 假如一种编程语言代表一个国家,哎哟,有意思了!
  9. batch spring 重复执行_可能是最漂亮的Spring事务管理详解
  10. EDUCoder编程练习题解(字符数组)
  11. Qt5学习笔记之QQ登录界面一:制作界面
  12. matlab算薄板模态,基于MATLAB计算FGM薄板刚柔耦合动力学响应的仿真方法与流程
  13. win10无法执行vbs脚本
  14. GUI 尚学堂马士兵视频上留的作业,自己改出来的
  15. 指针数组和二维数组指针
  16. Android技术分享| 自定义LayoutManager
  17. 【机器学习实战】决策树算法:预测隐形眼镜类型
  18. 曝一段十多年前的“情史”!
  19. java生成二维码,并在前端展示。
  20. 软考 | 2019年上半年 软件设计师 下午试卷

热门文章

  1. JS 阻止冒泡 阻止默认
  2. 入耳式降噪耳机哪款好?2021新款入耳式降噪耳机推荐
  3. linux debian 修改终端字体大小
  4. 解决SC封装WIN10报错
  5. python 定时播放音乐_python – 如何在第一首歌曲结束后安排音频文件在pygame中自动播放?...
  6. wps/word 自动换行插入回车符 JS宏代码
  7. js中466/60取余
  8. python实现录音小程序 界面_python怎么对矩阵添加一列python实现录音小程序
  9. Java 初始化和清理
  10. 歪歪提权器 【完全骗子罢了】