TCP协议
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
TCP是因特网中的传输层协议,使用三次握手协议建立连接,而终止一个连接要经过四次挥手。详情请点击:三次握手和四次挥手。
代码基本实现:
Socket:此类实现客户端套接字(也可以就叫“套接字”)。
ServerSocket:此类实现服务器套接字。
注意:服务端和客户端只是角色上的分配,当两者一旦产生连接,则没有明确角色
两者之间的通信都是通过Socket来完成
accept()侦听并接受到此套接字的连接。如果没有连接请求,则会阻塞等待
getInputStream() 返回此套接字的输入流。
getOutputStream() 返回此套接字的输出流。
//客户端
//Socket
//此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
public class TestClient {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("Socket");
int port = 8888;
String host = "localhost";
Socket client = new Socket(host, port);
TestIn t = new TestIn(client);
Thread d1 = new Thread(t);
d1.start();
Scanner scanner = new Scanner(System.in);
OutputStream out = client.getOutputStream();
PrintStream printStream = new PrintStream(out);
// 可以得到输入输出流,则可以进行通信
// 输入和输出要并发
while (true) {
// 客户端后输出信息
// 信息部分做成键盘输入
System.out.println("请输入信息:");
String msg = scanner.nextLine();
// 装饰成高级流
printStream.println(msg);
System.out.println("输出server信息=" + msg);
}
}
}
//在连接成功之前,是一个角色分配
//ServerSocket
//此类实现服务器套接字。
//服务端
public class TestServer {
public static void main(String[] args) throws IOException {
System.out.println("ServerSocket");
int port = 8888;// Address already in use: JVM_Bind
// 公开一个连接的端口
ServerSocket serverSocket = new ServerSocket(port);
// 一旦获取到socket连接对象,通信工作都是通过socket来完成
Socket server = serverSocket.accept();// 等待连接,产生阻塞效果
TestIn t = new TestIn(server);
Thread d1 = new Thread(t);
d1.start();
// 输出
Scanner scanner = new Scanner(System.in);
OutputStream out = server.getOutputStream();
PrintStream printStream = new PrintStream(out);
// 可以得到输入输出流,则可以进行通信:
// 输入和输出要并发
while (true) {
// 服务端先输出信息
// 信息部分做成键盘输入
System.out.println("请输入信息:");
String msg = scanner.nextLine();
// 装饰成高级流
printStream.println(msg);
System.out.println("输出client信息=" + msg);
}
// while(true){
// // 服务端后输入信息
// String str = bufferedReader.readLine();
// System.out.println("读取client信息=" + str);
// }
}
}
//负责输入
public class TestIn implements Runnable {
Socket socket;
public TestIn(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
// 输入
InputStream in = null;
BufferedReader bufferedReader = null;
try {
in = socket.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(in));
while (true) {
// 服务端后输入信息
String str = bufferedReader.readLine();
System.out.println("读取client信息=" + str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UDP协议
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
代码基本实现:
//UDP:基本流程
//1步:创建DatagramSocket对象,接受端需要指定端口号,发送端默认无参
//2步:创建DatagramPacket数据包对象,接受端需要指定接受大小,发送端需要指定InetAddress和port
//3步:DatagramSocket中的send()发送数据包,receive()接受数据包
//注意:send不管是否有接收端,不会等待接收端,直接发送出去
//receive不管发送端所发送数据大小,会等待数据包接受
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//发送方
public class TestSend {
public static void main(String[] args) throws IOException {
// 数据
String msg = "hello world";
byte[] buf = msg.getBytes();
InetAddress address = InetAddress.getLocalHost();
int port = 8888;
DatagramSocket testSend = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
testSend.send(packet);// 不会等待,直接发送
System.out.println("发送完毕");
}
}
//接受方
public class TestRecive {
public static void main(String[] args) throws IOException {
int port = 8888;
DatagramSocket testRecive = new DatagramSocket(port);
byte[] buf = new byte[1024];// 大小有限的
DatagramPacket packet = new DatagramPacket(buf, buf.length);
testRecive.receive(packet);// 等待接受数据报
System.out.println("接受完毕=" + packet);
// 数据处理
byte[] data = packet.getData();
// 数据还原成String
String msg = new String(data, 0, packet.getLength());
System.out.println(msg);
}
}
总结:
1、TCP面向连接,当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据;
UDP是无连接的,面向事务,无需建立连接就可以发送封装包数据。
2、TCP是可靠的:TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据的发送和接收顺序;
UDP不可靠:UDP尽最大努力交付,即不保证可靠交付。
3、TCP连接只能是点到点的;
UDP支持一对一,一对多,多对一和多对多的交互通信, 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
4、TCP对系统资源消耗大;
UDP:由于UDP的特性,它不属于连接型协议,因而具有资源消耗小,处理速度快的优点。
5、TCP:基于字节流,流模式;
UDP:将网络数据流量压缩成数据包的形式,数据报模式。
6、TCP:大量数据;UDP:少量数据。