UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
UDP传输发送端思路
1:建立udp的socket服务
2:将要发送的数据封装成数据包
3:通过udp的socket服务,将数据包发送出
4:关闭资源
点击查看代码
public class SendDemo1 {
public static void main(String[] args) throws Exception {
// 1:建立udp的socket服务
// DatagramSocket
//DatagramSocket()
//构造数据报套接字并将其绑定到本地主机上的任何可用端口。
// 1:建立udp的socket服务
DatagramSocket socket = new DatagramSocket();
// 2:将要发送的数据封装成数据包 DatagramPacket
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
byte[] bytes = "他见到我,跑着过来了".getBytes();
int length = bytes.length;
InetAddress address = InetAddress.getByName("192.168.22.25");
DatagramPacket packet = new DatagramPacket(bytes, length, address, 10086);//10086是自己给定的端口号
// 3:通过udp的socket服务,将数据包发送出
//public void send(DatagramPacket p)
socket.send(packet);
// 4:关闭资源
socket.close();
}
}
UDP传输接收端思路
1:建立udp的socket服务.
2:通过receive方法接收数据
3:将收到的数据存储到数据包对象中
4:通过数据包对象的功能来完成对接收到数据进行解析.
5:可以对资源进行关闭
点击查看代码
public class ReceiveDemo1 {
public static void main(String[] args) throws Exception {
// 1:建立udp的socket服务.
//
DatagramSocket socket = new DatagramSocket(10086);//发送端和接收端的端口号要保持一致
// 2:通过receive方法接收数据
// 3:将收到的数据存储到数据包对象中
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
socket.receive(packet);
// 4:通过数据包对象的功能来完成对接收到数据进行解析
byte[] data = packet.getData();
int length = packet.getLength();
String s = new String(data, 0, length);
System.out.println("收到的数据:" + s);
}
}
InetAddress: java提供的类,用于表示ip地址
点击查看代码
public class InetAddressDemo1 {
public static void main(String[] args) throws Exception{
// static InetAddress getLocalHost()
//返回本地主机的地址。
InetAddress ip1 = InetAddress.getLocalHost();
System.out.println(ip1);
// String getHostName()
//获取此IP地址的主机名。
String hostName = ip1.getHostName();
//String getHostAddress()
//获取此IP地址
String address = ip1.getHostAddress();
System.out.println("主机名:"+hostName+",ip地址:"+ address);
}
}
实现聊天室
发送端
点击查看代码
public class SendDemo1 {
public static void main(String[] args) throws Exception{
// 1:建立udp的socket服务
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while(true){
// 2:将要发送的数据封装成数据包
System.out.println("请输入发送内容:");
String data = sc.nextLine();
byte[] bytes = data.getBytes();
int length = bytes.length;
InetAddress address = InetAddress.getByName("192.168.22.25");
DatagramPacket packet = new DatagramPacket(bytes, length, address, 10000);
// 3:通过udp的socket服务,将数据包发送出
socket.send(packet);
if("886".equals(data)){
System.out.println("用户已经离开");
break;
}
}
// 4:关闭资源
socket.close();
}
}
接收端
点击查看代码
public class ReceiveDemo1 {
public static void main(String[] args) throws Exception{
// 1:建立udp的socket服务.
DatagramSocket socket = new DatagramSocket(10000);
// 2:通过receive方法接收数据
// 3:将收到的数据存储到数据包对象中
System.out.println("==============欢迎来到聊天室=================");
while(true){
byte[] bytes = new byte[1024];
int length = bytes.length;
DatagramPacket packet = new DatagramPacket(bytes, length);
socket.receive(packet);
// 4:通过数据包对象的功能来完成对接收到数据进行解析.
byte[] data = packet.getData();
int length1 = packet.getLength();
String s = new String(data, 0, length1);
InetAddress address = packet.getAddress();
String hostName = address.getHostName();
BufferedWriter bw = new BufferedWriter(new FileWriter("src/com/shujia/day19/recode/" + hostName + ".txt",true));//将用户的聊天内容打包写入
if("886".equals(s)){
System.out.println("=====================");
System.out.println("用户已经下线");
System.out.println("=====================");
}else{
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a").format(new Date());
System.out.println(time);
System.out.println(hostName+":"+s);
bw.write(time);
bw.newLine();
bw.write(s);
bw.newLine();
bw.flush();
}
}
}
}
TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;
通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
TCP传输
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源
TCP传输-客户端代码
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象+的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源
点击查看代码
public class ClientDemo1 {
public static void main(String[] args) throws Exception{
// 1:建立客户端的Socket服务,并明确要连接的服务器。
//Socket(String host, int port)
//创建流套接字并将其连接到指定主机上的指定端口号。
Socket socket = new Socket("192.168.22.15", 12345);
Scanner sc = new Scanner(System.in);
// 3:通过Socket对象的方法,可以获取这两个流
//获取通道中的输出流,将数据发送给服务端
OutputStream outputStream = socket.getOutputStream();
//获取通道中的输入流
InputStream inputStream = socket.getInputStream();
while (true){
System.out.print("请输入要发送的内容:");
String info = sc.nextLine();
if("886".equals(info)){
break;
}
// 4:通过流的对象可以对数据进行传输
outputStream.write(info.getBytes());
outputStream.flush(); // 来自于通道中的类
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
String s = new String(bytes, 0, length);
System.out.println(s);
}
// 5:如果传输数据完毕,关闭资源
// outputStream.close();
socket.close();
}
}
TCP传输-服务器端代码
1:建立服务器端的socket服务,需要一个端口
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
3:通过客户端的获取流对象的方法,读取数据或者写入数据
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
点击查看代码
public class ServerDemo1 {
public static void main(String[] args){
try {
// 1:建立服务器端的socket服务,需要一个端口
//ServerSocket(int port)
//创建绑定到指定端口的服务器套接字。
ServerSocket ss = new ServerSocket(12345);
// 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
Socket socket = ss.accept();
while (true){
InetAddress inetAddress = socket.getInetAddress();
String hostName = inetAddress.getHostName();
// 3:通过客户端的获取流对象的方法,读取数据或者写入数据
// 获取通道中的输入流
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
String s = new String(bytes, 0, length);
System.out.println(hostName+": "+s);
// 获取通道中的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器已接收!".getBytes());
outputStream.flush();
}
}catch (Exception e){
System.out.println("用户已退出。。。");
}
}
}