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