java udp tcp协议_【java】TCP和UDP传输协议
TCP协议和UDP协议的比较
TCP的全称是Transmission Control Protocol (传输控制协议)
传输控制协议,是一种面向连接的协议,类似打电话
在通信的整个过程中保持连接
保证了数据传递的可靠性和有序性
是一种全双工的字节流通信方式
服务器压力比较大,资源消耗比较快,发送数据效率比较低
UDP是User Datagram Protocol(用户数据报协议)
用户数据报协议,是一种非面向连接的协议,类似写信
在通信的整个过程中不需要保持连接
不保证数据传输的可靠性和有序性
是一种双全工的数据报通信方式
服务器压力比较小,资源比较低,发送效率比较高
基于TCP的网络编程模型
服务器:
创建ServerSocket的对象并且提供端口号, public ServerSocket(int port)
等待客户端的请求连接,使用accept()方法, public Socket accept()
连接成功后,使用Socket得到输入流和输入流,进行通信
关闭相关资源
客户端:
创建Socket类型的对象,并且提供IP地址和端口号, public Socket(String host, int port)
使用Socket构造输入流和输出流进行通信
关闭相关资源
下面这个例子
1 /*
2 * 在提供端口号的时候应该注意:最好定义在1024~49151。3 */
4 public classTestServerString {5
6 public static voidmain(String[] args) {7 try{8 //1.创建ServerSocket类型的对象,并提供端口号
9 ServerSocket ss = new ServerSocket(8888);10 //2.等待客户端的连接请求,使用accept()方法,保持阻塞状态
11 while(true){12 System.out.println("等待客户端的连接请求...");13 Socket s =ss.accept();14 newServerThread(s).start();15 System.out.println("客户端连接成功!");16 }17
18 }catch(Exception e){19 e.printStackTrace();20 }21
22 }23
24 }
TestServerString类
在TestServerString类中采用循环相应多个客户端的连接,
1 public class ServerThread extendsThread{2
3 privateSocket s;4
5 publicServerThread(Socket s){6 this.s=s;7 }8
9 @Override10 public voidrun(){11 try{12 BufferedReader br = newBufferedReader(13 newInputStreamReader(s.getInputStream()));14 PrintStream ps = newPrintStream(s.getOutputStream());15 //编程实现服务器可以不断地客户端进行通信
16 while(true){17 //服务器接收客户端发来的消息并打印
18 String str =br.readLine();19 //当客户端发来"bye"时,结束循环
20 if("bye".equalsIgnoreCase(str)) break;21 System.out.println(s.getLocalAddress()+":"+str);22 //向客户端回发消息“I received!”
23 ps.println("server received!");24 }25 //4.关闭相关的套接字
26 ps.close();27 br.close();28 s.close();29 }catch(Exception e){30 e.printStackTrace();31 }32 }33 }
ServerThread
在输入流和输出流中采用循环可客户端传输信息
1 public classTestClientString {2
3 public static voidmain(String[] args) {4
5 try{6 //1.创建Socket类型的对象,并指定IP地址和端口号
7 Socket s = new Socket("127.0.0.1", 8888);8 //2.使用输入输出流进行通信
9 BufferedReader br = newBufferedReader(10 newInputStreamReader(System.in));11 PrintStream ps = newPrintStream(s.getOutputStream());12 BufferedReader br2 = newBufferedReader(13 newInputStreamReader(s.getInputStream()));14 //编程实现客户端不断地和服务器进行通信
15 while(true){16 //提示用户输入要发送的内容
17 System.out.println("请输入要发送的内容:");18 String msg =br.readLine();19 ps.println(msg);20 //当客户端发送"bye"时,结束循环
21 if("bye".equalsIgnoreCase(msg)){22 break;23 };24 //等待接收服务器的回复,并打印回复的结果
25 String str2 =br2.readLine();26 System.out.println("服务器发来的消息是:" +str2);27 }28 //3.关闭Socket对象
29 br2.close();30 br.close();31 ps.close();32 s.close();33 }catch(Exception e){34 e.printStackTrace();35 }36
37 }38
39 }
TestClientString
在客户端中采用循环,可以让客户端与服务器建立一次连接,实现多次通信
基于UDP的网络编程模型
发送方:
创建DatagramSocket类型的对象,不需要提供任何信息, public DatagramSocket()
创建DatagramPacket类型的对象,指定发送的内容、IP地址、端口号, public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
发送数据,使用send()方法, public void send(DatagramPacket p)
关闭相关的资源
接收方:
创建DatagramSocket类型的对象,并且指定端口, public DatagramSocket(int port)
创建DatagramPacket类型的对象,用于接收发来的数据, public DatagramPacket(byte[] buf, int length)
接收数据,使用receive()方法, public void receive(DatagramPacket p)
关闭相关资源
例:
发送方:
1 public classUDPSender {2
3 public static voidmain(String[] args) {4 try{5 /*
6 * create DatagramSocket instance7 */
8 DatagramSocket ds=newDatagramSocket();9 //create DatagramPackage instance and specify the content to send ,ip address,port
10 InetAddress ia=InetAddress.getLocalHost();11 System.out.println(ia.toString());12 String str="吴兴国";13 byte[] data=str.getBytes();14 DatagramPacket dp=new DatagramPacket(data,data.length,ia,8888);15 //send data use send()
16 ds.send(dp);17 //create DatagramPacket instance for receive
18 byte []b2=new byte[1024];19 DatagramPacket dp2=newDatagramPacket(b2,b2.length);20 ds.receive(dp2);21 System.out.println("result:"+newString(data));22 //close resorce
23 ds.close();24 }catch(IOException e){25 e.printStackTrace();26 }27 }28
29 }
UDPSender
接收方:
1 public classUDPReceiver {2
3 public static voidmain(String[] args) {4 try{5 /*
6 * create DatagramSocket instance,and support port7 */
8 DatagramSocket ds=new DatagramSocket(8888);9 /*
10 * create DatagramPackage instance for receive data11 */
12 byte []data=new byte[1024];13 DatagramPacket dp=newDatagramPacket(data,data.length);14 /*
15 * receive source16 */
17 ds.receive(dp);18 System.out.println("contents are:"+new String(data,0,dp.getLength()));19 /*
20 * send data21 */
22 String str="I received!";23 byte[] b2=str.getBytes();24 DatagramPacket dp2=
25 newDatagramPacket(b2,b2.length,dp.getAddress(),dp.getPort());26 ds.send(dp2);27 System.out.println("发送成功,ip:"+dp.getAddress());28
29 /*
30 * close resource31 */
32 }catch(SocketException e){33 e.printStackTrace();34 }catch(IOException e){35 e.printStackTrace();36 }37 }38
39 }
UDPReceiver
网络编程中定义端口应注意
互联网中的协议被分为三种,
众所周知(Well Known Ports)端口:编号0~1023,通常由操作系统分配,用于标识一些众所周知的服务。众所周知的端口编号通常又IANA统一分配
注册(Registered Ports)端口:编号1024~49151,可以动态的分配给不同的网络应用进程。
私有(Private Ports)端口:编号49159~65535,一般情况下,这些端口不分配网络应用进程。
参考文章:
相关文章:

dot3_bump_mapping
为什么80%的码农都做不了架构师?>>> //----------------------------------------------------------------------------- // Name: ogl_dot3_bump_mapping.cpp // Author: Kevin Harris // Last Modified: 04/21/05 // Descript…

WPF入门教程-转载
最近为了做炫酷的UI,了解了WPF,之前一直是使用winform的,界面也是古老的不行。在园里找到了一个大佬以前写的教程,备注一下。按照系列教程走下来,可以直接上手了。备忘传送门>>>link:DotNet菜园-W…

记一次shell脚本推后台stopped的问题
我们知道linux 下shell可以被分为交互式脚本和非交互式脚本。 交互式脚本即 输入命令之后shell会等待你的输入,当你输入之后命令会被立即提交从而执行。这个时候我们常见的终端bash,以及login提示等都是交互式命令。 非交互式脚本即shell解释器不需要等待…

封装,继承,多态
一、封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义: 封装的意义在于保护或者防止代码(数据…

java将一个数转成36进制的数_编程实现将一个N进制数转换成M进制数。
python: 手写算法版: def conversion_num(num, src, dest): rtn # 1、校验源和目标是否相同 if src dest: rtn num # 2、转成10进制# if src ! 10: num_str str(num) num_str num_str[::-1] exe_num 0 dec_num 0 for num_char in num_str: # 十六进制处理 i…

iOS之Storyboard导航大揭秘(1)
本文使用的软件版本: IOS:6.1 XCode:4.6 Storyboard(故事板)是XCode4.2才开始支持的,为了使设计View更容易。尽管用以前的nib(xib)拖拖拽拽也没问题,不过却需要 在各种文…

nginx的gzip压缩功能
我们在开发网站的时候,应该要考虑到pv,因为pv比较大可能会造成服务器带宽不够用,进而导致用户体验变差。 这个时候我们就可以考虑用nginx的gzip功能。 在nginx中开启gzip压缩功能很简单,之需要在nginx的配置文件nginx.conf中配置以…

C语言的单链表逆序和指定范围逆序
文章目录前言逆序指定范围逆序源码实现前言 关于链表的逆置,是考察对链表指针的理解。知道了如何不实用额外空间,同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解。 同时关于如何在指定范围内对链表逆置同样可以进一步加深理解 逆序 基本过程…

mysql udf 性能_适当的mysql udf
问题不在于参数的类型,而是在调用str_ucwords_init时它是NULL(因为在检索任何行之前调用了str_ucwords_init).要使str_ucwords与字段一起使用,您必须通过在_init函数中将initid-> maybe_null设置为1并在str_ucwords中将* null_value设置为1(并且结果为NULL,尽管这可能不是必…

让Windows7运行速度更快的BIOS优化设置教程
和以前使用WindowsXP一样,很多用户都在设法提高windows7的系统运行速速,比较常见的方法大多是对系统服务进行优化,去掉一些可有可无的系统服务,还有就是优化资源管理器菜单等。除此之外,还有一些“不常见的偏方”&…

开源 免费 java CMS - FreeCMS1.2-功能说明-网上调查
2019独角兽企业重金招聘Python工程师标准>>> 下载地址:http://code.google.com/p/freecms/ 网上调查 从FreeCMS 1.2 开始支持 Admin和站点管理员可以管理站点下所有网上调查,普通用户只可管理自己添加的网上调查。 1. 网上调查管理 从左…

Python 之 杂谈(迭代器iter)、偏函数
1、 l [1,2,3,b,5,6] def func():return l.pop() x iter(func,b) print(x.__next__()) print(x.__next__()) print(x.__next__())执行结果: 遇到“b”就停下 2、偏函数 from functools import partial def add(x,y):return xy func partial(add,1)#将1固定传给x…

C语言的单链表创建:头插法/尾插法
文章目录前言链表头插法链表尾插法源码实现前言 接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了。 链表数据结构得提出 是为了弥补数组上…

java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
java相关:详解Spring加载Properties配置文件的四种方式发布于 2020-4-29|复制链接摘记: 一、通过 context:property-placeholder 标签实现配置文件加载1、用法示例: 在spring.xml配置文件中添加标签..一、通过 context:property-placeholder 标签实现配置…

objective-c abort() 与 exit() 函数的区别
exit()函数 调用exit会让用户感觉程序崩溃了,不会有按Home键返回时的平滑过渡和动画效果;另外,使用exit可能会丢失数据,因为调用exit并不会调用-applicationWillTerminate:方法和UIApplicationDelegate方法; abort() a…

用户、组的管理常用到的命令介绍
在LINUX系统管理中,我们经常添加删除修改用户和组的信息,所以我们来学习下创建删除修改用户和组 下面我们就来简单的说下什么是组、什么是用户的概念? 用户: 其实简单的理解就是文件或者目录创建的一种标识。 组: 组简…

react生命周期函数
在react中,生命周期函数指的是组件在加载前,加载后,以及组件更新数据和组件销毁时触发的一系列方法。通常分为以下几类: 组件加载的时候触发的函数:constructor 、componentWillMount、 render 、componentDidMount 组…

C语言的单链表求交点
单链表求交点,问题如下: 使用o(1)的空间复杂度,求两个链表相交的时候的交点,这个思想就类似于使用o(1)的空间复杂度和o(n)的时间复杂度来求链表的第k个节点。 过程如下: 获取两个链表的长度将较长的链表移动和短链表…

jquery中如何以逗号分割字符串_百度知道
jquery中如何以逗号分割字符串_百度知道javascript本身就是带split方法的定义和用法split() 方法用于把一个字符串分割成字符串数组。语法stringObject.split(separator,howmany)参数 描述separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。…

mysql 前台启动_从Windows命令行启动MySQL
可以从命令行手动启动MySQL服务器。可以在任何版本的Windows中实现。要想从命令行启动mysqld服务器,你应当启动控制台窗口(或“DOS window”)并输入命令:C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld根据系统中MySQL安装位置…

设置datagridview的数据源为(DATASET)SQL查寻结果
private void button5_Click(object sender, EventArgs e)02 {03 if (MessageBox.Show("确认删除该行吗?", "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) DialogResult.Yes )04 {05 SqlConnection conn new SqlConnection();0…

vim中文手册
http://vimcdoc.sourceforge.net/doc/help.html转载于:https://www.cnblogs.com/answercard/p/10125611.html

C语言单链表求环,并返回环的起始节点
若链表中存在环,找出其中的环所在的节点,否则,返回NULL 在没有C set容器的优势前提下,我们对这样的环型的寻找以及定位可以利用快慢指针来实现。 有环的存在,类似与操场跑圈,必然存在快慢之分。有了快慢&a…

CSS3无前缀脚本prefixfree.js与Animatable使用介绍
要求 必备知识 本文要求基本了解 JAVASCRIPT 和 和 CSS3 基本知识。 运行环境 桌面端:IE9 ,Opera 10,火狐3.5 ,Safari 4和Chrome浏览器;移动端:移动Safari,Android浏览器,Chrome浏览器和Opera Mobile。 演示地址 演示…

mysql的优化之table_open_cache 篇_mysql性能优化之table_open_cache
表现:数据库查询效率慢,show processlist 发现比较多的查询正在opening table。进一步确认,执行以下语句:mysql> show global status like open%tables%;------------------------| Variable_name | Value |----------------…

AIX系统日志学习笔记之一
AIX系统上线之后,难免会出现错误,为了应对错误,aix提供了很多处理错误的方法和日志记录机制,为修复故障和系统提供方便。 Errdemon是aix的一个守护进程,该进程会实时检查/dev/drror设备文件,查看是否有新的…

C语言的单链表分割
已知链表头指针head与数值x,将所有小于x的节点放在大于或等于x 的节点前,且保持这些节点的原来的相对位置。 这个过程有点类似于快速排序,寻找一个阈值,比该阈值小的放左边,比该阈值大的放右边。只是由数组遍历变为来…

java面试时候算法题多吗_java程序员面试中最容易被问到的18个算法题(附答案!)...
作者:cpp软件架构狮链接:https://www.toutiao.com/i6618515311836529156/(点击阅读原文前去围观)算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。而根据统计,以下这18个问题是面试中最容易遇到的,本文…

Ubantu Mark
说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装、卸载和删除的方法。 一、Ubuntu中软件安装方法 1、APT方式 (1)普…

Linux挂载Windows共享目录
手工挂载: mount -t cifs -o usernameXXX,passwordXXX //IP/共享目录 /挂载目录 自动挂载: 在etc/fstab加入 //IP/共享目录 /挂载目录 cifs defaults,auto,usernameXXX,passwordXXX 0 0 重启转载于:https://blog.51cto.com/kenzhuang/1149033