用VB05的SOCKET编了一个简单的聊天程序,为什么只可以在本机上互发消息呢??
用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
经测试,在本机上用客户端与服务端可以互发消息
就算在局域网内,与另一台机子互发消息也不可以,出错,怎么解决呢,请教啦