zoukankan      html  css  js  c++  java
  • TCP通信

    TCP通信是严格区分客户端与服务器端   服务器端程序需要事先启动,等待客户端的连接

    UDP中只有发送端和接收端,不区分客户端与服务器端

    原理图:

     实现TCP 服务器程序

     * 表示服务器程序的类 java.net.ServerSocket

     * 构造方法:

     *     ServerSocket(int port)传递端口号

     *     很重要的事情:必须要获得客户端的套接字对象Socket

     *     Socket accept()

     *

     * 1,创建服务器ServerSocket对象(指定服务器端口号)

     * 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

     * 3,给客户端反馈信息

     * 4,关闭流资源

    package com.oracle.demo02;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class TCPServer {
    	//Tcp服务器端
    	public static void main(String[] args) throws IOException {
    		Scanner sc=new Scanner(System.in);
    		//创建服务器端对象,名确端口号
    		ServerSocket sever=new ServerSocket(9999);
    		while(true){
    
    		//创建连接
    		Socket socket=sever.accept();
    		//获取字节输入流来获取客户端数据
    		InputStream in=socket.getInputStream();
    		//创建字节数组接收数据
    		byte bytes[]=new byte[1024];
    		int len=in.read(bytes);
    		//获取客户端ip地址
    		String ip=socket.getInetAddress().getHostAddress();
    		System.out.println("ip地址为"+ip+"	发送内容为"+new String(bytes,0,len));
    		//回复客户端
    		//获取字节输出流,准备给客户端写书据
    		OutputStream out=socket.getOutputStream();
    		//写出字节数组
    		out.write(sc.next().getBytes());
    		//释放资源
    		//sever.close();
    		}
    	}
    
    }
    

      

    实现TCP 客户端,连接到服务器

     * 和服务器实现数据交换

     * 实现TCP客户端程序的类 java.net.Soket

     * 构造方法

     *    Socket(String host,int port) 传递服务器IP和端口号

     *    注意:构造方法只要运行,就会和服务器进行连接,连接失败,抛出异常

     *    OutputStream   getOutputStream() 返回套接字的输出流

     *    作用:将数据输出,输出到服务器

     *    InputStream   getInputStream() 返回套接字的输入流

     *    作用:从服务器端读取数据

     *    客户端服务器数据交换,必须使用套接字对象Socket中的获取的IO流,自己new流,不行

     * 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

     * 2,获取服务器端的反馈回来的信息

     * 3,关闭流资源

    package com.oracle.demo02;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    public class TCOPlient {
    	public static void main(String[] args) throws UnknownHostException, IOException {
    		Scanner sc=new Scanner(System.in);
    		//创杰接收数组
    		byte bytes[]=new byte[1024];
    		while(true){
    		//创建客户端对象,来链接服务器
    		Socket socket=new Socket("127.0.0.1",9999);
    		//获取自己输出流,将数据传给服务器
    		OutputStream out=socket.getOutputStream();
    		//输出字节数组
    		out.write(sc.next().getBytes());
    		//接收服务器段回复
    		//获取字节输入流  接收服务器段回复
    		InputStream in=socket.getInputStream();
    
    		int len=in.read(bytes);
    		System.out.println(new String(bytes,0,len));
    		//释放资源
    		//socket.close();
    		}
    	}
    }
    

     文件上传原理图:

     

    TCP上传服务器

    1. ServerSocket套接字对象,监听端口8888
    2. 方法accept()获取客户端的连接对象
    3. 客户端连接对象获取字节输入流,读取客户端发送图片
    4. 创建File对象,绑定上传文件夹

    判断文件夹存在,不存在,再创建文件夹

    1. 创建字节输出流,数据目的File对象所在文件夹
    2. 字节读取图片,字节流将图片写入到目的文件夹中
    3. 将上传成功返回客户端
    4. 关闭资源
    package com.oracle.demo04;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;
    import java.util.Scanner;
    
    public class TCPServer {
    	//Tcp服务器端
    	public static void main(String[] args) throws IOException {
    		//创建服务器端对象,名确端口号
    		ServerSocket sever=new ServerSocket(9999);
    		//创建连接
    		Socket socket=sever.accept();
    		//获取字节输入流来获取客户端数据
    		InputStream in=socket.getInputStream();
    		//明确目的地
    		File file=new File("D:\demo1018\upload");
    		//判断该文件是否存在
    		if (!file.exists()) {
    			//如果不存在则创建文件夹
    			file.mkdirs();
    		}
    		String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(6)+".txt";
    		//创建字节输出名
    		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);
    		}
    		//获取客户端ip地址
    		//String ip=socket.getInetAddress().getHostAddress();
    		//System.out.println("ip地址为"+ip+"	发送内容为"+new String(bytes,0,len));
    		//回复客户端
    		//获取字节输出流,准备给客户端写书据
    		OutputStream out=socket.getOutputStream();
    		//写出字节数组
    		out.write("上传成功".getBytes());
    		//释放资源
    		fos.close();
    		sever.close();
    	}
    
    }
    

      

    文件上传 客户端

    实现步骤:

    1. Socket套接字连接服务器
    2. 通过Socket获取字节输出流,写图片
    3. 使用自己的流对象,读取图片数据源

       FileInputStream

    1. 读取图片,使用字节输出流,将图片写到服务器
    2. 通过Socket套接字获取字节输入流

         读取服务器发回来的上传成功

    6.关闭资源

     public void shutdownOutput()  禁用此Socket的输出流,间接的相当于告知了服务器数据写入完毕

    package com.oracle.demo04;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    public class TCOClient {
    	//tcp客户端
    	public static void main(String[] args) throws UnknownHostException, IOException {
    		//创建客户端对象,来链接服务器
    		Socket socket=new Socket("127.0.0.1",9999);
    		//获取自己输出流,将数据传给服务器
    		OutputStream out=socket.getOutputStream();
    		//明确数据源
    		FileInputStream fis=new FileInputStream("D:\demo1018\print.txt");
    		//开始复制
    		//输出字节数组
    		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));
    		//释放资源
    		fis.close();
    		socket.close();
    	}
    }
    

      

  • 相关阅读:
    增强MyEclipse提示功能
    Mysql安装配置,修改初试密码。
    在我的电脑里面创建图标
    popup non topmost
    多线程下载或上传数据限速
    SynchronizationContext
    linux运维笔记——常用命令详解diff
    linux运维笔记——curl
    linux下mysql的源码安装
    shell编程——变量的数值计算
  • 原文地址:https://www.cnblogs.com/zqy6666/p/12325040.html
Copyright © 2011-2022 走看看