一、udp: 非面向连接 写信|发短信 只管写只管发 开销小,效率高 不安全 大小有限制 一般不超过60k , 基于字节数组传输
udp实现发送端的基本流程:
package com.shsxt.net03;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
/*
* Socket套接字: 传输层为应用层开辟的小口子,通过 Socket进行发送和接收数据
* 不同协议下的socket实现不同
* 面向Socket编程
*
* tcp: 面向连接 打电话 安全 开销大 基于3次握手 大小没有限制 . 基于流传输
* udp: 非面向连接 写信|发短信 只管写只管发 开销小,效率高 不安全 大小有限制 一般不超过60k , 基于字节数组传输
*
* 基于udp的socket编程:
* 发送端
* 接收端
* DatagramSocket 此类表示用来发送和接收数据报包的套接字。(定义发送端|接收端)
* DatagramPacket数据报包(数据打包)
*
* udp实现发送端的基本流程: 发送端和服务端是平等的
* 1.定义发送端 DatagramSocket(端口号) 指定发送端的端口号
* 2.准备数据
* 3.对数据打包 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
4.发送void send(DatagramPacket p)
5.关闭 void close() 关闭此数据报套接字。
*/
public class UDPSend01 {
public static void main(String[] args) throws IOException {
System.out.println("-------------发送端------------");
//1.定义发送端 DatagramSocket(端口号) 指定发送端的端口号
DatagramSocket send=new DatagramSocket(8888); //发送端的端口号
//2.准备数据
byte[] str="呵呵呵呵呵".getBytes();
//3.打包
DatagramPacket packet=new DatagramPacket(str,0,str.length,new InetSocketAddress("127.0.0.1",9999)); //目的地的IP +端口
//4.发送
send.send(packet);
//5.关闭
send.close();
}
}
UDP接收端基本流程:
package com.shsxt.net03;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
* UDP接收端基本流程:
* 1.定义接收端 DatagramSocket(int port)
* 2.准备字节数组
* 3.准备包裹用来接收数据 DatagramPacket(byte[] buf, int length)
* 4.接收
5.从包裹中获取数据
* byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
6.关闭
*/
public class UDPReceive02 {
public static void main(String[] args) throws IOException {
System.out.println("-------------接收端------------");
//1.定义接收端 DatagramSocket(int port) 指定接收端的端口号
DatagramSocket rec=new DatagramSocket(9999);
//2.准备字节数组
byte[] arr=new byte[1024*60];
//3.打包用来接收数据
DatagramPacket packet=new DatagramPacket(arr,0,arr.length);
//4.接收 阻塞式
rec.receive(packet);
//5.处理数据
byte[] car=packet.getData();
System.out.println(new String(car,0,packet.getLength()));
System.out.println(packet.getLength());
//6.关闭
rec.close();
}
}
二、tcp: 面向连接 打电话 安全 开销大 基于3次握手 大小没有限制 . 基于流传输
TCP客户端:
package com.shsxt.net03;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* Socket 此类实现客户端套接字
* TCP客户端
* 1.定义客户端 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
* 2.IO操作
* 输出流OutputStream getOutputStream() 返回此套接字的输出流。
* 3.刷出
* 4.关闭
*/
public class TCPClient03 {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("--------client------------");
//1.定义客户端 Socket(String host, int port)
Socket socket=new Socket("localhost",9999);
//2.输出流
DataOutputStream out=new DataOutputStream(socket.getOutputStream());
out.writeUTF("你好啊");
//刷出
out.flush();
//关闭
out.close();
socket.close();
}
}
TCP 服务端
package com.shsxt.net03;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
* ServerSocket 此类实现服务器套接字。
* TCP服务端
* 1.定义服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
* 2.阻塞式监听 一个客户端连接成功,就是一个socket
* 3.io操作
* 4.关闭
*/
public class TCPServer04 {
public static void main(String[] args) throws IOException {
System.out.println("--------server------------");
//1.定义服务端 ServerSocket(int port)
ServerSocket server=new ServerSocket(9999);
//2.阻塞式监听
Socket socket=server.accept();
//3.获取流
DataInputStream read=new DataInputStream(socket.getInputStream());
//4.读取数据
String str=read.readUTF();
System.out.println(str);
//5.关闭
read.close();
socket.close();
server.close();
}
}
TCP实现文件上传服务端:
package com.shsxt.net03;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* TCP实现文件上传服务端:
* 1.定义服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
* 2.阻塞式监听 一个客户端连接成功,就是一个socket
* 3.io操作 :从客户端读入数据 --->文件输出流 写出文件中
* 4.刷出
* 5.关闭
*/
public class TCPFileServer06 {
public static void main(String[] args) throws IOException {
System.out.println("--------server------------");
//1.定义服务端 ServerSocket(int port)
ServerSocket server=new ServerSocket(9999);
//2.阻塞式监听
Socket socket=server.accept();
//3.获取流
InputStream read=new BufferedInputStream(socket.getInputStream());
OutputStream out=new BufferedOutputStream(new FileOutputStream("src/hehe.txt"));
//4.读取数据
byte[] arr=new byte[1024];
int len=-1;
while((len=read.read(arr))!=-1){
out.write(arr, 0, len);
}
//5.刷出
out.flush();
//5.关闭
out.close();
read.close();
socket.close();
server.close();
}
}
TCP实现文件上传服务端:
package com.shsxt.net03;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* TCP实现文件上传服务端:
* 1.定义服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
* 2.阻塞式监听 一个客户端连接成功,就是一个socket
* 3.io操作 :从客户端读入数据 --->文件输出流 写出文件中
* 4.刷出
* 5.关闭
*/
public class TCPFileServer06 {
public static void main(String[] args) throws IOException {
System.out.println("--------server------------");
//1.定义服务端 ServerSocket(int port)
ServerSocket server=new ServerSocket(9999);
//2.阻塞式监听
Socket socket=server.accept();
//3.获取流
InputStream read=new BufferedInputStream(socket.getInputStream());
OutputStream out=new BufferedOutputStream(new FileOutputStream("src/hehe.txt"));
//4.读取数据
byte[] arr=new byte[1024];
int len=-1;
while((len=read.read(arr))!=-1){
out.write(arr, 0, len);
}
//5.刷出
out.flush();
//5.关闭
out.close();
read.close();
socket.close();
server.close();
}
}
TCP实现用户登录客户端 :
package com.shsxt.net03;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* TCP实现用户登录客户端 :
*/
public class TCPLoginClient07 {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("--------client------------");
//1.定义客户端 Socket(String host, int port)
Socket socket=new Socket("localhost",9999);
//2.输出流
DataOutputStream out=new DataOutputStream(socket.getOutputStream());
//数据 用户名+密码
String str="name=张三&pwd=123"; //键盘输入接收用户名和密码
out.writeUTF(str);
//刷出
out.flush();
//关闭
out.close();
socket.close();
}
}
TCP实现用户登录服务端:
package com.shsxt.net03;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* TCP实现用户登录服务端:
*/
public class TCPLoginServer08 {
public static void main(String[] args) throws IOException {
System.out.println("--------server------------");
//1.定义服务端 ServerSocket(int port)
ServerSocket server=new ServerSocket(9999);
//2.阻塞式监听
Socket socket=server.accept();
//3.获取流
DataInputStream read=new DataInputStream(socket.getInputStream());
//4.读取数据
String str=read.readUTF();
//"name=张三&pwd=123"
//校验: 用户名=laopei 密码:0523 登陆成功|登录失败
System.out.println(str);
//5.关闭
read.close();
socket.close();
server.close();
}
}