协议-TCP-UDP
tcp:传输控制协议 TRansmission Conrtol protocol。
特点:面向连接的,可靠的,全双工的,字节流协议。面向连接的:先建立连接然后再进行数据的手法。可靠的:数据传输的过程中,有很多进行数据丢失检测的机制。全双工:接数据的同事可以发送数据。
三次握手:简历连接的过程 A-->B:A给B发送连接请求,B回复,A连接。
四次挥手:A与B断开:A队B断开请求,B开始对检测的数据检查。确认后对A发送输出,然后A断开。
TCP,可以保证数据是安全可靠的传输,效率低,消耗资源,会传输多余信息。
udp:用户数据协议 user datagrame protocol
特点:面向无连接,不可靠的,用户数据报协议。
比喻成寄快递,将数据和需要发送的地址+端口号 打成一个数据报,一起扔到网络中,根据地址,传输到指定的接受的地方。优点是效率高。数据包最大只能发送64K。
socket编程
在发送端有一个socket对象,用来发送消息,在接受端也需要一个对应的socket对象,进行接受消息。接受端也可以使用接受信息的socket对象发送消息,发送方也可以使用同一个socket对象接受消息。
使用UDP协议进行socket通信: DatagramSocket:用来手法消息的socket对象。 DatagramPacket:数据包对象。
使用tcp协议:面向连接的,安全的,可靠的,字节流协议。
socket:用来收发消息的socket对象。
ServerSocket:提供服务,创建连接的服务。
UDPsocket编程代码:
//发送数据的对象,若发送方不写端口号,那么系统会默认分配一个。
DatagramSocket ds = new DatagramSocket(CLIENT_PORT);
//将需要发送的数据转换成字节数组。通过io发送
String str = "时光太长";
byte[] buf = str.getBytes();
//对需要发送的数据打包
DatagramPacket dp = new DatagramPacket(buf,buf.length,ip地址,端口号);
//发送数据
ds.send(dp);
//接收数据,创建接受的对象,创建数据包
DatagramSocket ds = new DatagramSocket(SERVER_PORT);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收数据 阻塞方式
int length = dp.getLength();
String str = new String (dp.getData(),0,length);
//或者可以使用io流对数据封装。
ByteArrayOutputStream baos = new ByreArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeBoolean(true);
dos.close();
buf = baos.toByteArray();
//将字节数组欢还原时。
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(dp.getData(),0,dp.getLength());
DataInputStream dis = new DataInputStream(bais);
dis.readBoolean());
TCPsocket编程代码:
//创建连接的服务
ServerSocket ss = new ServerSocket(SERVER_PORT);
//accept阻塞方法,在服务器端监听的服务,监听是否有socket的连接请求,当请求来临,创建socket对象
Socket socket = ss.accept();
//创建io流对象,接受数据
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = br.redLine();
//发送消息
Socket socket = new Socket("ip",SERVER_PORT);
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
String str = "时光太长";
bw.writer(str);
bw.newLine();
bw.flush();
//写到finally中、
dos.close();
br.close();
socket.close();
ss.close();
dis.close()
bw.close();