Cómo TCP establece una conexión
<Cuando hace clic en Ejecutar, primero debe ejecutar el servidor y luego ejecutar el cliente. (Razón: cuando TCP establece una conexión, se comunicará, si no hay respuesta, la conexión fallará)
package NetWorkPrograming;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author:CT
* @Date:2021/2/16
* @Description:NetWorkPrograming
* @Version 1.0
*/
/*
一: 网络通信协议:
① TCP协议 建立连接需要三次握手,四次挥手
② UDP协议 建立连接无需建立连接 但是会丢包
*/
public class NetWorkPrograming02 {
// 客户端
@Test
public void test(){
// 1.创建Socket对象:指明服务器端的IP 和端口号
Socket socket= null;
// 2. 获取输出流去写出数据
OutputStream outputStream = null;
try {
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
socket = new Socket(inetAddress,8899);
outputStream = socket.getOutputStream();
outputStream.write("你好,我是客户端".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 服务器
@Test
public void test1(){
ServerSocket serverSocket = null;
Socket accept = null;
InputStream inputStream = null;
try {
//1. 创建服务器端的Socket 指明自己的端口号
serverSocket = new ServerSocket(8899);
//2. 调用accept() 方法表示可以接受来自客户端的Socket
accept = serverSocket.accept();
//3. 获取输入流
inputStream = accept.getInputStream();
//4. 读取输入流的数据
//方式一:此写法会造成乱码的可能 因为一个中文在UTF-8 编码当中占3个字节 可能会遇见把一个字分为两半的情况,就会造成乱码
// byte[]bytes=new byte[1024];
// int len;
// while ((len=inputStream.read(bytes))!=-1){
// String s=new String(bytes,0,len);
// System.out.println(s);
// }
// 方式二: 解决乱码的方式
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes=new byte[5];//此处可以不用管new了几个字符进去 此类会自动填补 不会把字分为两半
int len;
while ((len=inputStream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,len);
}
System.out.println(byteArrayOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (serverSocket!=null){
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if( accept!=null){
accept.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (inputStream!=null){
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Establecimiento de la conexión UDP
<Cuando se inicia la conexión UDP, el extremo receptor debe iniciarse primero; de lo contrario, caerá en espera infinita (porque el extremo receptor se inicia más tarde, el extremo emisor habrá enviado los datos y el extremo receptor ha estar esperando)
package NetWorkPrograming;
import org.junit.Test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @Author:CT
* @Date:2021/2/16
* @Description:NetWorkPrograming
* @Version 1.0
*/
/*
UDP的连接操作
*/
public class UDP {
// 发送端
@Test
public void test(){
// 建立数据传输的
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
// 用来存放数据
String s="你好";
byte[] bytes=s.getBytes();
InetAddress inetAddress=InetAddress.getLocalHost();
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length,inetAddress,8099);
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
} finally {
datagramSocket.close();
}
}
@Test
// 接收端
public void test1(){
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(8099);
byte[]bytes=new byte[100];
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
datagramSocket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
} catch (IOException e) {
e.printStackTrace();
} finally {
datagramSocket.close();
}
}
}