最近要写一个使用TCP进行文件传输的软件,考虑客户端是使用手机的,因此,准备采用Java作为开发语言,自己本身对于Java本不熟,还好,有个热心的网友已经将TA的代码公开了,有了这个基本原型,就可以进行进一步开发了。
服务器端采用的是TCP server socket监听端口,如果有客户端连接到服务器,就创建一个新的线程进行处理,在这个线程中,只接受客户端发送过来的数据,并保存发送过来的数据到指定文件中。
代码如下:
设置TCP Server Socket监听端口的类:
/** * */ package com.sheng.Server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * @author sheng * */ public class Server { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub // TCP 服务器监听6666端口 ServerSocket socket = new ServerSocket(6666); Socket client = null; while (true) { // 接收客户端连接 client = socket.accept(); System.out.println("Accept clinte."); // 处理客户端的连接 new Thread(new RecivingDataThread(client)).start(); } } }
处理客户端请求的线程类:
/** * */ package com.sheng.Server; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.Socket; /** * @author sheng * */ public class RecivingDataThread implements Runnable { private Socket Client = null; public static int NumberOfThreads = 0; public RecivingDataThread(Socket Client) { this.Client = Client; NumberOfThreads++; } public void run() { BufferedInputStream SocketInput = null; // TODO Auto-generated method stub try { SocketInput = new BufferedInputStream(Client.getInputStream()); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } // 接收文件的名字 FileNamePackage Name = new FileNamePackage(true); if (Name.Receive(SocketInput) != -1) { System.out.println("The name is " + Name.GetFileName()); } else { System.out.println("Cannot read the data."); } String ReceiveName = Name.GetFileName(); // 打开要写入的文件 FileOutputStream fos = null; try { fos = new FileOutputStream("D:/" + ReceiveName); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } BufferedOutputStream bos = new BufferedOutputStream(fos); System.out.println("Reading data."); // 接收文件数据 FileDataPackage Data = new FileDataPackage(true); while (Data.Receive(SocketInput) != -1) { Data.Write(bos); } // 关闭输出的文件和Socket try { bos.close(); fos.close(); SocketInput.close(); Client.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("client socket is end."); } }