diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..560e992
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
+    <data-source source="LOCAL" name="Ubuntu_22.04" uuid="62270945-7c29-45e9-b4d7-a582be988551">
+      <driver-ref>mysql.8</driver-ref>
+      <synchronize>true</synchronize>
+      <jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
+      <jdbc-url>jdbc:mysql://116.62.133.59:3306</jdbc-url>
+      <working-dir>$ProjectFileDir$</working-dir>
+    </data-source>
+  </component>
+</project>
\ No newline at end of file
diff --git a/MatchLogs.txt b/MatchLogs.txt
index d4fe56f..a2fec18 100644
Binary files a/MatchLogs.txt and b/MatchLogs.txt differ
diff --git a/src/com/qst/dms/net/DmsNetServer.java b/src/com/qst/dms/net/DmsNetServer.java
new file mode 100644
index 0000000..7a372aa
--- /dev/null
+++ b/src/com/qst/dms/net/DmsNetServer.java
@@ -0,0 +1,101 @@
+package com.qst.dms.net;
+
+import com.qst.dms.entity.MatchedLogRec;
+import com.qst.dms.entity.MatchedTransport;
+import com.qst.dms.service.LogRecService;
+import com.qst.dms.service.TransportService;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+
+public class DmsNetServer {
+    public static void main(String[] args) {
+        AcceptLogThread acceptLogThread = new AcceptLogThread(10000);
+        AcceptTranThread acceptTranThread = new AcceptTranThread(10001);
+        acceptLogThread.start();
+        acceptTranThread.start();
+    }
+}
+
+class AcceptLogThread extends Thread{
+    Socket socket;
+    ObjectInputStream ois;
+    ServerSocket serverSocket;
+    LogRecService logRecService;
+
+    AcceptLogThread(int port){
+        logRecService = new LogRecService();
+        try{
+            serverSocket = new ServerSocket(port);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+    }
+    @Override
+    public void run() {
+        while(this.isAlive())
+        {
+            try{
+                socket = serverSocket.accept();
+                if(socket!=null)
+                {
+                    ois = new ObjectInputStream(socket.getInputStream());
+                    ArrayList<MatchedLogRec>matchedLogRecs = (ArrayList<MatchedLogRec>) ois.readObject();
+                    logRecService.saveMatchLogToDB(matchedLogRecs);
+                    System.out.println("完成一次日志数据接收");
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+}
+class AcceptTranThread extends Thread{
+    ServerSocket serverSocket;
+    Socket socket;
+    ObjectInputStream ois;
+    TransportService transportService;
+
+    AcceptTranThread(int port){
+        transportService = new TransportService();
+        try{
+            serverSocket = new ServerSocket(port);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+    }
+    @Override
+    public void run() {
+        while(this.isAlive())
+        {
+            try{
+                socket = serverSocket.accept();
+                if(socket!=null)
+                {
+                    ois = new ObjectInputStream(socket.getInputStream());
+                    ArrayList<MatchedTransport>matchedTransports = (ArrayList<MatchedTransport>) ois.readObject();
+                    transportService.saveMatchTransportToDB(matchedTransports);
+                    System.out.println("完成一次物流数据接收");
+                }
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+}
+
diff --git a/src/com/qst/dms/ui/InfoInputFXML.java b/src/com/qst/dms/ui/InfoInputFXML.java
index c8c998e..038a28a 100644
--- a/src/com/qst/dms/ui/InfoInputFXML.java
+++ b/src/com/qst/dms/ui/InfoInputFXML.java
@@ -19,8 +19,11 @@ import javafx.scene.paint.Color;
 import javafx.scene.input.MouseEvent;
 import javafx.util.Duration;
 
+import java.io.IOException;
+import java.io.ObjectOutputStream;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
+import java.net.Socket;
 import java.net.SocketException;
 import java.sql.ResultSet;
 import java.util.*;
@@ -184,6 +187,7 @@ public class InfoInputFXML {
             if(!logIDValid)
                 throw new Exception("ID已被占用");
             id = Integer.parseInt(Sid);
+
         }
         catch(NumberFormatException e)
         {
@@ -512,31 +516,93 @@ public class InfoInputFXML {
 
     @FXML
     public void matchedAcquisitionLogData(ActionEvent event) {
-        if(logRecList.isEmpty())
-        {
+        if(matchedLogs==null)
             matchedLogs = new ArrayList<>();
+        if(logRecList.isEmpty())
             return;
-        }
         LogRecAnalyse logAn = new LogRecAnalyse(logRecList);
         logAn.doFilter();
-        matchedLogs = logAn.matchData();
+        matchedLogs.addAll(logAn.matchData());
     }
 
     @FXML
     public void matchedAcquisitionTransportData(ActionEvent event){
-        if(transportList.isEmpty())
-        {
+        if(matchedTrans==null)
             matchedTrans = new ArrayList<>();
+        if(transportList.isEmpty())
             return;
-        }
         TransportAnalyse transAn = new TransportAnalyse(transportList);
         transAn.doFilter();
-        matchedTrans = transAn.matchData();
+        matchedTrans.addAll(transAn.matchData());
     }
 
     @FXML
     public void sandData(ActionEvent event) {
-        //开发中……
+        boolean doLog=false,doTransport=false;
+        if((matchedLogs==null||matchedLogs.isEmpty())&&!logRecList.isEmpty())
+        {
+            doLog=true;
+            Alert alert = new Alert(AlertType.CONFIRMATION);
+            alert.setTitle("Warning Dialog");
+            alert.setHeaderText("配对的日志数据为空");
+            alert.setContentText("你是否忘记匹配日志数据,要匹配日志数据吗?");
+            Optional<ButtonType> result = alert.showAndWait();
+            if (result.get() == ButtonType.OK){
+                matchedAcquisitionLogData(null);
+                if(matchedLogs.isEmpty())
+                    doLog=false;
+            }
+            else doLog=false;
+        }
+        if(doLog)
+        {
+            try {
+                Socket logSocket = new Socket("116.62.133.59",10000);
+                ObjectOutputStream oos = new ObjectOutputStream(logSocket.getOutputStream());
+                oos.writeObject(matchedLogs);
+                oos.flush();
+                oos.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            logService.saveAndAppendMatchLog(matchedLogs);
+            //logService.saveMatchLogToDB(matchedLogs);//添加至DB
+            logRecList.clear();
+            matchedLogs.clear();
+            logUpVal=0;
+        }
+        if((matchedTrans==null|| matchedTrans.isEmpty())&&!transportList.isEmpty())
+        {
+            doTransport=true;
+            Alert alert = new Alert(AlertType.CONFIRMATION);
+            alert.setTitle("Warning Dialog");
+            alert.setHeaderText("配对的物流数据为空");
+            alert.setContentText("你是否忘记匹配物流数据,要匹配物流数据吗?");
+            Optional<ButtonType> result = alert.showAndWait();
+            if (result.get() == ButtonType.OK){
+                matchedAcquisitionTransportData(null);
+                if(matchedTrans.isEmpty())
+                    doTransport=false;
+            }
+            else doTransport=false;
+        }
+        if(doTransport)
+        {
+            try {
+                    Socket transSocket = new Socket("116.62.133.59",10001);
+                    ObjectOutputStream oos = new ObjectOutputStream(transSocket.getOutputStream());
+                    oos.writeObject(matchedLogs);
+                    oos.flush();
+                    oos.close();
+            } catch (IOException e) {
+                    e.printStackTrace();
+            }
+            logService.saveAndAppendMatchLog(matchedLogs);
+            //logService.saveMatchLogToDB(matchedLogs);//添加至DB
+            logRecList.clear();
+            matchedLogs.clear();
+            logUpVal=0;
+        }
     }
 
     @FXML
@@ -560,9 +626,9 @@ public class InfoInputFXML {
         if(doLog)
         {
             logService.saveAndAppendMatchLog(matchedLogs);
-            logService.saveMatchLogToDB(matchedLogs);//添加至DB
+            //logService.saveMatchLogToDB(matchedLogs);//添加至DB
             logRecList.clear();
-            matchedLogs.clear();
+            //matchedLogs.clear(); 不再删除matchedLogs 因为需要发送
             logUpVal=0;
         }
         if((matchedTrans==null|| matchedTrans.isEmpty())&&!transportList.isEmpty())
@@ -583,9 +649,9 @@ public class InfoInputFXML {
         if(doTransport)
         {
             tranService.saveAndAppendTransport(matchedTrans);
-            tranService.saveMatchTransportToDB(matchedTrans);//添加至DB
+            //tranService.saveMatchTransportToDB(matchedTrans);//添加至DB
             transportList.clear();
-            matchedTrans.clear();
+            //matchedTrans.clear(); 不再删除matchedTrans 因为需要发送
             transportUpVal=0;
         }
     }