关于 Socket通信的问题S段向C段选择性广播(高分求解)
已经实现了基本的,通信
S端发布服务后,多个C端都可以发送信息并且收到回复信息
但是 如果我想从S端,选择性的发送信息到某一个S端应该怎么做呢,C端是不是需要 一个先程一直监控着端口呢?
我对线程管理和Socket都不是很了解 也是新学的,但是好多作底层的朋友特别的少所以没办法了上来,问问。
下面是
S端代码 如下
'------------------------------------------------------------------------------------
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Public Class Form1
Private s As Socket
Private th As Thread
Public cSocket As Socket
Public ns As NetworkStream
Public sr As StreamReader
Public sw As StreamWriter
Private Delegate Sub SetTextCallBack()
Public Sub Communication()
While True
Try
cSocket = s.Accept()
If cSocket.Connected Then
ns = New NetworkStream(cSocket)
sr = New StreamReader(ns)
sw = New StreamWriter(ns)
Call test()
'---------------------------------
sw.WriteLine("确认收到信息")
'这里可以在收到信息后,向C端返回信息,但是我要是想随时发送信息 还需要添加什么呢?
'请会的朋友指点一下,实在不知道怎么写了。在网络上没找到比较。明白的例子
'---------------------------------
sw.Flush()
Else
MessageBox.Show("连接失败")
End If
Catch ex As SocketException
MessageBox.Show(ex.Message)
Catch ex As Exception
MessageBox.Show("其他异常" + ex.Message)
End Try
End While
End Sub
'将数据写入控件中
Public Sub send()
Dim strTemp As String = sr.ReadLine.ToString
lstInfo.Items.Add(strMsg(0) + Chr(10))
End Sub
Public Sub test()
Dim stcb As New SetTextCallBack(AddressOf send)
Invoke(stcb)
Me.lstInfo.Invoke(stcb)
End Sub
'发布连接
Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
btn1.Enabled = False
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim hostname As String = Dns.GetHostName
Dim serverIP As IPAddress = Dns.Resolve(hostname).AddressList(0)
Dim server As New IPEndPoint(serverIP, 13)
Me.lbl2.Text = "服务器IP地址:" & serverIP.ToString & " 端口号: " & "13"
s.Bind(server)
s.Listen(10)
Try
'创建线程,调用Communication方法
Dim th As New Thread(New ThreadStart(AddressOf Communication))
th.Start()
lbl1.Text = "服务器启动成功!"
Catch ex As Exception
MessageBox.Show("服务器启动失败!" & ex.Message)
End Try
End Sub
End Class
'------------------------------------------------------------------------------------------
以上代码是服务器端的,式了好几种方法,但是还是没法实现向C端广播。所以把那些代码已经去掉了,现在一个完整的S端没有添加 向C端发送信息的代码
下面是C端的代码
'------------------------------------------------------------------------------------------
Imports System.IO
Imports System.Net.Sockets
Imports System.Net
Imports System.Threading
Public Class Form1
Private s As Socket
Private cSocket As Socket
Public ns As NetworkStream
Public sr As StreamReader
Public sw As StreamWriter
Private th As Thread
Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
If txt2.Text <> "" Then
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim serverIP As IPAddress = IPAddress.Parse(txt2.Text)
Dim ep As New IPEndPoint(serverIP, 13)
Try
s.Connect(ep)
Catch ex As SocketException
If ex.Message = "由于目标机器积极拒绝,无法连接。" Then
MessageBox.Show("没有找到服务器主机")
Else
MessageBox.Show(ex.Message)
End If
End Try
Try
ns = New NetworkStream(s)
sr = New StreamReader(ns)
sw = New StreamWriter(ns)
Dim strMag As String = txt1.Text & "C" & Dns.Resolve(Dns.GetHostName).AddressList(0).ToString
sw.WriteLine(strMag)
sw.Flush()
lst1.Items.Add(sr.ReadLine())
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
End Sub
End Class
'------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------
'这个是我想添加在S段的代码,我想单独启动一个连接用不同的端口接受信息,但是没有成功
Private Sub btn2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn2.Click
Dim socsend As New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
Dim ipendp As New Net.IPEndPoint(Net.IPAddress.Parse(CStr(lstIP.SelectedItem)), 9999)
Dim msg(Me.txt1.Text) As Byte
socsend.Connect(ipendp) '连接
socsend.Send(msg) '发送
socsend.Shutdown(Net.Sockets.SocketShutdown.Both)
socsend.Close()
End Sub
'-------------------------------------------------------------------------------------------
我想在C端添加了一下代码但是 接受S端发来信息的内容,但是没有实现,如果功能可以成功是不是就可以把代码内容放入一个线程监听呢?
Dim soclis As New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
Private Delegate Sub SetTextCallBack()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bytes(99999) As Byte
Dim str As String = Nothing
Dim newsock As Net.Sockets.Socket = soclis.Accept() '同意连接
newsock.Receive(bytes) '读取缓存中的数据
Me.lst1.Items.Add(System.Text.Encoding.UTF8.GetString(bytes))
newsock.Shutdown(Net.Sockets.SocketShutdown.Both)
newsock.Close()
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ipendp As New Net.IPEndPoint(Net.IPAddress.Parse(HostIP()), 9999)
soclis.Bind(ipendp) '帮定socket
soclis.Listen(10) '开始监听socket通道
End Sub
Private Function HostIP() As String
Return Dns.Resolve(Dns.GetHostName).AddressList(0).ToString
End Function
'----------------------------------------------------------------------------------------
以上是代码,和遇到的问题
现在是可以实现 S端启动---〉C端请求连接-----〉连接上后C端发信到S端---->S端回信到C端。
现在我想添加功能 就是 S端选择C端IP后向C端发送信息。