1
+ # TcpServer
2
+ from PyQt5 .QtWidgets import QMainWindow
3
+ from PyQt5 .QtCore import QObject , QFile , QDateTime , QDataStream , QDir , Qt , QIODevice , QByteArray
4
+ from PyQt5 .QtGui import QImage , QPixmap
5
+ from PyQt5 .QtNetwork import QTcpServer , QTcpSocket , QHostAddress
6
+
7
+ from ui_serverWindow import Ui_serverWindow
8
+ from pailio_recognition import PailioRecog
9
+
10
+ class serverWindow (QMainWindow ):
11
+ def __init__ (self , parent = None ):
12
+ super (serverWindow , self ).__init__ (parent )
13
+ self .ui = Ui_serverWindow ()
14
+
15
+ # Server & Client
16
+ self .client = QTcpSocket (self )
17
+ self .server = QTcpServer (self )
18
+
19
+ # Recieve File
20
+ self .curTime = QDateTime ()
21
+ self .file = QFile ()
22
+ self .image = QImage ()
23
+ self .bytesReceived = 0
24
+ self .fileSize = 0
25
+ self .filePath = ''
26
+ self .savePath = ''
27
+
28
+ self .ui .setupUi (self )
29
+ self .dirSetting ()
30
+
31
+ # Pailio Recognition
32
+ self .ui .stateBrowser .append ('準備辨識系統模型...' )
33
+ self .recogPailio = PailioRecog ()
34
+ self .recogPailio .load_model ()
35
+ self .ui .stateBrowser .append ('模型準備完成...\n ' )
36
+
37
+
38
+ # Connect Signal & Slot
39
+ self .ui .startBtn .clicked .connect (self .startServer )
40
+ self .ui .stopBtn .clicked .connect (self .stopServer )
41
+ self .server .newConnection .connect (self .acceptConnection , Qt .QueuedConnection )
42
+
43
+ def dirSetting (self ):
44
+ dir = QDir ()
45
+ self .savePath = dir .currentPath () + '/recieve/'
46
+ self .ui .savePath .setText (self .savePath )
47
+
48
+ def startServer (self ):
49
+ self .server .listen (QHostAddress .Any , 37 )
50
+ self .ui .stateBrowser .append ('伺服器啟動...' )
51
+ self .ui .startBtn .setEnabled (False )
52
+ self .ui .stopBtn .setEnabled (True )
53
+
54
+ def stopServer (self ):
55
+ self .server .close ()
56
+ self .ui .stateBrowser .append ('伺服器關閉...' )
57
+ self .ui .startBtn .setEnabled (True )
58
+ self .ui .stopBtn .setEnabled (False )
59
+
60
+ def acceptConnection (self ):
61
+ self .curTime = QDateTime .currentDateTime ()
62
+ self .filePath = self .savePath + self .curTime .toString ('yyyy-MM-dd_hh-mm-ss' ) + '.jpg'
63
+ self .file = QFile (self .filePath )
64
+
65
+ # Check File
66
+ if self .file .open (QIODevice .WriteOnly ) == 0 :
67
+ self .ui .stateBrowser .append ('無法開啟檔案: ' + self .filePath )
68
+ return
69
+
70
+ self .bytesReceived = 0
71
+ self .fileSize = 0
72
+ self .client = self .server .nextPendingConnection ()
73
+
74
+ # Connect Signal & Slot
75
+ self .client .readyRead .connect (self .updateProgress )
76
+ self .client .error .connect (self .displayError )
77
+
78
+ def updateProgress (self ):
79
+ stream = QDataStream (self .client )
80
+
81
+ # bytesAvailable > sizeof(qint64) = 8
82
+ if self .client .bytesAvailable () > 8 and self .fileSize == 0 :
83
+ self .fileSize = int (stream .readInt64 ()) # stream >> self.fileSize
84
+ self .bytesReceived += 8
85
+ self .ui .stateBrowser .append ('檔案大小: ' + str (self .fileSize / 1024 ) + 'KB' )
86
+ self .ui .recvProsBar .setMaximum (self .fileSize )
87
+ else :
88
+ self .bytesReceived += int (self .client .bytesAvailable ())
89
+ self .ui .recvProsBar .setValue (self .bytesReceived )
90
+ self .file .write (self .client .readAll ())
91
+
92
+ # Finish Receive
93
+ if self .fileSize == self .bytesReceived :
94
+ self .file .close ()
95
+ self .ui .stateBrowser .append ('檔案已儲存: ' + self .file .fileName ())
96
+
97
+ self .displayImage ()
98
+ self .sendProsResult ()
99
+
100
+ def displayImage (self ):
101
+ if self .image .load (self .filePath ) == 0 :
102
+ self .ui .imageDisplay .setText ('無法顯示圖片' )
103
+ else :
104
+ self .ui .imageDisplay .setPixmap (QPixmap .fromImage (self .image .scaled (300 ,300 )))
105
+
106
+ def sendProsResult (self ):
107
+ self .ui .stateBrowser .append ('開始辨識...' )
108
+ self .recogPailio .start_recognition (self .filePath )
109
+ self .ui .stateBrowser .append ('辨識完成...' )
110
+
111
+ self .prosResult = str (self .recogPailio .recogClass ) + ' (相似度' + str (self .recogPailio .top_score * 100 ) + '%)'
112
+ self .ui .stateBrowser .append ('辨識結果: ' + self .prosResult )
113
+
114
+ # Send result
115
+ byteArray = QByteArray ()
116
+ byteArray .append (bytes (self .prosResult , encoding = 'UTF-8' ))
117
+ # sendStream = QDataStream(byteArray, QIODevice.WriteOnly)
118
+ # sendStream.writeString(bytes(self.prosResult, encoding = 'UTF-8'))
119
+ self .client .write (byteArray )
120
+ self .ui .stateBrowser .append ('送出辨識結果...' )
121
+
122
+
123
+ def displayError (self , socketError ):
124
+ if socketError == QTcpSocket .RemoteHostClosedError :
125
+ self .ui .stateBrowser .append ('連結中斷...' )
126
+ self .ui .stateBrowser .append ('-------------------------\n ' )
127
+ else :
128
+ self .ui .stateBrowser .append ('Network error: ' + self .client .errorString ())
129
+ self .ui .stateBrowser .append ('-------------------------\n ' )
130
+ self .file = 0
0 commit comments