Socket
Posted tinghao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket相关的知识,希望对你有一定的参考价值。
一、什么是Socket
Socket就是为了网络服务提供的一种机制;
通讯的两端都有Socket;
网络通讯其实就是Socket间的通讯;
数据在两个Socket间通过10传输
二、TCP与UDP造概念上的区别
1、UDP:
(1)是面向无连接,将数据及源的封装成数据包中,不需要建立连接
(2)每个数据报的大小在限制64k内
(3)因无连接,是不可靠协议
(4)不需要建立连接,速度快
2、TCP:
(1)建议连接,形成传输数据的通道
(2)在连接中进行大数据量传输,以字节流方式
(3)通过三次握手完成连接,是可靠协议
(4)必须建议连接m效率会稍低
三、UDP协议
1、UDP协议服务端代码
package com.socket.UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * UDP协议的服务端 */ public class UDPServer { public static void main(String[] args) throws Exception { System.out.println("UDP服务端启动=========================="); //创建一个连接,没有传入IP地址就是本机 127.0.0.1 DatagramSocket socket=new DatagramSocket(8080); //接收客户端传递的数据 byte[] bytes=new byte[1024]; DatagramPacket packet=new DatagramPacket(bytes,bytes.length); //等待客户端发送数据包,如果客户端没有建立的情况下,那么会堵塞 socket.receive(packet); //获取来源的IP和端口 System.out.println("IP地址:"+packet.getAddress()+" 端口:"+packet.getPort()); //接受数据 String str=new String(packet.getData(),0,packet.getLength()); System.out.println("客户端发送过来的数据:"+str); } }
2、UDP协议客户端代码
package com.socket.UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; /** * UDP协议的客户端 */ public class UDPClient { public static void main(String[] args) throws Exception { System.out.println("UDP客户端启动成功~"); //创建Scoket对象 DatagramSocket socket=new DatagramSocket(); Scanner scanner=new Scanner(System.in); System.out.println("请输入传输内容:"); String str=scanner.next(); //创建数据包 DatagramPacket packet=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.60.29"),8080); //发送数据包 socket.send(packet); //关闭 socket.close(); } }
3、效果如下
(1)首先启动服务端
(2)启动客户端并发送请求
(3)服务端接收客户端请求
四、TCP协议
1、TCP握手协议
在TCP/IP协议中,TCP协议采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYM包(SYM=J)到服务器,并进入 SYM_SEND状态,等待服务器确认
第二次握手:服务器收到SYM包,必须确认客户的SYM(ACK=J+1),同时自己也发送一个SYM包(SYM=K),即SYM+ACK包,此时服务器V状态
第三次握手:客户端收到服务器的SYM+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
2、四次分手
由于TCP连接是全双工的,因此每个方向必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍然能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭
客户端A发送一个FIN,用它来关闭客户A到服务B的数据传输;
服务器B收到这个FIN,他发回一个ACK,确认序号为收到的序号加1,和SYM一样,一个FIN将占用一个序号。
服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
3、TCP协议服务端代码
package com.socket.TCP; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { System.out.println("tcp服务端启动成功=============================="); //创建连接 ServerSocket socket=new ServerSocket(8080); //获取客户端请求,如果客户端没有请求则堵塞 Socket accept=socket.accept(); //获取客户端传输数据 InputStream inputStream=accept.getInputStream(); byte[] bytes=new byte[1024]; int length = inputStream.read(bytes); System.out.println(new String(bytes,0,length)); } }
4、TCP协议客户端代码
package com.socket.TCP; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class TCPClient { public static void main(String[] args) throws IOException { //创建一个连接 Socket socket=new Socket("127.0.0.1",8080); OutputStream outputStream=socket.getOutputStream(); outputStream.write("我不配".getBytes()); } }
5、效果如下
(1)服务端
(2)客户端
(3)服务端接收客户端请求
以上是关于Socket的主要内容,如果未能解决你的问题,请参考以下文章