一、网络通信
TCP是一种可靠的传输协议,它保证了数据的可靠传输。在网络通信中,TCP协议被广泛应用。例如,电子邮件、FTP文件传输、HTTP网页浏览等都是基于TCP/IP协议的。
以下是一个基于TCP协议的简单聊天室服务器和客户端代码示例:
// 服务器端代码 import java.io.*; import java.net.*; public class ChatServer { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8080); // 创建服务器套接字 System.out.println("服务器已经启动..."); while (true) { Socket s = ss.accept(); // 接收客户端套接字 System.out.println("客户端已经连接..."); InputStream is = s.getInputStream(); // 获取输入流 OutputStream os = s.getOutputStream(); // 获取输出流 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 读取客户端发送的信息 PrintWriter pw = new PrintWriter(new OutputStreamWriter(os), true); // 将服务端消息回传给客户端 pw.println("欢迎来到聊天室!"); while (true) { String str = br.readLine(); if (str.equals("end")) { break; } System.out.println("客户端说:" + str); pw.println("服务器说:" + str); } s.close(); // 关闭客户端套接字 System.out.println("客户端已经关闭..."); } } catch (IOException e) { e.printStackTrace(); } } } // 客户端代码 import java.io.*; import java.net.*; public class ChatClient { public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 8080); // 创建客户端套接字并连接服务器 InputStream is = s.getInputStream(); // 获取输入流 OutputStream os = s.getOutputStream(); // 获取输出流 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 读取服务端发送的信息 PrintWriter pw = new PrintWriter(new OutputStreamWriter(os), true); // 将客户端消息发送给服务端 while (true) { String str = br.readLine(); if (str == null) { break; } System.out.println(str); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); pw.println(reader.readLine()); } s.close(); // 关闭客户端套接字 } catch (IOException e) { e.printStackTrace(); } } }
二、文件传输
TCP协议可以保证数据的可靠传输,因此在文件传输的场景下,TCP协议也是很常用的。例如,在FTP文件传输、P2P文件共享等应用中,都广泛使用了TCP协议。
以下是一个基于TCP协议的文件传输服务器和客户端代码示例:
// 服务器端代码 import java.io.*; import java.net.*; public class FileServer { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8080); // 创建服务器套接字 System.out.println("服务器已经启动..."); while (true) { Socket s = ss.accept(); // 接收客户端套接字 System.out.println("客户端已经连接..."); InputStream is = s.getInputStream(); // 获取输入流 OutputStream os = s.getOutputStream(); // 获取输出流 BufferedInputStream bis = new BufferedInputStream(is); // 创建输入缓冲流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.txt")); // 创建输出缓冲流 byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, len); } bos.flush(); bos.close(); bis.close(); s.close(); // 关闭客户端套接字 System.out.println("客户端已经关闭..."); } } catch (IOException e) { e.printStackTrace(); } } } // 客户端代码 import java.io.*; import java.net.*; public class FileClient { public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 8080); // 创建客户端套接字并连接服务器 InputStream is = s.getInputStream(); // 获取输入流 OutputStream os = s.getOutputStream(); // 获取输出流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt")); // 创建输入缓冲流 BufferedOutputStream bos = new BufferedOutputStream(os); // 创建输出缓冲流 byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, len); } bos.flush(); bos.close(); bis.close(); s.close(); // 关闭客户端套接字 } catch (IOException e) { e.printStackTrace(); } } }
三、远程控制
在远程控制场景下,TCP协议也是非常重要的。例如,在远程桌面控制、远程维护等应用中,都需要使用TCP协议。
以下是一个基于TCP协议的远程控制服务器和客户端代码示例:
// 服务器端代码 import java.awt.*; import java.io.*; import java.net.*; public class RemoteServer { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8080); // 创建服务器套接字 System.out.println("服务器已经启动..."); while (true) { Socket s = ss.accept(); // 接收客户端套接字 System.out.println("客户端已经连接..."); OutputStream os = s.getOutputStream(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Robot robot = new Robot(); int width = (int) screenSize.getWidth(); int height = (int) screenSize.getHeight(); Rectangle screenRect = new Rectangle(0, 0, width, height); BufferedImage image = robot.createScreenCapture(screenRect); ImageIO.write(image, "jpg", os); os.flush(); os.close(); s.close(); // 关闭客户端套接字 System.out.println("客户端已经关闭..."); } } catch (IOException | AWTException e) { e.printStackTrace(); } } } // 客户端代码 import java.awt.*; import java.io.*; import java.net.*; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class RemoteClient { public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 8080); // 创建客户端套接字并连接服务器 InputStream is = s.getInputStream(); // 获取输入流 byte[] buffer = new byte[1024]; BufferedImage image = ImageIO.read(is); ImageIcon icon = new ImageIcon(image); JFrame frame = new JFrame("远程监控"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new JLabel(icon)); frame.pack(); frame.setVisible(true); is.close(); s.close(); // 关闭客户端套接字 } catch (IOException e) { e.printStackTrace(); } } }
四、音视频传输
TCP协议在音视频传输场景下并不常用,因为它的可靠性会对音视频传输的实时性产生影响。在音视频传输场景下,一般会选择UDP协议,以获得更好的实时性。
以下是一个基于TCP协议的音视频传输服务器和客户端代码示例:
// 服务器端代码 import java.io.*; import java.net.*; public class AVServer { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8080); // 创建服务器套接字 System.out.println("服务器已经启动..."); while (true) { Socket s = ss.accept(); // 接收客户端套接字 System.out.println("客户端已经连接..."); InputStream is = s.getInputStream(); // 获取输入流 OutputStream os = s.getOutputStream(); // 获取输出流 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer, 0, buffer.length)) != -1) { os.write(buffer, 0, len); os.flush(); } os.close(); is.close(); s.close(); // 关闭客户端套接字 System.out.println("客户端已经关闭..."); } } catch (IOException e) { e.printStackTrace(); } } } // 客户端代码 import java.io.*; import java.net.*; public class AVClient { public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 8080); // 创建客户端套接字并连接服务器 InputStream is = new FileInputStream("av.mp4"); // 获取输入流 OutputStream os = s.getOutputStream(); // 获取输出流 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer, 0, buffer.length)) != -1) { os.write(buffer, 0, len); // 写入数据 os.flush(); } os.close(); is.close(); s.close(); // 关闭客户端套接字 } catch (IOException e) { e.printStackTrace(); } } }