关于 Socket通信的问题S段向C段选择性广播(高分求解)

rubbishsai 2008-10-16 10:44:56
已经实现了基本的,通信
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端发送信息。
...全文
143 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rubbishsai 2008-10-17
  • 打赏
  • 举报
回复
socket是套接字对吧?
我现在可以从S端发送信息到客户端了
但是如何选择客户端IP呢 应该是socket里面那个事件或者方法呢

我现在是 开两个客户端 忽略它们探出的储物后,可以实现数据传送
但是S端在恢复的信息会传送到
最后一个给S端发送信息的客户端另外一个没有 以下代码接的 数据流

Private Sub C_Therad()
Dim C_Thread As Thread
C_Thread = New Thread(AddressOf Communication)
C_Thread.Start()
End Sub
Public Sub Communication()
While True
Try
If s.Connected Then
If sr.ReadLine.ToString <> "" Then
ns = New NetworkStream(s)
sr = New StreamReader(ns)
sw = New StreamWriter(ns)
Me.lst1.Items.Add(sr.ReadLine.ToString + Chr(10))
sw.Flush()
End If
End While
End Sub

打开一个线程监听端口 我写的里面那些没有必要呢请指教
llsus 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 rubbishsai 的回复:]
llsus 你好如同
5、S要发送信息到C可以从Socket集合中选择你要发送的目标
1、建立连接前,S无法给C发送信息
2、C无需侦听
我也找了很多代码 实例了 我在看看
Socket的MSDN 还有就是

按照你说的 那我在 C端 还用再写什么监听的 功能么

直接S端发送信息给 C端就可以了没。
C端不写代码 也可以接受到么?

对于 Socket通信 我刚涉及好多东西都是盲区还希望 您多多指教

最好有 比较明显的实例代码 C# VB的…
[/Quote]

C请求连接,S同意并建立连接后,C也会得到这个连接,这个连接就是用来传送数据的,连接建立后发送数据时,就不再区分谁是S,谁是C,大家都一样的。
rubbishsai 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Avoid 的回复:]
根据套接字取得客户端IP,判断发还是不发
[/Quote]


不是很明白,我水平确实有限,希望您在给点比较详细的 说明 因为Socket没有接触过。以前一直在做外包对于稍微底层一点的东西都没有接触过
rubbishsai 2008-10-16
  • 打赏
  • 举报
回复
llsus 你好如同
5、S要发送信息到C可以从Socket集合中选择你要发送的目标
1、建立连接前,S无法给C发送信息
2、C无需侦听
我也找了很多代码 实例了 我在看看
Socket的MSDN 还有就是

按照你说的 那我在 C端 还用再写什么监听的 功能么

直接S端发送信息给 C端就可以了没。
C端不写代码 也可以接受到么?

对于 Socket通信 我刚涉及好多东西都是盲区还希望 您多多指教

最好有 比较明显的实例代码 C# VB的都行
llsus 2008-10-16
  • 打赏
  • 举报
回复
5、S要发送信息到C可以从Socket集合中选择你要发送的目标
llsus 2008-10-16
  • 打赏
  • 举报
回复
你的代码我没看,我只是提供给你一个一般性方法:
1、S侦听指定端口
2、C连接S的约定端口
3、S收到C的连接请求后,建立新的Socket用于通讯,并向Socket集合记录该Scoket

4、C得到连接建立后可以发送信息到S
5、S要发送信息到C可以从Socket集合中你要发送的目标

注意:
1、建立连接前,S无法给C发送信息
2、C无需侦听
Avoid 2008-10-16
  • 打赏
  • 举报
回复
根据套接字取得客户端IP,判断发还是不发
mjjzg 2008-10-16
  • 打赏
  • 举报
回复
就是使用套接字取得客户端IP,来选择要发的对象
rubbishsai 2008-10-16
  • 打赏
  • 举报
回复
还是不太明白。谁有好一点的事例代码发我参考一下啊

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧