Popular Posts
javax.net.ssl.SSLHandshakeException: Connection closed by peer in Android 5.0 Lollipop Recently, there is a error occurs when access website via ssl connection like below although it worked fine several days ago. // Enable SSL... Enable SSL connection for Jsoup import org.jsoup.Connection; import org.jsoup.Jsoup; import javax.net.ssl.*; import java.io.IOException; import java.security.KeyManagement... Build an OpenVPN server on android device Preparation An android device, in this case, Sony xperia Z is used Root permission required Linux Deploy for deploy i...
Stats
Stopwatch
  1. Stopwatch sw = new Stopwatch();
  2. sw.Start();
  3. for (int i = 0; i < 500000; i++)
  4. {
  5.     List<string> list = new List<string>();
  6. }
  7. sw.Stop();
  8. Console.WriteLine(sw.Elapsed);
  9. Console.Read();
Remoting config & Start remoting using config
.config
  1. <system.runtime.remoting>
  2.     <application name="ScheduleServiceMonitor">
  3.         <service>
  4.             <wellknown type="ScheduleService.Remoting.ServiceMonitor, ServicePlugin" mode="Singleton" objectUri="ScheduleService.Remoting" />
  5.         </service>
  6.         <channels>
  7.             <channel ref="tcp" port="9876" />
  8.         </channels>
  9.     </application>
  10. </system.runtime.remoting>
start remoting
  1. RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, false);
TCP file transfer
TransferFile.vb
  1. Imports System.SerializableAttribute
  2.  
  3. <Serializable()> Public Class TransferFile
  4.     Public FileName As String
  5.     Public Data() As Byte
  6. End Class
TcpFileReceiver.vb
  1. Imports System.Net.Sockets
  2. Imports System.Net
  3. Imports System.IO
  4. Imports System.Threading
  5. Imports System.SerializableAttribute
  6. Imports System.Runtime.Serialization.Formatters.Binary
  7.  
  8. Public Class TcpFileReceiver
  9.  
  10.     ' 預設寫入檔案資料夾
  11.     Public SavePath As String = AppDomain.CurrentDomain.BaseDirectory
  12.     ' 監聽器
  13.     Private fileListener As TcpListener
  14.     ' 暫存資料
  15.     Private tempData As Dictionary(Of String, List(Of Byte))
  16.  
  17.     Public Sub New(ByVal ip As IPAddress, ByVal port As Integer)
  18.         Me.fileListener = New TcpListener(New IPEndPoint(ip, port))
  19.         Me.tempData = New Dictionary(Of String, List(Of Byte))
  20.     End Sub
  21.  
  22.     ' 開始監聽
  23.     Public Sub Start()
  24.         Me.fileListener.Start()
  25.         ' 建立接收連線的執行緒
  26.         Dim listenThread As Thread = New Thread(New ThreadStart(AddressOf DeterminConnection))
  27.         listenThread.IsBackground = True
  28.         listenThread.Start()
  29.     End Sub
  30.  
  31.     ' 結束監聽
  32.     Public Sub StopListen()
  33.         Me.fileListener.Stop()
  34.     End Sub
  35.  
  36.     ' 偵測client端連接
  37.     Private Sub DeterminConnection()
  38.         Do
  39.             Try
  40.                 ' 如果有連接
  41.                 If Me.fileListener.Pending Then
  42.                     ' 建立傳輸的執行緒
  43.                     Dim receiveThread As Thread = New Thread(New ThreadStart(AddressOf StartServerListener))
  44.                     receiveThread.IsBackground = True
  45.                     receiveThread.Start()
  46.                 End If
  47.             Catch ex As Exception
  48.                 ' do something
  49.             End Try
  50.             GC.Collect()
  51.             Thread.Sleep(1000)
  52.         Loop
  53.     End Sub
  54.  
  55.     ' 起始傳輸
  56.     Private Sub StartServerListener()
  57.         Do
  58.             Try
  59.                 ' 建立傳輸通道
  60.                 Dim rSocket As Socket = Me.fileListener.AcceptSocket()
  61.                 If rSocket.Connected Then
  62.                     ' 接收連線的buffer
  63.                     Dim rBuffer(1024) As Byte
  64.                     ' 暫存資料的key
  65.                     Dim rGuid As String = Guid.NewGuid.ToString
  66.                     ' 開始接收
  67.                     SyncLock rSocket
  68.                         rSocket.BeginReceive(rBuffer, 0, 1024, SocketFlags.None, AddressOf GetData, New Object() {rSocket, rBuffer, rGuid})
  69.                     End SyncLock
  70.                 End If
  71.             Catch ex As Exception
  72.                 Return
  73.             End Try
  74.         Loop
  75.     End Sub
  76.  
  77.     Private Sub GetData(ByVal result As IAsyncResult)
  78.         Try
  79.             ' 目前傳輸的socket
  80.             Dim rSocket As Socket = CType(result.AsyncState, Object())(0)
  81.             ' 接收的資料
  82.             Dim rBuffer() As Byte = CType(result.AsyncState, Object())(1)
  83.             ' 暫存資料的key
  84.             Dim rGuid As String = CType(result.AsyncState, Object())(2)
  85.  
  86.             ' 如果沒有資料, 建立暫存區
  87.             If Not Me.tempData.ContainsKey(rGuid) Then
  88.                 Me.tempData.Add(rGuid, New List(Of Byte))
  89.             End If
  90.  
  91.             ' 讀取的總數
  92.             Dim readed As Integer = rSocket.EndReceive(result)
  93.             If readed > 0 Then
  94.  
  95.                 'Dim data As List(Of Byte) = tempData(rGuid)
  96.                 'For i As Integer = 0 To readed - 1
  97.                 '    Me.tempData(rGuid).Add(rBuffer(i))
  98.                 'Next
  99.  
  100.                 ' 存入暫存區
  101.                 Array.Resize(rBuffer, readed)
  102.                 Me.tempData(rGuid).AddRange(rBuffer)
  103.  
  104.                 ' 讀取下一段資料
  105.                 ReDim rBuffer(1024)
  106.                 SyncLock rSocket
  107.                     rSocket.BeginReceive(rBuffer, 0, 1024, SocketFlags.None, AddressOf GetData, New Object() {rSocket, rBuffer, rGuid})
  108.                 End SyncLock
  109.                
  110.             Else
  111.                 rSocket = Nothing
  112.                 rBuffer = Nothing
  113.  
  114.                 ' 反序列化
  115.                 Dim transferObj As TransferFile = Me.Deserialize(Me.tempData(rGuid).ToArray)
  116.  
  117.                 ' 存檔
  118.                 File.WriteAllBytes(Me.SavePath & transferObj.FileName, transferObj.Data)
  119.                 ' 移除暫存資料
  120.                 Me.tempData(rGuid).Clear()
  121.                 Me.tempData.Remove(rGuid)
  122.                 rGuid = Nothing
  123.                 ' 資源回收
  124.                 GC.Collect()
  125.             End If
  126.         Catch ex As Exception
  127.             ' do something
  128.         End Try
  129.     End Sub
  130.  
  131.     ' 反序列化
  132.     Private Function Deserialize(ByRef data() As Byte) As TransferFile
  133.         Dim ms As MemoryStream = New MemoryStream(data)
  134.         Dim formater As BinaryFormatter = New BinaryFormatter
  135.         Dim transferObj As TransferFile = formater.Deserialize(ms)
  136.         ms.Close()
  137.         Return transferObj
  138.     End Function
  139.  
  140. End Class
TcpFileSender.vb
  1. Imports System.IO
  2. Imports System.Net.Sockets
  3. Imports System.Net
  4. Imports System.Threading
  5. Imports System.SerializableAttribute
  6. Imports System.Runtime.Serialization.Formatters.Binary
  7.  
  8. Public Class TcpFileSender
  9.  
  10.     Private client As TcpClient
  11.  
  12.     Public Sub New()
  13.         Me.client = New TcpClient()
  14.     End Sub
  15.  
  16.     Public Function ConnectServer(ByVal ip As IPAddress, ByVal port As Integer) As Boolean
  17.         Try
  18.             ' 連接至server
  19.             Me.client.Connect(New IPEndPoint(ip, port))
  20.             Return True
  21.         Catch ex As Exception
  22.             Return False
  23.         End Try
  24.     End Function
  25.  
  26.     Public Sub CloseConnection()
  27.         Me.client.Close()
  28.         GC.Collect()
  29.     End Sub
  30.  
  31.     Public Sub Send(ByVal filepath As String)
  32.         Dim thread As Thread = New Thread(New ParameterizedThreadStart(AddressOf SendFile))
  33.         thread.IsBackground = True
  34.         thread.Start(filepath)
  35.     End Sub
  36.  
  37.     Public Sub SendFile(ByVal filepath As String)
  38.         ' 檔案不存在
  39.         If Not File.Exists(filepath) Then
  40.             Throw New FileNotFoundException
  41.         End If
  42.  
  43.         ' 建立要傳送的物件實體
  44.         Dim transferObj As TransferFile = New TransferFile
  45.         ' 取檔名
  46.         Dim inputFile As FileInfo = New FileInfo(filepath)
  47.         transferObj.FileName = inputFile.Name
  48.  
  49.         ' 讀取檔案
  50.         Dim inputStream As FileStream = New FileStream(filepath, FileMode.Open)
  51.         ReDim transferObj.Data(inputStream.Length)
  52.         inputStream.Read(transferObj.Data, 0, transferObj.Data.Length)
  53.         inputStream.Close()
  54.  
  55.         ' 序列化
  56.         Dim transferData() As Byte = Me.Serialize(transferObj)
  57.  
  58.         If Me.client.Connected Then
  59.             ' 防止檔案過大, 佇列已滿
  60.             While True
  61.                 Try
  62.                     Me.client.GetStream.Write(transferData, 0, transferData.Length)
  63.                     GC.Collect()
  64.                     Exit While
  65.                 Catch ex As Exception
  66.                     Threading.Thread.Sleep(1000)
  67.                 End Try
  68.             End While
  69.         Else
  70.             Throw New Exception("Not Connected!")
  71.         End If
  72.     End Sub
  73.  
  74.     ' 序列化物件
  75.     Private Function Serialize(ByVal obj As Object) As Byte()
  76.         Dim ms As MemoryStream = New MemoryStream
  77.         Dim formater As BinaryFormatter = New BinaryFormatter
  78.         formater.Serialize(ms, obj)
  79.         Dim data() As Byte = ms.GetBuffer
  80.         ms.Close()
  81.         Return data
  82.     End Function
  83. End Class