网络编程之TCP和UDP
首先要了解ip地址,端口,和协议
协议:Tcp协议和Udp协议
1:Tcp协议(transfer control protocol):面向链接,三次握手,效率低,安全可靠。
2:Udp协议(UserDatagramProtocol):非面向链接,/‘。速度快效率高,不区分客户端和服务端,实际上就是(ip+端口),数据可能丢失。如qq短信
模拟UDP通信
接收数据方
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);
}
}
}
发送数据方模拟qq发送短信
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();
}
}
模拟Tcp通信
客户端
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();
}
}
服务端
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);
}
}