在Java中,提供了两个类用于实现TCP通信程序:
1. 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建
立连接开始通信。
2. 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端
的连接。
Socket 类的一些方法:
public InputStream getInputStream() : 返回此套接字的输入流。
public OutputStream getOutputStream() : 返回此套接字的输出流。
public void close() :关闭此套接字。
public void shutdownOutput() : 禁用此套接字的输出流。
ServerSocker类的一些方法:
public Socket accept():侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法
会一直阻塞直到建立连接。
简单的Java代码的小例子
服务端实现:
public class ServerTCP { public static void main ( String [] args ) throws IOException { System . out . println ( " 服务端启动 , 等待连接 .... " ); // 1. 创建 ServerSocket 对象,绑定端口,开始等待连接 ServerSocket ss = new ServerSocket ( 6666 ); // 2. 接收连接 accept 方法 , 返回 socket 对象 . Socket server = ss . accept (); // 3. 通过 socket 获取输入流 InputStream is = server . getInputStream (); // 4. 一次性读取数据 // 4.1 创建字节数组 byte [] b = new byte [ 1024 ]; // 4.2 据读取到字节数组中 . int len = is . read ( b ) ; // 4.3 解析数组 , 打印字符串信息 String msg = new String ( b , 0 , len ); System . out . println ( msg ); //5. 关闭资源 . is . close (); server . close (); } }
客户端实现:
public class ClientTCP { public static void main ( String [] args ) throws Exception { System . out . println ( " 客户端 发送数据 " ); // 1. 创建 Socket ( ip , port ) , 确定连接到哪里 . Socket client = new Socket ( "localhost" , 6666 ); // 2. 获取流对象 . 输出流 OutputStream os = client . getOutputStream (); // 3. 写出数据 . os . write ( " 你好么 ? tcp , 我来了 " . getBytes ()); // 4. 关闭资源 . os . close (); client . close (); } }
第二个小例子
服务端代码
public class FileUpload_Server { public static void main ( String [] args ) throws IOException { System . out . println ( " 服务器 启动 ..... " ); // 1. 创建服务端 ServerSocket ServerSocket serverSocket = new ServerSocket ( 6666 ); // 2. 建立连接 Socket accept = serverSocket . accept (); // 3. 创建流对象 // 3.1 获取输入流 , 读取文件数据 BufferedInputStream bis = new BufferedInputStream ( accept . getInputStream ()); // 3.2 创建输出流 , 保存到本地 . BufferedOutputStream bos = new BufferedOutputStream ( new FileOutputStream ( "copy.jpg" )); // 4. 读写数据 byte [] b = new byte [ 1024 * 8 ]; int len ; while (( len = bis . read ( b )) != 1 ) { bos . write ( b , 0 , len ); } //5. 关闭 资源 bos . close (); bis . close (); accept . close (); System . out . println ( " 文件上传已保存 " ); } }
客户端代码
public class FileUPload_Client { public static void main ( String [] args ) throws IOException { // 1. 创建流对象 // 1.1 创建输入流 , 读取本地文件 BufferedInputStream bis = new BufferedInputStream ( new FileInputStream ( "test.jpg" )); // 1.2 创建输出流 , 写到服务端 Socket socket = new Socket ( "localhost" , 6666 ); BufferedOutputStream bos = new BufferedOutputStream ( socket . getOutputStream ()); //2. 写出数据 . byte [] b = new byte [ 1024 * 8 ]; int len ; while (( len = bis . read ( b )) != 1 ) { bos . write ( b , 0 , len ); bos . flush (); } System . out . println ( " 文件发送完毕 " ); // 3. 释放资源 bos . close (); socket . close (); bis . close () System . out . println ( " 文件上传完毕 " ); } }