9Mcode comment |
 |
 |
|
|
|
 |
- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -
|
|
 |
กระทู้ #3515 [Vb] (จาก IP: 171.98.38.182)
ช่วยแปลงโค๊ด Console เป็น Windows Form ทีครับ VB2008
Imports System.Net.Sockets Imports System.Text Module Module1 Dim clientsList As New Hashtable Sub Main() Dim serverSocket As New TcpListener(1234) Dim clientSocket As TcpClient Dim infiniteCounter As Integer Dim counter As Integer serverSocket.Start() msg("Chat Server Started ....") counter = 0 infiniteCounter = 0 For infiniteCounter = 1 To 2 infiniteCounter = 1 counter += 1 clientSocket = serverSocket.AcceptTcpClient()
Dim bytesFrom(10024) As Byte Dim dataFromClient As String
Dim networkStream As NetworkStream = _ clientSocket.GetStream() networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize)) dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom) dataFromClient = _ dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
clientsList(dataFromClient) = clientSocket
broadcast(dataFromClient + " Joined ", dataFromClient, False)
msg(dataFromClient + " Joined chat room ") Dim client As New handleClinet client.startClient(clientSocket, dataFromClient, clientsList) Next clientSocket.Close() serverSocket.Stop() msg("exit") Console.ReadLine() End Sub
Sub msg(ByVal mesg As String) mesg.Trim() Console.WriteLine(" >> " + mesg) End Sub Private Sub broadcast(ByVal msg As String, ByVal uName As String, ByVal flag As Boolean) Dim Item As DictionaryEntry For Each Item In clientsList Dim broadcastSocket As TcpClient broadcastSocket = CType(Item.Value, TcpClient) Dim broadcastStream As NetworkStream = _ broadcastSocket.GetStream() Dim broadcastBytes As [Byte]()
If flag = True Then broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg) Else broadcastBytes = Encoding.ASCII.GetBytes(msg) End If
broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length) broadcastStream.Flush() Next End Sub
Public Class handleClinet Dim clientSocket As TcpClient Dim clNo As String Dim clientsList As Hashtable
Public Sub startClient(ByVal inClientSocket As TcpClient, _ ByVal clineNo As String, ByVal cList As Hashtable) Me.clientSocket = inClientSocket Me.clNo = clineNo Me.clientsList = cList Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat) ctThread.Start() End Sub
Private Sub doChat() Dim infiniteCounter As Integer Dim requestCount As Integer Dim bytesFrom(10024) As Byte Dim dataFromClient As String Dim sendBytes As [Byte]() Dim serverResponse As String Dim rCount As String requestCount = 0 For infiniteCounter = 1 To 2 infiniteCounter = 1 Try requestCount = requestCount + 1 Dim networkStream As NetworkStream = _ clientSocket.GetStream() networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize)) dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom) dataFromClient = _ dataFromClient.Substring(0, dataFromClient.IndexOf("$")) msg("From client - " + clNo + " : " + dataFromClient) rCount = Convert.ToString(requestCount)
broadcast(dataFromClient, clNo, True) Catch ex As Exception MsgBox(ex.ToString) End Try Next End Sub
End Class End Module
รบกวนด้วยครับผม
|
จากคุณ
:
นักเขียนโปรแกรมฝึกหัด [2014-07-04 20:36:20]
|
|
ความคิดเห็น #29062 (จาก IP: 101.108.26.112)
"นักเขียนโปรแกรมฝึกหัด" ก็ควรหัดทำเองครับ
วิธีการคือเริ่มแกะจาก Sub main ว่าทำอะไรบ้าง เรียกใช้อะไรบ้าง เมื่อรู้ว่าโค้ดส่วนไหนทำอะไร ต่อไปก็ทำการออกแบบหน้าตาของ Window Form แล้วกำหนดว่าเมื่อกด Control อะไรแล้วให้ทำ Event อะไร และไปเรียกโค้ดในส่วนใดให้ทำงาน
หลักการมีเท่านี้ |
จากคุณ
:
maddog [2014-07-05 02:57:40]
|
 |
ความคิดเห็น #29063 (จาก IP: 171.98.38.182)
คุณ "maddog" ช่วยบอกหน่อยได้ไหมครับว่าส่วนไหนของโค๊ดที่ทำให้โปรแกรมออกมาเป็น console อะครับ |
จากคุณ
:
นักเขียนโปรแกรมฝึกหัด [2014-07-05 11:08:07]
|
 |
ความคิดเห็น #29064 (จาก IP: 103.5.27.23)
ถ้าคุณสร้าง Project เป็น console เวลาคุณ Run โปรแกรม ตัวโปรแกรมจะเริ่มทำงานที่ Sub Main()
ถ้าคุณสร้าง Project เป็น Windows form ก็จะเริ่มการทำงานที่ ฟอร์มที่เป็นฟอร์มหลัก (ถ้าคุณสร้างมาแรกๆจะมีฟอร์มเดียว)
ปัญหาของคุณคือ ต้องเข้าใจการทำงานของ console แล้วแปลงมาทำงานบน window form |
จากคุณ
:
maddog [2014-07-05 15:23:59]
|
 |
ความคิดเห็น #29065 (จาก IP: 171.98.38.182)
ช่วยอธิบายหน่อยได้ไหมครับ ผมงงตรง Byte มากเลย แล้วก็ พวก "System.Text.Encoding.ASCII.GetString" คือมันใช้ได้แต่บัน console หรือเปล่าครับ แล้วพวก .Read มันทำหน้าที่อะไรแล้วเราจะใช้อะไรแทนมันได้ครับ สรุปทั้งหมดผมแค่ต้องการแปลงให้มันแสดงข้อความบนฟอร์มแทนการแสดงบน console เท่านั้นครับผม ถ้ากรุณาผมหน่อยช่วยอธิบายส่วนที่สำคัญคร่าวๆให้ผมหน่อยได้ไหมครับ จะเป็นพระคุณมากเลยครับ ผมพยายามนั่งแกะโค๊ดมา 3 วันแล้ว ตันจริงๆครับ |
จากคุณ
:
นักเขียนโปรแกรมฝึกหัด [2014-07-05 18:01:06]
|
 |
ความคิดเห็น #29066 (จาก IP: 125.24.163.234)
จากคำถามทำให้ผมทราบว่าพื้นฐานคุณไม่แน่นครับ แนะนำให้หาหนังสืออ่านเพิ่มเติมความรู้ครับ
"System.Text.Encoding.ASCII.GetString" ใช้ได้ตาม .net framework ดังต่อไปนี้ .NET Framework Supported in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0 ข้อมูลจาก http://msdn.microsoft.com/en-us/library/744y86tc(v=vs.110).aspx
.read ใช้อ่านข้อมูลจาก network คุณถามว่า "จะใช้อะไรแทน" ?? ก็แค่เค้าไปดูว่า ต้องสร้าง project ให้รองรับ .net รุ่นใดบ้างถึงจะรองรับ ลองศึกษาข้อมูลนี้ ดู http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx
Console.WriteLine(" >> " + mesg) คุณก็เปลี่ยนไปใช้เป็น MessageBox.Show(" >> " + mesg) |
จากคุณ
:
maddog [2014-07-05 23:51:38]
|
 |
ความคิดเห็น #29067 (จาก IP: 103.5.27.65)
อีกสิ่งนึงที่ผม แอะใจก็คือ โค้ดที่คุณให้มานั้นอยู่ใน Module Module1 .... ซึ่งถ้าให้ผมเดา คุณแค่ new project เป็นแบบ windows แล้วทำการ new module เข้ามา แล้วก็ ก๊อบโค้ดนี้ไปใส่
จากนั้นก็ลองเขียนโค้ดจากส่วนของ windows มาลองเรียกใช้ function และ methode ดูว่า สามารถเรียกใช้งานได้ไหม๊
ลองดูครับ |
จากคุณ
:
maddog [2014-07-06 15:24:19]
|
 |
ความคิดเห็น #29068 (จาก IP: 171.98.38.182)
โค๊ดนี้เป็นโค๊ด Chat Server ครับ ผมลองพยายามดูแล้ว Client สามารถสื่อสารกันได้ และ Console ไม่ขึ้นมา Windows Form ขึ้น Not Responding ทำไรไม่ได้เลย แต่ Client สื่อสารผ่าน Server ได้ปกติ ผมลองแกะดูทีละบรรทัดแล้ว ถ้าไม่ผิดพบว่าโค๊ดใน Sub Main อะครับ ที่ทำให้ Windows Form ค้างแล้วก็ขึ้น Not Responding แล้วก็ผมขอถามนิดนึงครับว่าโค๊ดเนี่ย<br><br>Private Sub broadcast(ByVal msg As String, ByVal uName As String, ByVal flag As Boolean)<br><br>Dim Item As DictionaryEntry<br>For Each Item In clientsList<br>Dim broadcastSocket As TcpClient<br>broadcastSocket = CType(Item.Value, TcpClient)<br>Dim broadcastStream As NetworkStream = _<br>broadcastSocket.GetStream()<br>Dim broadcastBytes As [Byte]()<br><br>If flag = True Then<br>broadcastBytes = Encoding.ASCII.GetBytes(uName + \ |
จากคุณ
:
นักเขียนโปรแกรมฝึกหัด [2014-07-06 19:50:58]
|
 |
ความคิดเห็น #29069 (จาก IP: 171.98.38.182)
จากโค๊ดข้างบน อาจจะดูไม่รู้เรื่องนะครับเอาเป็นว่าโค๊ดตรง Private Sub broadcast อะครับ ผมเข้าใจว่ามันน่าจะเป็นโค๊ดที่รับข้อความจากทางฝั่ง Client มาแสดงบน Console Server นะครับ แล้วทีนี้ผมจะทำยังไงให้มัน แสดงข้อความบน TextBox ดีครับ |
จากคุณ
:
นักเขียนโปรแกรมฝึกหัด [2014-07-06 19:56:28]
|
 |
ความคิดเห็น #29070 (จาก IP: 101.108.3.133)
เดาผิดไปเยอะครับ ส่วนแสดงข้อความคือ Sub msg
ลองแก้เป็น----------------------------- Sub msg(ByVal mesg As String) mesg.Trim()
Textbox1.text = Textbox1.text + ">>" + mesg + "\n" End Sub |
จากคุณ
:
maddog [2014-07-06 20:27:06]
|
 |
|
- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -
|
|
|
|
|
|
|