TCP 协议
特点:应⽤程序在使⽤ TCP 协议前必须先建⽴连接,才能传 输数据,数据传输完毕需要释放连接。
例如打电话:先拨通,再说话,挂电话。
TCP 协议如果没有成功建⽴连接,就⼀直处于阻塞状态,需 要持续等待。
TCP 的优点是⾮常可靠,数据不会丢失,并且数据是按照先 后顺序依次到达。缺点就是速度慢、效率低。
⾦融系统,对安全性要求较⾼的系统必须使⽤ TCP。
Java 是如何完成基于 TCP 协议的⽹络开发?
Socket 编程,Java 是通过 Socket 完成 TCP 程序开发。
java.net.Socket 可以在客户端和服务端之间建⽴起可靠的连 接。
java.net.Socket 表示客户端,java.net.ServerSocket 表示服 务器。
开发思路
在服务端创建 ServerSocket 对象,通过该对象的 accpet() ⽅ 法可以接收到若⼲个表示客户端的 Socket 对象。

Server
package com.southwind.tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
//IP:本机IP,端口:8080
try {
serverSocket = new ServerSocket(8080);
System.out.println("------服务端------");
System.out.println("已启动,等待接收客户端请求...");
while(true){
socket = serverSocket.accept();
//通过输入流获取数据
inputStream = socket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
String request = dataInputStream.readUTF();
System.out.println("接收到了客户端请求:"+request);
//给客户端作出响应
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
String response = "你也好!";
dataOutputStream.writeUTF(response);
System.out.println("给客户端作出的响应:"+response);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dataOutputStream.close();
dataInputStream.close();
inputStream.close();
outputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Client
package com.southwind.tcp;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
DataInputStream dataInputStream = null;
OutputStream outputStream = null;
DataOutputStream dataOutputStream = null;
try {
//访问服务器 IP+端口
socket = new Socket("127.0.0.1",8080);
System.out.println("------客户端------");
String request = "你好!";
System.out.println("客户端说:"+request);
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(request);
//接收服务器的响应
inputStream = socket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
String response = dataInputStream.readUTF();
System.out.println("服务器响应:"+response);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dataOutputStream.close();
dataInputStream.close();
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP 协议
TCP 协议适⽤于安全性要求较⾼,不追求速度的系统,⾦融 系统。
UDP 协议适⽤于流畅性要求较⾼,不追求安全的系统,视频 聊天、语⾳聊天、直播。
UDP 所有连接都是不可靠的,不需要建⽴连接,直接发送数 据即可。
Java 如何开发基于 UDP 协议的应⽤

DatagramSocket、DatagramPacket
package com.southwind.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
public class TerminalA {
public static void main(String[] args) throws Exception {
//接收数据
byte[] buff = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buff,buff.length);
DatagramSocket datagramSocket = new DatagramSocket(8181);
datagramSocket.receive(datagramPacket);
String mess = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println("我是 TerminalA,接收到了"+datagramPacket.getAddress()+":"+datagramPacket.getPort()+"传来的数据:"+mess);
//发送数据
String reply = "我是TerminalA,已接收到你发来的信息!";
SocketAddress socketAddress = datagramPacket.getSocketAddress();
DatagramPacket datagramPacket2 = new DatagramPacket(reply.getBytes(),reply.getBytes().length,socketAddress);
datagramSocket.send(datagramPacket2);
}
}
package com.southwind.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class TerminalB {
public static void main(String[] args) throws Exception {
//发送数据
String mess = "我是TerminalB,你好!";
InetAddress inetAddress = InetAddress.getByName("localhost");
DatagramPacket datagramPacket = new DatagramPacket(mess.getBytes(),mess.getBytes().length,inetAddress,8181);
DatagramSocket datagramSocket = new DatagramSocket(8080);
datagramSocket.send(datagramPacket);
//接收数据
byte[] buff = new byte[1024];
DatagramPacket datagramPacket2 = new DatagramPacket(buff,buff.length);
datagramSocket.receive(datagramPacket2);
String reply = new String(datagramPacket2.getData(),0,datagramPacket2.getLength());
System.out.println("我是 TerminalB,接收到了"+datagramPacket2.getAddress()+":"+datagramPacket2.getPort()+"返回的数据:"+reply);
}
}