[Java]UDP协议和TCP协议socket编程

网络编程主要是指让网络上的主机通过不同的进程,以编程的方式进行网络数据通信,这里只需要进程不同就行,不需要主机不同。

 

一、ip和端口

ip地址:是定位主机在网络上位置的网络地址,ip地址是一个32位的二进制数,一般采用点分十进制的方式来表示,即将32位地址平均分为四个段,每段的范围为0~255,如:255.255.255.255

端口号:用来定位主机进程的标识。网络编程进行通信的是两个进程,ip地址只表名了计算机在网络中的位置,而端口就定位了一台计算机上的进程。进程可以有多个端口号,但是一个端口号同时只能给一个进程。端口号的范围:0~65535

小于1024的端口需要管理员权限打开。骐达端口可以应用程序打开

二、socket套接字

socket套接字是操作体统提供的关于网络编程的api接口,在应用层可以直接调用这个接口来和传输层进行交互。

传输层有TCP和UDP两个比较常用的协议,由于协议不同,对套接字的使用也不同,Java中就有TCP和UDP两种风格的编写方式。

三、UDP协议的编码形式

(1)创建一个DatagramSocket对象,这个对象可以使用有参构造穿一个端口号,也可以使用无参构造,让系统给这个socket对象分配一个还没被使用的端口号。

DatagramSocket socket=new DatagramSocket();
//无参构造,系统自动分配一个未被使用的端口
DatagramSocket socket1=new DategramSocket(4040);
//有参构造,分配4040这个端口号

 一个线程中可以有多个DatagramSocket对象,可以绑定多个端口。

(2)构建DatagramPacket对象。DatagramPacket对象维护的是一个byte数组,数据就是以这个数组的形式传递的,对象还有端口号,ip号byte数组内有多长是有效数据等。

数据报维护的ip地址和端口号是当这个数据被发送时,接收端的ip地址和端口

最基本的就是传入一个字节数组和这个数组的可用长度

DatagramPacket packet=new DatagramPacket(new byte[4096],10);
//创建了一个数据报对象,这个数据报维护了一个数组长度为4096的数组长度,但是packet可用来装数据的长度只有0-9下标这10个空间,10代表length

也有其他的一些可用的构造方法

 ​​​​

 InetAddress是ip地址的表现形式,在实例化DatagramPacket的时候,ip地址要以inetAddress的形式传递,要获得InetAddress的地址需要使用InetAddress的静态方法getByName(String ip);

(3)发送和接收

发送是send(DatagramPacket r)方法,接收是receive(DatagramPacket r)方法,这两个方法都是DatagramSocket对象的方法。

 发送send的目的地是DatagramPacket数据报内维护的ip地址和端口号。

接收方法receive的DatagramPackert参数是一个输出型参数,这个被传入的packet对象的缓冲数组大小如果不够,收到的消息将会被截断,如果足够,被传入的参数的缓冲区length将会被receive方法修改成接收长度的length,ip地址和端口号会被赋值为发送端的ip地址和端口号。

receive方法在没有接收到数据的时候,会阻塞线程。

(4)DatagramPacket的一些常用方法

(一)获得地址

getSocketAdress();这个方法回返回packet对象中的ip地址和端口号都包括的对象

getAdress();这个方法返回inetAddress的形式的IP地址,要转换为String类型还需要调用toStrng方法

getPort();返回端口号

(二)获得缓冲字节数组和可用的缓冲长度

getData();返回缓冲字节数组

getLength();返回可用的缓冲数组长度

四、TCP协议的编码形式

(1)SecverSocket和Socket

SeverSocket是服务器专用的socket类,必须要指定端口号才能实例化(服务器的端口号得确定客户端才能找到)。

Socket类既能在服务器中使用也能在客户端中使用,实例化Socket对象需要传入ip地址和端口号,这里的ip地址就可以直接使用String类型直接实例化。在客户端实例化一个Socket对象就是在连接被传入的ip地址和端口号的服务器。(TCP协议是要连接的)

调用SeverSocket的accept方法就能接收客户端发起的连接请求,连接成功就回返回一个Socket对象。根据在服务器和客户端的这两个不同Socket对象就能实现网络通信。

(2)Socket的inputStream和OutputStream

调用Socket的getInputStream和OutputStream方法就能获得向连接上的对方接收数据和发送数据的输入输出流。(Tcp是面向流数据的)

使用OutputStream就能向对方发数据,使用IntputStream就能接收对方发出来的数据。接收数据如果没有得到消息就会阻塞。

(3)长连接和短连接

由于TCP协议需要连接的特性,产生了长连接和短连接两种编写TCP协议的方式。

长连接:一次连接上,可以根据用户需要,接收和发送多个数据,直到用户一方主动回收socket对象断开连接。

短连接:一次连接上,只能收发指定次数据,然后就自动回收socket对象断开连接。

(4)线程池实现TCP服务器响应多个客户端

由于Tcp协议需要连接,一个线程就只能处理一个客户端的请求。可以服务器中使用线程池,每次连接上,就将返回的Socket对象和响应业务作为一个任务上传给线程池,主线程就一直accept连接。

(5)io多路复用实现单线程TCP服务器响应多个客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值