基于Java远程传输文件Tcp 详细(源码+jar+exe)
- 格式:docx
- 大小:18.93 KB
- 文档页数:8
Java⽹络编程之TCP通信完整代码⽰例⼀、概述 Socket类是Java执⾏客户端TCP操作的基础类,这个类本⾝使⽤代码通过主机操作系统的本地TCP栈进⾏通信。
Socket 类的⽅法会建⽴和销毁连接,设置各种Socket选项。
ServerSocket类是Java执⾏服务器端操作的基础类,该类运⾏于服务器,监听⼊站TCP连接,每个socket服务器监听服务器的某个端⼝,当远程主机的客户端尝试连接此端⼝时,服务器就被唤醒,并返回⼀个表⽰两台主机之间socket的正常Socket对象。
⼆、什么是TCP? TCP是⼀种⾯向连接的、可靠的、基于字节流的传输层通信协议。
TCP通信分为客户端和服务器端,对应的对象是分别是Socket和ServerSocket。
当⼀台计算机需要与另⼀台远程计算机连接时,TCP协议会让他们建⽴⼀个连接:⽤于发送和接收数据的虚拟链路。
TCP协议负责收集信息包,并将其按适当的次序放好传送,在接收端收到后再将其正确的还原。
为了保证数据包在传送中准确⽆误,TCP使⽤了重发机制:当⼀个通信实体发送⼀个消息给另⼀个通信实体后需要收到另⼀个实体的确认信息,如果没有收到确认信息,则会再次重发刚才发送的信息。
三、TCP通信 1、构造函数 Socket类实现客户端套接字,通过构造函数可以指定希望连接的主机和端⼝。
主机可以指定为InetAddress或String,端⼝始终指定为0到65535之间的int值。
Socket s=new Socket("127.0.0.1", 10001);//创建⼀个流套接字并将其连接到指定主机上的指定端⼝号ServerSocket类实现服务器套接字。
服务器套接字等待请求通过⽹络传⼊,它基于该请求执⾏某些操作,然后向请求者返回结果。
ServerSocket ss=new ServerSocket(10001);//创建绑定到特定端⼝的服务器套接字2、例⼦:TCP⽂件复制 客户端:public class ClientDemo{public static void main(String[] args) throws UnknownHostException, IOException{Socket s=new Socket("127.0.0.1", 10004);BufferedReader buf = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\1.txt"));String line=null;/*PrintWriter out=new PrintWriter(s.getOutputStream(),true);while((line=buf.readLine())!=null){out.println(line);}*/BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));while((line=buf.readLine())!=null){out.write(line);out.newLine();out.flush();}s.shutdownOutput();BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));String str=in.readLine();System.out.println(str);s.close();buf.close();}}服务器端:public class ServerDemo{public static void main(String[] args) throws IOException{ServerSocket ss=new ServerSocket(10004);Socket s=ss.accept();BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));String line=null;/*PrintWriter buf=new PrintWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"),true);while((line=in.readLine())!=null){buf.println(line);}*/BufferedWriter buf=new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"));while((line=in.readLine())!=null){buf.write(line);buf.newLine();buf.flush();}PrintWriter out=new PrintWriter(s.getOutputStream(),true);out.println("传输成功!");ss.close();buf.close();}}四、Socket在浏览上的应⽤ 我们可以在Eclipse中编写服务器端,然后利⽤浏览器进⾏访问。
Java传输文件方案1. 简介在开发Java应用程序时,经常需要通过网络传输文件。
本文将介绍几种常见的Java传输文件的方案,包括使用原生Java API实现文件传输、使用FTP协议传输文件以及使用HTTP协议传输文件。
2. 使用原生Java API实现文件传输Java提供了一系列的API来处理文件传输操作。
下面将介绍如何使用原生Java API实现文件传输。
2.1 文件上传在Java中,可以使用java.io包提供的类来实现文件上传。
以下是一个简单的文件上传示例:import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import .Socket;public class FileUploader {public static void uploadFile(File file, String host, int port) thr ows IOException {try (Socket socket = new Socket(host, port);FileInputStream fileInputStream = new FileInputStream(fil e);OutputStream outputStream = socket.getOutputStream()) { byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = fileInputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}}}在上述示例中,我们使用Socket类实现了与服务器建立连接,并使用FileInputStream读取文件内容,并通过OutputStream将文件内容写入到服务器。
基于java的远程登录和文件传输功能的实现摘要Internet发展至今产生了两种比较重要的网络体系结构:ISO/OSI和TCP/IP参考模型,ISO/OSI模型有7层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
而TCP/IP模型只有4层:主机至网络层,互连网层,传输层,应用层。
其中TCP/IP 参考模型中的应用层包含所有的高层协议,最早引入的是虚拟终端协议,文件传输协议和电子邮件协议。
本文对网络计算机相互通信的机理进行比较细致和深入的分析,并采用java编程工具实现了远程登录和文件传输的功能。
关键词:TCP/IP JAVA 远程登录文件传输AbstractInternet produces two kinds of more important network system structure so far that Internet is developed, ISO/OSI and TCP/IP consult models, ISO/OSI model is 7 layers: Physics layer, data link layer, network layer, transport layer, session layer, persentaltion layer, opplication layer. And TCP/IP model is 4 layers: From host computer to Internet, network layer, transport layer, opplication layer. TCP/IP among them consult application layer of model include all on the senior level Protocol, introduce TELecommunications NETwork , File Transfer Protocol and Simple Mail Transfer Protocol, Careful and deep analysis that this text compares mechanism that the network computer communicates each other, and adopt java programming tool to realize the functions of telecommunications network and file transfer.KEY WORDS: TCP/IP JA V A TELNET FTP目录前言--------------------------------------------------------------------------------------------1 第一章互联网概述---------------------------------------------------------------------- 3 1.1 互联网的发展状况--------------------------------------------------------------------3 1.2 互联网的应用-------------------------------------------------------------------------5第二章互联网中两种重要的参考模型-----------------------------------------------6 2.1 OSI参考模型-------------------------------------------------------------------------6 2.2 TCP/IP参考模型--------------------------------------------------------------------8第3章远程登录的功能实现----------------------------------------------------------------9 3.1 虚拟终端-------------------------------------------------------------------------------9 3.2 远程登录协议 --------------------------------------------------------------------------11 3.3 有关远程登录的实现方法(线程的概念)---------------------------------------13 3.4 远程登录的最终完成---------------------------------------------------------------18 第4章文件传输的执行行为和功能------------------------------------------------------27 4.1传输文件--------------------------------------------------------------------------------27 4.2 文件传输的传输模式----------------------------------------------------------------28 4.3 构造控制连接和数据连接------------------------------------------------------------32 4.4 文件传输程序的完成-----------------------------------------------------------------42 第5章总结----------------------------------------------------------------------------------53 参考文献---------------------------------------------------------------------------------------54 谢辞----------------------------------------------------------------------------------------55前言历史的发展表明I n t e r n e t的产生要追溯到最开始的时间,穴壁上的画、烟信号、驿站—所有这些通信方式都使我们的祖先一直在考虑一个更好的通信方式。
java网络文件传输的实现——Socket编程本程序分为服务器和客户端两个小程序。
主要实现的功能是:客户端向服务器端请求一个文件的传输连接,服务器接收到请求命令后,要求客户端发送用户名和密码,如果正确,就执行传输文件的过程,客户端接收完后,保存到一个文件中并在屏幕上显示出来。
设计原理:服务器端建立一个SocketServer等待客户端的连接,每来一个客户端的请求连接,就创建一个新的线程对其进行单独服务,然后继续等待其他的客户端的连接。
客户端向服务器发送文件传输请求,在服务器端要求鉴权时,输入用户名和密码发送给服务器验证,如果验证通过就开始文件传输。
使用方法,如果需要重新编译的话输入以下两条命令:javac SendFileSocket.javajavac SendFileClient.java在命令行下的运行方式:服务器端:java SendFileSocket客户端:java SendFileClient serverIPAddress例如:java SendFileClient 192.168.0.153服务器程序:public class SendFileSocket extends Thread{/*** @param args*/public static void main(String[] args ){/*if ( args.length > 0 ) // 如果有参数输入就启动服务器程序 {server( );} else{// 否则启动客户端进程client( );}*/server();//启动服务器程序}private static final int PORT= 6000;private Socket s;private static final String name="zieckey";private static final String password ="123456";public SendFileSocket(Socket s ){this.s = s;}public void run(){try{OutputStream os = s.getOutputStream();InputStream is = s.getInputStream();os.write("Hello,welcome you!".getBytes());byte[] buf =new byte[100];while( true ){int len = is.read( buf );String revStr =new String( buf, 0, len );System.out.println("This client wants to "+revStr );String fileName;if( revStr.startsWith("get "))//表明客户端请求传输一个文件{os.write("Please input your name and password! Using the format:name@password".getBytes());fileName =getFileName( revStr );len = is.read( buf );revStr =new String( buf, 0, len );System.out.println("The received user name and password:"+revStr);if( revStr.startsWith("zieckey@123456")){FileInputStream fins =new FileInputStream( fileName );//byte[] fielBuf = new byte[100];int data;while(-1 !=( data = fins.read()))//从文件中读取数据,每次读取1字节{os.write( data );//将读取到的数据写到网络数据流中发送给客户段}break;}}else{os.write("geting file's usage is:get filename".getBytes());}}os.close();is.close();s.close();}catch(Exception e ){e.printStackTrace();}}/** 作用:从客户端发来了文件请求命令中提取出所请求的文件名 * 参数:客户端发来了文件请求命令字符串,应该以“get ”开头 * 返回值:提取出所请求的文件名*/private String getFileName(String revStr ){String fileName;fileName = revStr.substring( 3 );while( fileName.startsWith(" ")){fileName = fileName.substring( 1 );}return fileName;}public static void server(){System.out.println("This is server");try{ServerSocket ss =new ServerSocket(PORT);int count= 0;while( true ){// 创建一个Socket等待客户端连接Socket s = ss.accept();count++;System.out.println("This is the "+count+"'st client connetion!");new SendFileSocket( s ).start();// 启动一个线程为这个客户端服务}}catch(Exception ex ){ex.printStackTrace();}}/*public static void client(){System.out.println( "This is client" );try{// 创建一个SocketSocket s = new Socket( InetAddress.getByName( null ), PORT );OutputStream os = s.getOutputStream( );// 输出流InputStream is = s.getInputStream( );// 输入流byte[] buf = new byte[100];int len = is.read( buf );// 从输入流中读取数据到bufSystem.out.println( new String( buf, 0, len ) );// 向输出流中写入数据,请求传输一个文件os.write( "get server.txt".getBytes( ) );len = is.read( buf );// 从输入流中读取数据到bufString tempStr = new String(buf,0,len);if ( tempStr.startsWith( "Please input your name and password" ) ){System.out.print("Please input your name and password, ");System.out.print("Using the format:name@password:");System.in.read( buf );os.write( buf );}//开始读取文件数据并把它写到一个名为"clientread.txt"的文件中FileOutputStream fos = new FileOutputStream( "clientread.txt" ); int data;while ( -1 != ( data = is.read( ) ) ){fos.write( data );}System.out.println("\nFile has been recerved successfully.");os.close( );is.close( );s.close( );} catch ( Exception ex ){ex.printStackTrace( );}}*/}客户端程序:import .InetAddress;import .InetSocketAddress;import .Socket;public class SendFileClient{private static final int Server_PORT = 6000;private static final int Client_PORT = 6001;/*** 使用方法:运行这个程序需要带上参数,参数类型为点分十进制的ip地址,例如:192.168.0.153* @param args* @throws IOException*/public static void main(String[] args )throws IOException{// TODO Auto-generated method stubSystem.out.println("This is client");/*System.out.print("Please input your name and password, ");System.out.print("Using the format:name@password:");byte[] buf = new byte[100];System.in.read( buf );*/byte[] buf =new byte[100];byte[]name=new byte[100];//InetAddress inetAddr;if(!isIPAddress(args[0])){System.out.println("The usage is : java SendFileClient ipaddress");System.out.println("For example : java SendFileClient 192.168.0.153");return;}String ipStr = args[0];try{// 创建一个SocketSocket s =new Socket();s.connect(new InetSocketAddress(ipStr , Server_PORT ), Client_PORT );OutputStream os = s.getOutputStream();// 输出流InputStream is = s.getInputStream();// 输入流int len = is.read( buf );// 从输入流中读取数据到bufSystem.out.println(new String( buf, 0, len ));// 向输出流中写入数据,请求传输一个文件os.write("get server.txt".getBytes());len = is.read( buf );// 从输入流中读取数据到bufString tempStr =new String(buf,0,len);if( tempStr.startsWith("Please input your name and password")){System.out.println("Please input your name and password, ");System.out.println("Using the format:name@password:");do{System.in.read(name);}while(name.length<5 );os.write(name);}//开始读取文件数据并把它写到一个名为"clientread.txt"的文件中FileOutputStream fos =new FileOutputStream("clientread.txt");int data;while(-1 !=( data = is.read())){fos.write( data );}System.out.println("\nFile has been recerved successfully.");os.close();is.close();s.close();}catch(Exception ex ){ex.printStackTrace();}。
java实现两台电脑间TCP协议⽂件传输记录下之前所做的客户端向服务端发送⽂件的⼩项⽬,总结下学习到的⼀些⽅法与思路。
注:本⽂参考⾃《⿊马程序员》视频。
⾸先明确需求,在同⼀局域⽹下的机器⼈A想给喜欢了很久的机器⼈B发送情书,但是机器⼈B事先并不知道⼩A的⼼思,那么作为⽉⽼(红娘)该如何帮助他们呢?然后建⽴模型并拆分需求。
这⾥两台主机使⽤⽹线直连,在物理层上确保建⽴了连接,接下来便是利⽤相应的协议将信息从电脑A传给电脑B。
在这⼀步上,可以将此过程抽象为⽹络+I/O(Input、Output)的过程。
如果能在⼀台电脑上实现⽂件之间的传输,再加上相互的⽹络协议,羞涩的A不就可以将情书发送给B了吗?因此要先解决在⼀台电脑上传输信息的问题。
为了在⽹络上传输,使⽤必要的协议是必要的,TCP/IP协议簇就是为了解决计算机间通信⽽⽣,⽽这⾥主要⽤到UDP和TCP两种协议。
当⼩A可以向⼩B发送情书后,⼜出现了众多的追求者,那么⼩B如何去处理这么多的并发任务呢?这时便要⽤到多线程的技术。
因此接下来将分别介绍此过程中所⽤到了I/O流(最基础)、⽹络编程(最重要)、多线程知识(较重要)和其中⼀些⼩技巧。
⼀、I/O流I/O流⽤来处理设备之间的数据传输,Java对数据的传输通过流的⽅式。
流按操作数据分为两种:字节流与字符流。
如果数据是⽂本类型,那么需要使⽤字符流;如果是其他类型,那么使⽤字节流。
简单来说,字符流=字节流+编码表。
流按流向分为:输⼊流(将硬盘中的数据读⼊内存),输出流(将内存中的数据写⼊硬盘)。
简单来说,想要将某⽂件传到⽬的地,需要将此⽂件关联输⼊流,然后将输⼊流中的信息写⼊到输出流中。
将⽬的关联输出流,就可以将信息传输到⽬的地了。
Java提供了⼤量的流对象可供使⽤,其中有两⼤基类,字节流的两个顶层⽗InputStream与OutputStream;字符流的两个顶层⽗类Reader 与Writer。
这些体系的⼦类都以⽗类名作为后缀,⽽⼦类名的前缀就是该对象的功能。
JavaSocket实现⽂件传输⽰例代码最近学Socket学上瘾了,就写了⼀个简单的⽂件传输程序。
客户端设计思路:客户端与服务端建⽴连接,选择客户端本地⽂件,先将⽂件名及⼤⼩等属性发送给服务端,再将⽂件通过流的⽅式传输给服务端。
传输的进度打印到控制台中,直到传输完成。
服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到⼀个客户端请求连接后,就新开⼀个处理⽂件的线程,开始写⼊流,将⽂件到服务器的指定⽬录下,并与传输过来的⽂件同名。
下⾯是客户端和服务端的代码实现:客户端代码:import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import .Socket;/*** ⽂件传输Client端<br>* 功能说明:** @author ⼤智若愚的⼩懂* @Date 2016年09⽉01⽇* @version 1.0*/public class FileTransferClient extends Socket {private static final String SERVER_IP = "127.0.0.1"; // 服务端IPprivate static final int SERVER_PORT = 8899; // 服务端端⼝private Socket client;private FileInputStream fis;private DataOutputStream dos;/*** 构造函数<br/>* 与服务器建⽴连接* @throws Exception*/public FileTransferClient() throws Exception {super(SERVER_IP, SERVER_PORT);this.client = this;System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功连接服务端");}/*** 向服务端传输⽂件* @throws Exception*/public void sendFile() throws Exception {try {File file = new File("E:\\JDK1.6中⽂参考⼿册(JDK_API_1_6_zh_CN).CHM");if(file.exists()) {fis = new FileInputStream(file);dos = new DataOutputStream(client.getOutputStream());// ⽂件名和长度dos.writeUTF(file.getName());dos.flush();dos.writeLong(file.length());dos.flush();// 开始传输⽂件System.out.println("======== 开始传输⽂件 ========");byte[] bytes = new byte[1024];int length = 0;long progress = 0;while((length = fis.read(bytes, 0, bytes.length)) != -1) {dos.write(bytes, 0, length);dos.flush();progress += length;System.out.print("| " + (100*progress/file.length()) + "% |");}System.out.println();System.out.println("======== ⽂件传输成功 ========");}} catch (Exception e) {e.printStackTrace();} finally {if(fis != null)fis.close();if(dos != null)dos.close();client.close();}}/*** ⼊⼝* @param args*/public static void main(String[] args) {try {FileTransferClient client = new FileTransferClient(); // 启动客户端连接client.sendFile(); // 传输⽂件} catch (Exception e) {e.printStackTrace();}}}服务端代码:import java.io.DataInputStream;import java.io.File;import java.io.FileOutputStream;import java.math.RoundingMode;import .ServerSocket;import .Socket;import java.text.DecimalFormat;/*** ⽂件传输Server端<br>* 功能说明:** @author ⼤智若愚的⼩懂* @Date 2016年09⽉01⽇* @version 1.0*/public class FileTransferServer extends ServerSocket {private static final int SERVER_PORT = 8899; // 服务端端⼝private static DecimalFormat df = null;static {// 设置数字格式,保留⼀位有效⼩数df = new DecimalFormat("#0.0");df.setRoundingMode(RoundingMode.HALF_UP);df.setMinimumFractionDigits(1);df.setMaximumFractionDigits(1);}public FileTransferServer() throws Exception {super(SERVER_PORT);}/*** 使⽤线程处理每个客户端传输的⽂件* @throws Exception*/public void load() throws Exception {while (true) {// server尝试接收其他Socket的连接请求,server的accept⽅法是阻塞式的 Socket socket = this.accept();/*** 我们的服务端处理客户端的连接请求是同步进⾏的,每次接收到来⾃客户端的连接请求后,* 都要先跟当前的客户端通信完之后才能再处理下⼀个连接请求。
Java基于TCP协议socket⽹络编程的⽂件传送的实现先了解⼀下socket基本概念socket也叫套接字:是指在⽹路中不同主机上的应⽤进程之间,进⾏双向通信的端点的抽象。
简单理解就是:两个主机之间要通信,就需要知道彼此的ip,端⼝号等信息,⽽⼀台主机这些信息的集合:就可以理解为⼀个端点,即为套接字双⽅通过套接字作为⼀种坐标,建⽴信息通道,形成连接(两点连接⼀条直线)简单理解了套接字的概念后,来看看如何通过java socket编程来实现两台主机⽂件的接收与发送:代码如下:发送⽅:import java.io.*;import .InetAddress;import .Socket;/*** 发送者*/public class TcpSendCilent {public static void main(String[] args) throws Exception {//1.通过socket对象创建socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);//2,创建⼀个字节输出流OutputStream os = socket.getOutputStream();//3.字节⽂件输⼊流读取⽂件//避免出错写需要发送⽂件的绝对路径FileInputStream fis = new FileInputStream(new File("F:/TEST/1604407051256.jpg"));//4.字节⽂件输出流写出⽂件byte[] buffer=new byte[1024*10];int len;while ((len=fis.read(buffer))!=-1){//socket编程基于I/O流所以//输出流写转为字节数组的⽂件 =向接收⽅发送⽂件os.write(buffer,0,len);}//通知服务器我传送完了调⽤shutdownOutput() 否则影响接下来代码执⾏socket.shutdownOutput();//确定服务器接受完毕,断开连接//获取接收⽅响应回来的接受完毕!响应InputStream inputStream = socket.getInputStream();ByteArrayOutputStream baos=new ByteArrayOutputStream();byte[] bytes2=new byte[1024*10];int len2;while ((len2=inputStream.read(bytes2))!=-1){baos.write(bytes2,0,len2);}//显⽰接收⽅的响应System.out.println(baos.toString());//发送结束后,最后关闭所有资源//关闭资源好习惯这部分写的简单//⼀般建议先进⾏⼀个⾮空判断再关闭baos.close();fis.close();os.close();socket.close();}}接收⽅:import java.io.*;import .ServerSocket;import .Socket;/*** 接收端*/public class TcpAcceptServer {public static void main(String[] args) throws IOException {//通过ServerSocket对象创建接收端套接字ServerSocket serverSocket=null;//套接字Socket socket=null;//字节输⼊流InputStream in=null;//默认参数定义端⼝号发送⽅依据这个端⼝号发送serverSocket=new ServerSocket(9000);socket = serverSocket.accept();//socket对象获取输⼊流,拿到⽂件in = socket.getInputStream();//将发送者发送过来的⽂件通过⽂件字节输出流输出到指定路径下FileOutputStream fos = new FileOutputStream(new File("F:/recevice.jpg"));int len;byte[] bytes=new byte[1024*10];while ((len=in.read(bytes))!=-1){fos.write(bytes,0,len);}//通知发送者接受完毕了OutputStream outputStream = socket.getOutputStream();outputStream.write("我是⽂件接收者:我已成功接受".getBytes());//接受结束后,关闭资源好习惯这部分写的简单//⼀般建议先进⾏⼀个⾮空判断再关闭fos.close();serverSocket.close();socket.close();in.close();}}测试⽅法:以上代码可直接粘贴测试1、先运⾏接收者等待接受,2、再运⾏发送者,3、等待接收者向发送者响应:我是⽂件接收者:我已成功接受;4、接收者指定接受⽬录下、查看接收⽂件存在即为接收成功!总结:这个demo实现并不是很难,主要考验了我们对于io流的熟练程度到此这篇关于Java基于TCP协议socket⽹络编程的⽂件传送的实现的⽂章就介绍到这了,更多相关Java socket⽂件传送内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Java简单TCP⽂件传输服务端package TCP;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetSocketAddress;import .ServerSocket;import .Socket;public class TCP_File_Server {public static void main(String[] args) throws Exception {/*** 创建服务端套接字*/ServerSocket ss = new ServerSocket();/*** 绑定指定端⼝*/ss.bind(new InetSocketAddress(12345));System.out.println("《《《《⽹盘开始运⾏》》》》");/*** 监听并接受客户端socket连接,并返回⼀个socket*//*** 持续接收客户端发来的信息,并交给线程处理*/while(true) {Socket socket = ss.accept();new Thread(new UpLoad(socket)).start();}}}class UpLoad implements Runnable{private Socket socket = null;public UpLoad(Socket socket) {this.socket = socket;}@Overridepublic void run() {OutputStream out = null;try {// 创建⽂件输⼊流,接收客户端的socket中的⽂件流InputStream in = socket.getInputStream();/*** 获取⽂件名长度* ⽂件格式:⽂件名长度(数字)\r\⽂件名\r\n⽂件内容\r\n* 获取⽂件名 - 读到第⼀个回车换⾏之前截取出⽂件名的长度接着读取这个长度的字节就是⽂件名* 读取数据直到遇到第⼀个回车换⾏* 每次从流中读取⼀个字节转成字符串拼到line上只要line还不是\r\n结尾就重复这个过程*/String line1 = "";byte[] by1 = new byte[1];while(!line1.endsWith("\r\n")) {in.read(by1);String str = new String(by1);line1 += str;}/*** 1.读到长度,去掉\r\n就是⽂件名字的长度* 2.parseInt():作⽤是将可分析的字符串转化为整数。
java tcp中文解析
Java中的TCP(传输控制协议)是一种面向连接的协议,它提供了可靠的、基于字节流的数据传输。
在Java中,我们可以使用Socket和ServerSocket类来实现TCP通信。
下面我将从多个角度全面解析Java中的TCP通信。
首先,我们需要创建一个ServerSocket对象来监听客户端的连接请求。
一旦有客户端连接,我们就可以通过accept()方法接受连接并创建一个Socket对象来与客户端进行通信。
然后,我们可以使用Socket的InputStream和OutputStream来进行数据的读取和写入。
在TCP通信中,数据的传输是通过字节流进行的,因此我们需要使用InputStream和OutputStream来进行数据的读取和写入。
对于中文数据的处理,我们可以使用InputStreamReader和OutputStreamWriter类来进行字符编码的转换,以确保正确地处理中文字符。
另外,为了确保数据的完整性和可靠性,我们可以使用缓冲流来提高数据传输的效率,并且可以使用ObjectInputStream和
ObjectOutputStream来传输Java对象。
此外,在TCP通信中,我们还需要考虑异常处理、多线程处理、超时设置等问题,以确保通信的稳定和可靠性。
总之,Java中的TCP通信涉及到Socket、ServerSocket、InputStream、OutputStream、字符编码转换、缓冲流、对象序列化
等多个方面,需要综合考虑各种因素来实现稳定、可靠的通信。
希
望以上解析能够全面回答你关于Java TCP的问题。
TCPUDP文件传输无论是TCP或者UDP都需要在服务端开启的情况下进行文件的传输TCP文件传输服务端:import java.io.*;import .*;import java.io.IOException;import java.io.OutputStream;import .ServerSocket;import .Socket;import java.util.Date;import java.util.Scanner;/** 用TCP进行文件传输** 此文件为服务器文件** 当接受到客户端的请求之后,先向其传输文件名* 当客户端接受完毕之后,向客户端传输文件* */public class SendFileServer implements Runnable{// 服务器监听端口private static final int MONITORPORT = 62345;private Socket socketServer ;public SendFileServer(Socket s) {super();this.socketServer = s;}public static void server(){try {// 创建服务器socketServerSocket serverSocket = newServerSocket(MONITORPORT);System.out.println("This is server");System.out.println("link success");while(true){// 接收到一个客户端连接之后,创建一个新的线程进行服务// 并将联通的socket传给该线程Socket s = serverSocket.accept();new Thread(new SendFileServer(s)).start();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// TODO Auto-generated method stubSendFileServer.server();}public void run() {// TODO Auto-generated method stubbyte[] buf = new byte[100];byte [] fer = new byte[100];OutputStream os=null;InputStream is=null;FileInputStream fins=null;try {os = socketServer.getOutputStream();is=socketServer.getInputStream();int len = is.read(buf);String filePath = new String(buf,0,len);// 文件路径// 文件名System.out.println("请输入传输文件的路径(包含后缀名)");Scanner reader = new Scanner(System.in);String filepath = reader.nextLine();os.write(filepath.getBytes());System.out.println("将文件:"+filePath+"传输过去");//先将文件名传输过去os.write(filePath.getBytes());System.out.println("开始传输文件");//将文件传输过去// 获取文件fins = new FileInputStream(filePath);int data;// 通过fins读取文件,并通过os将文件传输long a=new Date().getTime();while(-1!=(data = fins.read())){os.write(data);}System.out.print("This translation costs:");System.out.println( new Date().getTime()-a+"ms");System.out.println("文件传输成功");} catch (IOException e) {e.printStackTrace();}finally{try {is.close();os.close();fins.close();this.socketServer.close();}catch (IOException e) {e.printStackTrace();}}}客户端:import java.io.*;import .*;import java.util.Scanner;import java.util.concurrent.TimeUnit;/** 用TCP进行文件传输* 此文件为客户端文件* 连接上服务器之后,直接接受文件** */public class ReceiveFileClient {private static final String SERVERIP = "127.0.0.1";private static final int SERVERPORT = 62345;private static final int CLIENTPORT = 54321;public static void main(String[] args) {// 用来接受传输过来的字符byte[] buf = new byte[100];byte[] fer=new byte[100];Socket socket = new Socket();try {// 建立连接socket.connect(newInetSocketAddress(SERVERIP,SERVERPORT), CLIENTPORT);InputStream is = socket.getInputStream();OutputStream os=socket.getOutputStream();// 接收传输来的文件名System.out.println("This is the client");System.out.println("请输入请求文件的路径(包含后缀名)");Scanner reader = new Scanner(System.in);String filePath = reader.nextLine();os.write(filePath.getBytes());//接收传输来的文件int len = is.read(fer);String temp = new String(fer,0,len);FileOutputStream fos = new FileOutputStream(temp);int data;for(int i=0;i<filePath.length();i++)is.read();while(-1!=(data = is.read())){fos.write(data);}is.close();os.close();fos.close();socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}UDP文件传输服务端:import java.io.*;import .*;import java.util.Date;import java.util.concurrent.TimeUnit;class SendServer {public static byte[] receiveData = new byte[1024];public static byte[] sendData = new byte[1024];public static byte[] buf=new byte[1024];public static void main(String args[]) throws Exception{BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));DatagramSocket serverSocket = new DatagramSocket(12346);DatagramPacket receivePacket = newDatagramPacket(receiveData, receiveData.length);serverSocket.receive(receivePacket); //接受请求命令InetAddress IPAddress = receivePacket.getAddress();int port = receivePacket.getPort();DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(newString(receivePacket.getData()))));System.out.println("link to the server successfully!");System.out.println("This is the server, welcome you ");System.out.println("Please input the filepath you want from the server :");String filePath =inFromUser.readLine();sendData=filePath.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);serverSocket.send(sendPacket);int read=0;long a=new Date().getTime();System.out.println("The translation is starting");while (true ){if (fis != null) {read = fis.read(buf);}if (read == -1) {System.out.println("The translation is finished");System.out.print("This translation costs:");System.out.println(new Date().getTime()-a+"ms");break;}DatagramPacket dataPacket = new DatagramPacket(buf, buf.length, IPAddress, port);serverSocket.send(dataPacket);TimeUnit.MICROSECONDS.sleep(10);}}}客户端:import java.io.*;import .*;public class ReceiveClient {public static byte[] sendData = new byte[1024];public static byte[] receiveData = new byte[1024];public static byte[]buf=new byte[1024];public static DatagramSocket clientSocket;public static void main(String args[]) throws Exception{BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));clientSocket = new DatagramSocket(12345);InetAddress IPAddress =InetAddress.getByName("localhost");System.out.println("link to host successfully!");System.out.println("This is the server, welcome you "); System.out.println("Please input the filepath you want in the server :");String sentence =inFromUser.readLine();sendData = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,12346);clientSocket.send(sendPacket);//发送请求文件命路径*/DatagramPacket receivePacket = newDatagramPacket(receiveData, receiveData.length);clientSocket.receive(receivePacket);//接受返回文件路径String filePath = new String(receivePacket.getData());DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(filePath))));int i=0;while (i==0)// 无数据,则循环{DatagramPacket dataPacket = new DatagramPacket(buf, buf.length);// 接受返回数据clientSocket.receive(dataPacket);i=dataPacket.getLength();// 接收数据if (i > 0) {// 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点,fileOut.write(buf,0,i);fileOut.flush();i = 0;// 循环接收}}}}。