Programación de red TCP y UDP
Hay que entender primero la dirección IP, el puerto, el protocolo y
el protocolo: el protocolo TCP y UDP Protocolo
1: protocolo TCP (protocolo de control de transmisión): para el enlace, enlace de tres vías, la baja eficiencia, seguridad y fiabilidad.
2: protocolo UDP (UserDatagramProtocol): Enlaces no orientadas, /'. Alta velocidad y eficiencia, no distingue entre el cliente y el servidor es en realidad (IP + puerto), se pueden perder datos. Qq como SMS
simulación de tráfico UDP
lado de recepción de datos
package cn.hp.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* socket 网络编程 基于udp网络协议的发送方
* 2:接收Receive
* 创建DatagramSocket指定端口
* 创建DatagramPacket 指定数组 长度
* 使用DatagramSocket发送DatagramPacket
* 从DatagramPacket中获取数据
* 关闭DatagramSocket
*/
public class UDPReceive1 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9999);
while (true) {
//创建一个数据包对象,用于接收发送方,发送过来的 字节数组数据
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
socket.receive(packet);
//取出接收数据
byte[] data = packet.getData();
//取出接收数据长度
int length = packet.getLength();
String result = new String(data, 0, length);
System.out.println(result);
}
}
}
lado de la transmisión de datosmensajes de texto qq enviar analógicas
package cn.hp.udp;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* ----升级版本
* socket 网络编程 基于udp网络协议的发送方
* 1:发送send
* 创建DatagramSocket随机端口
* 创建DatagramPacket 指定数据 长度 地址 端口
* 使用DatagramSocket发送DatagramPacket
* 关闭DatagramSocket
*/
public class UDPSend1 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();//创建DatagramSocket随机端口
Scanner scanner = new Scanner(System.in);
//通过死循环 不断发送消息到接收方
while (true) {
String data = scanner.nextLine();
if ("qqq".equals(data)){
break;//跳出死循环发送终止
}
InetAddress ipAddr = InetAddress.getByName("localhost");//指定本机ip地址
DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.length(), ipAddr, 9999);//创建DatagramPacket 指定数据 长度 地址 端口
socket.send(packet);//发送DatagramPacket数据
}
socket.close();
}
}
Analógico de comunicación TCP
cliente
package cn.hp.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class Clicent {
/**
* 1.客户端
* * 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* * 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* * 输入流可以读取服务端输出流写出的数据
* * 输出流可以写出数据到服务端的输入流
*/
public static void main(String[] args)throws IOException {
Socket socket =new Socket(InetAddress.getByName("localhost"),8888);//创建Socket对象
//输入流,用于读取服务器的数据
InputStream is = socket.getInputStream();
//输出流,用于向服务器写数据
OutputStream os = socket.getOutputStream();
//读取服务端数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
//将读取的数据打印出来,观察结果
String result = new String(bytes,0,len);
System.out.println(result);
//2:向服务端写入数据
os.write("我是客户端,向你发送数据".getBytes());
socket.close();
}
}
el servidor
package cn.hp.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* * 2.服务端
* * 创建ServerSocket(需要指定端口号)
* * 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* * 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* * 输入流可以读取客户端输出流写出的数据
* * 输出流可以写出数据到客户端的输入流
*/
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();//调用accept拿到一个socket对象
//拿到输入流和输出流,分别读取客户端发送的请求数据,响应数据到客户端
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
os.write("我是客户端响应给服务端的数据".getBytes());
//读取客户端的请求参数
byte[] bytes = new byte[1024];
int len = is.read(bytes);
//将读取的数据打印出来,观察结果
String result = new String(bytes,0,len);
System.out.println(result);
}
}