Socket之UDP和TCP协议
来源:互联网 发布:软件合作模式吗 编辑:程序博客网 时间:2024/06/05 01:15
网络模型
TCP协议与UDP协议区别
Http协议底层实现原理。
二、什么是网络模型
网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。
现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。
在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。
连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。
在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule这类软件了。
什么是Socket?
Socket就是为网络服务提供的一种机制。
通讯的两端都有Sokcet
网络通讯其实就是Sokcet间的通讯
数据在两个Sokcet间通过IO传输。
TCP与UDP在概念上的区别:
udp: a、是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接
b、每个数据报的大小在限制64k内
c、因无连接,是不可靠协议
d、不需要建立连接,速度快
tcp: a、建议连接,形成传输数据的通道.
b、在连接中进行大数据量传输,以字节流方式
c 通过三次握手完成连接,是可靠协议
d 必须建立连接m效率会稍低
TCP握手协议
在TCP/IP协议中,TCP协议采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=J+1),同时自己也发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器V状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
通过UDP协议实现课程案例,客户端与服务器端进行传输
实现UDP客户端发送代码
package itmayi;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;/** * 1、创建Socket服务,明确一个端口。 * 2接受数据 * 3、将其中的所需要的数据取出来 ip data 端口 * 4、关闭资源 * @author zzq * */public class UdpSocketServer {public static void main(String[] args) throws IOException {System.out.println("UDP接受数据启动");//1、创建Socket服务,明确一个端口DatagramSocket datagramSocket = new DatagramSocket(9999);//2、定义接受数据格式,需要将收到的数据存储到数据包中byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);//3.接受数据,并且有阻塞功能datagramSocket.receive(dp);//IP地址String ip = dp.getAddress().getHostAddress();//端口号int port =dp.getPort();//数据String str = new String(dp.getData(),0,dp.getLength());System.out.println(ip + "----port:"+ port + "-----" + str);datagramSocket.close();}}
package itmayi;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;/** * 思路:1、建立可以实现UDP传输的socket服务。 * 2、明确具体发送的数据 * 3、通过socket服务将具体的数据发送出去。 * 4、关闭服务客户端 * @author zzq * */public class UdpSocketClient {public static void main(String[] args) throws SocketException {System.out.println("UDP发送端启动成功");//1、建立可以实现UDP传输的socket服务DatagramSocket datagramSocket = new DatagramSocket();//2、明确具体发送的数据String str = "注意啦,UDP发送数据来啦!";byte[] bytes = str.getBytes();//3、通过socket服务将具体的数据发送出去try {//参数1、字节数据 参数2、字节长度 参数3、发送端IP地址 参数4端口号InetAddress serverIpAddres = InetAddress.getByName("192.168.11.147");DatagramPacket DatagramPacket = new DatagramPacket(bytes,bytes.length,serverIpAddres,9999); // 通过套接字发送数据: datagramSocket.send(DatagramPacket); } catch (Exception e) {}finally{//4、关闭socket服务datagramSocket.close();}}}
TCP的代码:
package itmayi;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;/*** 创建TCP服务器端 * 思路: * 1.创建Socket服务器端服务。服务器端为了让客户端可以连接上,必须提供端口。监听一个端口。* 2.获取客户端对象。通过客户端的Sokcet流和对应的客户端进行通讯。* 3.获取客户端的Socket流读取流。* 4.读取数据并显示在服务器端* 5.关闭资源*/public class TcpServer {public static void main(String[] args) throws IOException {System.out.println("服务器端成功");//1、创建Socket服务器ServerSocket serverSocket = new ServerSocket(10003);//2、获取与客户端进行连接,阻塞Socket accept = serverSocket.accept();String ip = accept.getInetAddress().getHostAddress();System.out.println("ip:"+ip);// 3.通过客户端对象获取Socket流的对象InputStream inputStream = accept.getInputStream();byte[] buf = new byte[1024];int len = inputStream.read(buf);String str = new String(buf,0,len);System.out.println(str);//4.关闭连接accept.close();//先关闭客户端连接serverSocket.close();//再关闭服务器端的连接}}
package itmayi;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;/*** tcp客户端的建立* 思路: * 1.建立TCP客户端服务* 1.1因为是面向连接,必须有连接可以进行通讯。* 1.2在创建客户端时,就必须明确的地址和端口 * 2.一旦连接建立,就有了传输数据的通道。就可以在通道进行数据传输* 这个传输其实就是通过流实现的。*/public class TcpClient {public static void main(String[] args) throws UnknownHostException, IOException {System.out.println("客户端开始发送数据了");//1、服务器端连接IP地址2、服务器端端口号Socket socket = new Socket("192.168.1.111",1003);//2、获取Socket流中的输出流,将数据发送给服务器端OutputStream outpurtStream = socket.getOutputStream();// 3.通过输出流写入数据outpurtStream.write("TCP协议客户端来啦".getBytes());// 4.关闭连接socket.close();}}
- Socket之TCP和UDP协议通信
- Socket之UDP和TCP协议
- 基于Socket的UDP和TCP协议
- socket之TCP UDP
- Socket 之TCP UDP
- TCP和UDP Socket
- UDP和TCP 协议
- UDP和TCP协议
- TCP和UDP协议
- TCP和UDP协议
- TCP和UDP协议
- TCP和UDP协议
- TCP和UDP协议
- TCP协议和UDP协议
- 网络编程之UDP协议和TCP协议
- TCP和UDP和Socket
- RPC协议、http协议、tcp/ip协议、udp协议、socket协议以及soap协议都有什么相同点和不同点
- 基于TCP/UDP协议的Socket流程
- 软件测试干货——敏捷测试流程
- 梯度下降
- 第一章 Solidity源文件的结构
- LeetCode-----把'O'变成'X'
- EasyNVR H5无插件直播方案前端架构之:videojs的使用
- Socket之UDP和TCP协议
- 算法题之——最大子串
- java学习必须有明确的路线规划!
- Java 字符串List转int List
- 转义非转义
- 图片上传之前的预览问题
- Android Studio中的TODO和FIXME
- 傻瓜式monkey启动方式
- 1. Two Sum(两数之和) —— Java