TCP和UDP区别
TCP:
1、在使用TCP协议前,必须要建立可靠的TCP连接,形成传输数据的通道
2、传输前,采用"三次握手"方式,点对点通信,是可靠。
3、TCP协议进行通信的两个应用进程:客户端、服务端。
4、在连接中可以进行大量的数据传输。
5、传输完毕,释放已经建立连接资源,效率低。
UDP:
1、将数据、源、目的封装成数据报文,不需要建立连接。
2、每个数据报文的大小限制在64K以内。
3、发送不管对方是否准备好,接收方也收不确认,不可靠。
4、可以广播发送。
5、发送数据结束时,无需释放资源,开销小,速度快。
TCP简单实现
package com.jsoft.morning;
import org.junit.Test;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP {
@Test
public void client() {
// 客户端对象
Socket socket = null;
// 服务器向客户端发数据用到的输出流
OutputStream os = null;
// 客户端想接收服务器回来的数据(待解决)
// InputStream is = null;
try {
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
// socket实例化的同时,就通过ip地址和端口号去连接服务器
socket = new Socket(inetAddress,8899);
os = socket.getOutputStream();
os.write("你好,我是客户端GG".getBytes());
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
if(os != null) {
try {
os.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
if(socket != null) {
try {
socket.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
@Test
public void server() {
// 服务端套接字,服务端对象
ServerSocket ss = null;
// 客户端对象,在客户端获取到已连接的客户端对象
Socket socket = null;
// 用来接收客户端发过来的数据的流
InputStream is= null;
// 用来向客户端发送数据的流(待解决)
// OutputStream os = null;
try {
// 1.创建服务器对象,指明服务器所占用的端口号8899
// 客户端在连接时,通过ip地址(127.0.0.1)和端口号
ss = new ServerSocket(8899);
System.out.println("服务器已启动,端口号为:8899");
// 2.调用accept表示接收客户端的链接。
// socket就代表了已经连接上的客户端对象
socket = ss.accept();
// 3.获取一个输入流,客户端对应的输入流,就可以使用这个输入流来读取客户端发过来的数据
is = socket.getInputStream();
// 4.获取服务器的流(待解决)
byte [] buffer = new byte[1024];
int len;
System.out.print("收到了来自于:" + socket.getInetAddress().getHostAddress() + "数据:");
while((len = is.read(buffer))!=-1) {
System.out.print(new String(buffer,0,len));
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if(is != null) {
try {
is.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
if(socket != null) {
try {
socket.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
if(ss != null) {
try {
ss.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
UDP简单实现
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketUtil {
public static void release(InputStream is, OutputStream os, ServerSocket ss, Socket socket) {
if(is != null) {
try {
is.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
if(os != null) {
try {
os.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
if(socket != null) {
try {
socket.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
if(ss != null) {
try {
ss.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
public class Ch03 {
@Test
public void client() {
Socket socket = null;
OutputStream os = null;
InputStream is = null;
try {
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
socket = new Socket(inetAddress,8899);
// os代表客户端和服务器已经建立连接所对应的输出流
os = socket.getOutputStream();
File file = new File("hello.txt");
is = new FileInputStream(file);
byte [] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1) {
os.write(buffer,0,len);
}
System.out.println("文件发送完毕...");
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
SocketUtil.release(is,os,null,socket);
}
}
@Test
public void server() {
ServerSocket ss = null;
Socket socket = null;
InputStream is= null;
OutputStream os = null;
try {
ss = new ServerSocket(8899);
System.out.println("服务器已启动,端口号为:8899");
socket = ss.accept();
is = socket.getInputStream();
os = new FileOutputStream("hello_server.txt");
byte [] buffer = new byte[1024];
int len;
System.out.print("收到了来自于:" + socket.getInetAddress().getHostAddress() + "数据:");
while((len = is.read(buffer))!=-1) {
os.write(buffer,0,len);
}
System.out.println("服务端接收文件完毕...");
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
SocketUtil.release(is,os,ss,socket);
}
}
}