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流程原理图解

 

posted @ 2021-03-03 11:13  公雪  阅读(92)  评论(0编辑  收藏  举报