用VB05的SOCKET编了一个简单的聊天程序,为什么只可以在本机上互发消息呢??

sonoffreedom 2008-10-29 02:38:20
用VB 05的SOCKET编了一个简单的聊天程序,为什么只可以在本机上互发消息呢??
分为客户端与服务端,在本机上互发消息正常,我的机子IP为192.168.0.4

------服务端代码如下:

Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Imports System.Diagnostics

Public Class Form1
'SERVER 'S socket
Dim listener As Socket
Dim mysocket As Socket
Dim isrun As Boolean = False
Dim mythread As Thread


Public message, title, defaultvalue, ip_a As String


Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
message = "请输入客户端的IP:"
title = "提示"
defaultvalue = "192.168.0.4"
ip_a = InputBox(message, title, defaultvalue)
ipt.Text = ip_a
re:

mythread = New Thread(AddressOf listen)
mythread.Start()

End Sub
Public Sub listen()
Dim bytes() As Byte = New Byte(1024) {}
Dim data As String = String.Empty
Dim tokens() As String


Dim localendpoint As New IPEndPoint(Net.IPAddress.Parse(ipt.Text), 11111)
'初始化SOCKET
listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
'绑定端口
listener.Bind(localendpoint)
'开始监听
listener.Listen(10)

BeginInvoke(New EventHandler(AddressOf addinfo), "服务端已启动,正等待连接......")
mysocket = listener.Accept()
isrun = True

While True
Dim bytesRec As Integer = mysocket.Receive(bytes)
data = Encoding.UTF8.GetString(bytes, 0, bytesRec)
tokens = data.Trim.Split("|")

Select Case tokens(0) '分析接收到的数据
Case "Chat"
BeginInvoke(New EventHandler(AddressOf addinfo), tokens(1)) 'Iovoke 保证线程安全

Case "Exit"
isrun = False
BeginInvoke(New EventHandler(AddressOf addinfo), tokens(1))

mysocket.Shutdown(SocketShutdown.Both)
mysocket.Close()
Exit Sub
End Select
End While


End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text)
mysocket.Send(msg)
ListBox1.Items.Add("本地信息: " + TextBox1.Text)
TextBox1.Text = ""
End Sub

Sub addinfo(ByVal sender As System.Object, ByVal e As System.EventArgs)
ListBox1.Items.Add("对方信息: " + sender.ToString)

End Sub
Private Sub form1_formclosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If isrun Then
Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|服务端退出: " + Me.Handle.ToString)
Dim bytessent As Integer = mysocket.Send(msg)
End If
listener.Close()
mysocket = Nothing
mythread.Abort()

End Sub

---------------------------

客户端代码如下:
Imports System.Net

Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Imports System.Diagnostics



Public Class Form1
Public message, title, ip_a, defaultvalue As String
Dim clisocket As Socket

Dim isconnected As Boolean = False
Dim mythread As Thread



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
re:

Message = "请输入客户端的IP:"
title = "提示"
defaultvalue = "192.168.0.4"
ip_a = InputBox(Message, title, defaultvalue)
ipt.Text = ip_a
Dim remoteEP As New IPEndPoint(Net.IPAddress.Parse(ipt.Text), 11111)
clisocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Try
clisocket.Connect(remoteEP)
ListBox1.Items.Add("连接服务端成功.")
isconnected = True
mythread = New Thread(AddressOf recivemsg)
mythread.Start()
Catch ex As Exception
ListBox1.Items.Add(ex.Message)

End Try
End Sub

Sub recivemsg()
Dim bytes() As Byte = New Byte(1024) {}
Dim data As String = String.Empty
Dim tokens() As String
While True
Dim bytesRec As Integer = clisocket.Receive(bytes)
data = Encoding.UTF8.GetString(bytes, 0, bytesRec)
tokens = data.Trim.Split("|")
Select Case tokens(0)
Case "Exit"
isconnected = False
BeginInvoke(New eventhandler(AddressOf addinfo), tokens(1))
clisocket.Shutdown(SocketShutdown.Both)
clisocket.Close()
Exit Sub
Case "Chat"
BeginInvoke(New EventHandler(AddressOf addinfo), tokens(1))

End Select
End While
End Sub
'发送消息

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text)
Dim bytesSent As Integer = clisocket.Send(msg)
ListBox1.Items.Add("本地信息: " + TextBox1.Text)
TextBox1.Text = ""

End Sub
Sub addinfo(ByVal sender As System.Object, ByVal e As System.EventArgs)
ListBox1.Items.Add("对方信息: " + sender.ToString)

End Sub

Private Sub form1_formClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If isconnected Then
Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|客户端退出: " + Me.Handle.ToString)
Dim bytesSent As Integer = clisocket.Send(msg)
mythread.Abort()
End If

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
mythread.Abort()

Dim remoteEP As New IPEndPoint(Net.IPAddress.Parse(ipt.Text), 11111)
clisocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Try
clisocket.Connect(remoteEP)
ListBox1.Items.Add("连接服务端成功.")
isconnected = True
mythread = New Thread(AddressOf recivemsg)
mythread.Start()
Catch ex As Exception
ListBox1.Items.Add(ex.Message)

End Try
End Sub
End Class

经测试,在本机上用客户端与服务端可以互发消息
就算在局域网内,与另一台机子互发消息也不可以,出错,怎么解决呢,请教啦
...全文
171 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyken 2008-11-07
  • 打赏
  • 举报
回复
服务器端:Dim localendpoint As New IPEndPoint(Net.IPAddress.Parse(ipt.Text), 11111)
'初始化SOCKET
listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
改为:Dim localendpoint As New IPEndPoint(Net.IPAddress.any,11111)
去监听任一IP试一下吧
liye9801 2008-11-06
  • 打赏
  • 举报
回复
注意防火墙...
sonoffreedom 2008-11-06
  • 打赏
  • 举报
回复
请问如何更改呢??
雪碧爱可乐 2008-11-06
  • 打赏
  • 举报
回复
我想需要细致的调试,单看代码是很难发现错误的
finalfly 2008-11-02
  • 打赏
  • 举报
回复
localendpoint构件格式不正确
sonoffreedom 2008-10-30
  • 打赏
  • 举报
回复
应该不是的,我换了N个端口来试
只在此山中 2008-10-30
  • 打赏
  • 举报
回复
是不是端口被占用了
sonoffreedom 2008-10-29
  • 打赏
  • 举报
回复
'绑定端口
listener.Bind(localendpoint)
---->> 当输入对方的IP时,在这行代码出现问题
VB说:未处理SocketException,,检查ErrorCode属性以确定发生套接字错误的原因
CloneCenter 2008-10-29
  • 打赏
  • 举报
回复
是不是有防火墙阻止了你的程序?

或者是别的问题,哪一行代码出现了问题,要贴出来,错误信息也要写详细些。

16,722

社区成员

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

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