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+"\t发送内容为"+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+"\t发送内容为"+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();
	}
}

  

 

posted @ 2020-02-18 10:27  xiren88  阅读(188)  评论(0编辑  收藏  举报