zoukankan      html  css  js  c++  java
  • 0303 TCP

    TCP是明确确定客户端和服务器端

    JDK中提供了ServerSocket类,用于表示服务器端,Socket类,用于表示客户端

    ServerSocket类 

    构造:ServerSocket(int port)明确服务器的端口号

    类方法:accpet()该方法是创建与客户端的联系,返回值是一个socket对象

    Socket类

    构造:

    Socket(String str,int port)

    Socket (InetAddress address, int port)

    常用类方法

    getInputStream() 返回值是InputStream 对象

    getOutputStream() 返回值是OutputStream 对象

    代码展示 服务器端

    public class TCPSever {
    //服务器端
    	public static void main(String[] args) throws IOException {
    		Scanner sc=new Scanner(System.in);
    		//创建服务器端对象 明确端口 
    		ServerSocket sever=new ServerSocket(9000);
    		//创建链接获取与我链接的客户端对象
    		Socket socket=sever.accept();
    		//获取字节输入流,接收客户端发送的数据
    		InputStream in=socket.getInputStream();
    		//创建字节数组
    		byte[] bytes=new byte[1024];
    		int len=in.read(bytes);
    		System.out.println("客户端发送的内容为:"+new String(bytes,0,len));
    		//回复客户端
    		///获取字节输出流 目的地是客户端
    		OutputStream out=socket.getOutputStream();
    		//回复数据
    		out.write(sc.next().getBytes());
    		//释放资源
    		sever.close();
    	}
    }
    

      代码展示客户端

    public class TCPlient {
    //客户端
    	public static void main(String[] args) throws UnknownHostException, IOException {
    		Scanner sc=new Scanner(System.in);
    		//创建客户端对象
    		Socket socket=new Socket("127.0.0.1",9000);
    		//获得字节输出流,目的地是服务器
    		OutputStream out=socket.getOutputStream();
    		//发送数据
    		out.write(sc.next().getBytes());
    		//接收服务器端的回复
    		//获取字节输入流
    		InputStream in=socket.getInputStream();
    		byte[] bytes=new byte[1024];
    		int len=in.read(bytes);
    		System.out.println("服务器端回复的数据为:"+new String(bytes,0,len));
    		//释放资源
    		socket.close();
    	}
    }
    

      运行结果

    那么我们利用循环 将这个数据发送循环起来

    代码展示客户端

    public class TCPlient {
    //ke客户端
    	public static void main(String[] args) throws UnknownHostException, IOException {
    		Scanner sc=new Scanner(System.in);
    		//创建客户端对象
    		Socket socket=new Socket("127.0.0.1",8888);
    		while(true){
    		//获取输出流
    		OutputStream out=socket.getOutputStream();
    		out.write(sc.next().getBytes());
    		//收到服务器端回复
    		//获取输入流
    		InputStream in=socket.getInputStream();
    		byte[] bytes=new byte[1024];
    		int len=in.read(bytes);
    		System.out.println("服务器端回复:"+new String(bytes,0,len));
    		}
    		//socket.close();
    	}
    }
    

      服务器端

    public class TCPSrever {
    //服务器端
    	public static void main(String[] args) throws IOException {
    		Scanner sc=new Scanner(System.in);
    		//创建服务器端对象
    		ServerSocket server=new ServerSocket(8888);
    		//创建链接
    		Socket socket=server.accept();
    		while(true){
    		//获取输入流
    		InputStream in=socket.getInputStream();
    		byte[] bytes=new byte[1024];
    		int len=in.read(bytes);
    		System.out.println("客户端发送数据为:"+new String(bytes,0,len));
    		//去客户端回复数据
    		//获取输出流
    		OutputStream out=socket.getOutputStream();
    		out.write(sc.next().getBytes());
    		}
    		//释放资源
    		//server.close();
    	}
    }
    

      运行结果

     那我们利用这个数据传输功能实现文件上传功能

    客户端

    public class TCPlient {
    
    	public static void main(String[] args) throws UnknownHostException, IOException {
    		//创建客户端对象明确服务器端的ip和端口号
    		Socket socket=new Socket("127.0.0.1",8888);
    		//明确读取数据的数据源
    		FileInputStream fis=new FileInputStream("F:\io1127\3.jpg");
    		//明确目的地 获得字节输出流
    		OutputStream out=socket.getOutputStream();
    		int len=0;
    		byte[] bytes=new byte[1024];
    		while((len=fis.read(bytes))!=-1){
    			out.write(bytes,0,len);
    		}
    		//告知服务器端结束
    		socket.shutdownOutput();
    		//接收服务器端的回复
    		InputStream in=socket.getInputStream();
    		len=in.read(bytes);
    		System.out.println("服务器端回复:"+new String(bytes,0,len));
    		//释放资源
    		socket.close();
    		
    	}
    }
    

      服务器端

    public class TCPSever {
    
    	public static void main(String[] args) throws IOException {
    		//创建服务器对象 明确端口号
    		ServerSocket server=new ServerSocket(8888);
    		//与客户端链接 获取socket对象
    		Socket socket=server.accept();
    		//明确数据源
    		//读取客户端发送过来的数据
    		InputStream in=socket.getInputStream();
    		//明确目的地文件的位置
    		File file=new File("F:\io1127\server");
    		//如果文件夹不存在 就创建
    		if(!file.exists()){
    			file.mkdirs();
    		}
    		//明确文件名
    		String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";
    		//明确目的地
    		FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
    		//开始复制
    		byte[] bytes=new byte[1024];
    		int len=0;
    		while((len=in.read(bytes))!=-1){
    			fos.write(bytes,0,len);
    		}
    		//回复客户端
    		//获取字节输出流
    		OutputStream out=socket.getOutputStream();
    		//回复内容
    		out.write("收到".getBytes());
    		server.close();
    		
    	}
    }
    

      TCP流程原理图解

  • 相关阅读:
    Centos7安装Typecho详细教程
    Liunx 安装 Nessus
    攻防世界 web进阶练习 NewsCenter
    针对Linux 文件完整性监控的实现
    ParrotSec 中文社区 QQ群认证 Openssl解密
    中转Webshell 绕过安全狗(二)
    中转Webshell 绕过安全狗(一)
    Kali Linux Web渗透测试手册(第二版)
    JavaScript指定断点操作
    年轻程序员如何快速成长
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14473341.html
Copyright © 2011-2022 走看看