TCP通信原理
-
概述
传输控制协议TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在通信两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,两端的程序通过虚拟链路通信。 -
java提供的基于TCP协议的 Socket 类
客户端:Socket
服务器:ServerSocket
Socket 与 ServerSocket
-
Socket
构造方法 描述 Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号 Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址处的指定端口号 常用方法 描述 OutputStream getOutputStream() 返回此套接字的输出流 InputStream getInputStream() 返回此套接字的输入流 void close() 关闭此套接字 -
ServerSocket
构造方法 描述 ServerSocket(int port) 创建绑定到指定端口的服务器套接字 常用方法 描述 Socket accept() 侦听对此套接字的连接并获取它
客户端 与 服务器
-
客户端
public class TcpSocket { public static void main(String[] args) throws IOException { //创建客户端收发器,并将其连接到指定主机上的指定端口 Socket socket = new Socket("192.168.200.10",12300); //获得输出流,写数据 OutputStream os = socket.getOutputStream(); os.write("Hello TCP".getBytes()); //关闭收发器 socket.close(); } }
-
服务器
public class TcpServerSocket { public static void main(String[] args)throws IOException { //创建服务器收发器,并绑定到指定端口 ServerSocket ss = new ServerSocket(12300); //侦听对此套接字的连接并接受它 Socket s = ss.accept(); //获得输入流,读书节 InputStream is = s.getInputStream(); byte[] bs = new byte[1024]; is.read(bs); //打印数据 System.out.println(new String(bs)); //释放资源 ss.close(); } } ---*--- 输出结果: Hello TCP
注意:
- 需要先启动服务器端,只能由客户端连接服务器端。客户端和服务器会建立一个逻辑连接,这个连接包含一个字节IO对象,客户端和服务器使用IO对象进行通信。(一次数据交互需要4个IO流对象)
- 当服务器端使用 accept() 方法侦听连接过来的客户端对象(Socket)并获取该Socket。服务器使用获取到的 Socket 对象使用客户端的流和客户端通信。
-
案例:上传视频到服务器
//服务器 public class TcpServerSocket { public static void main(String[] args)throws IOException { ServerSocket ss = new ServerSocket(12340); while (true) { Socket s = ss.accept(); //开启线程处理客户端上传 new Thread(new Runnable() { @Override public void run() { int conut = 0; File f = new File("E:\\临时\\ls\\测试[" + conut + "].mp4"); while (f.exists()) { conut++; f = new File("E:\\临时\\ls\\测试[" + conut + "].mp4"); } try ( //接收文件客户端文件 BufferedInputStream bis = new BufferedInputStream(s.getInputStream()); //写入本地磁盘的流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); ){ //读写 byte[] bs = new byte[1024]; int len; while ((len = bis.read(bs)) != -1) { bos.write(bs,0,len); } //给出反馈 bw.write("上传成功!"); }catch (IOException e){ e.printStackTrace(); } }//run结束 }).start(); }//while结束 } }
//客户端 public class TcpSocket { public static void main(String[] args) throws IOException { Socket s = new Socket("127.0.0.1", 12340); //读本地文件的流 File f = new File("H:\\h正好的文件夹\\抖音广告\\完成导出\\夜曲-抖音推广-.mp4"); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); //发送到服务器的流 BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream()); //读写 byte[] bs = new byte[1024]; int len; while ((len = bis.read(bs)) != -1) { bos.write(bs,0,len); } //发送完毕 s.shutdownOutput(); //接收反馈 byte[] bs1 = new byte[1024]; BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String s1 = br.readLine(); System.out.println(s1); //关闭资源 bis.close(); s.close(); } }