文档库 最新最全的文档下载
当前位置:文档库 › 整理的socket编程希望对大家有用

整理的socket编程希望对大家有用

Socket类连接后 可以通过类中的 RemoteEndPoint 来获取远程IP和端口信息.
要注意的是.需要将它强制转化为 IPEndPoint类型 然后通过 IPEndPoint.Address以及IPEndPoint.Port来获取对应的IP及端口

Dim REV_SCK As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
'这里创建一个UDP Socket连接的实例 TCP也是一样的

'省略SOCKET连接的代码 当SOCKET连接成功后 可以用下面的语句获取远程信息
Dim IP as string ,Port as integer
'定义IP和Port变量 用来保存地址及端口
IP = IPAddress.Parse(CType(REV_SCK.RemoteEndPoint, IPEndPoint).Address.ToString())
Port = IPAddress.Parse(CType(REV_SCK.RemoteEndPoint, IPEndPoint).Port)

以Udp做为例子吧.
接收数据需要一个Socket实例

Dim REV_SCK As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) '''UDP方式Socket实例

Dim hostName As String = Dns.GetHostName
Dim ip As IPAddress = Dns.GetHostByName(hostName).AddressList.GetValue(0) '''用2次Dns.GetHostName获得本机电脑的IP号

Try
REV_SCK.Bind(New IPEndPoint(ip, port)) '''Bind绑定。 IPEndPoint通过IP/Port确定1个连接端点
Catch ex As Exception
MsgBox(ex.Message)
'这里写出错代码
End Try


'接收信息的方法是写一个获取接收信息的函数,然后委托一个新线程去调用它
'WaitData表示一个循环接收信息的函数 代码如下
While True
Dim bytes(1024) As Byte '用来存储接收到的字节
REV_SCK.Receive(bytes)
Dim i As Integer
For i = 0 To 1024
If bytes(i) = 0 Then Exit For
Next
REV_STR = Encoding.UTF8.GetString(bytes, 0, i)
End While


'上面的代码中 REV_STR是一个全局变量.然后读取REV_STR的值 就可以获取接收的信息
'WaitData写完后 建立新线程去调用它
Dim REV_THREAD As Thread '''REV_THREAD线程全局变量
REV_THREAD = New Thread(AddressOf WaitData) '''线程委托
REV_THREAD.Start() '''线程启动


&&&&&&&&&&&&&&&&&&&&&&&&&

TextBox1 为要连接的ip
TextBox2 为呢称
RichTextBox1 为聊天内容
RichTextBox2 为要发送的内容
Button1 发送

Imports System.Threading
Imports https://www.wendangku.net/doc/0115197900.html,
Imports https://www.wendangku.net/doc/0115197900.html,.Sockets

Public Class Form1
Dim MyTcpListener As TcpListener
Dim MyListenThread As Thread

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'关闭SOCKET
Try
If Me.MyTcpListener IsNot Nothing Then
'关闭监听器
Me.MyTcpListener.Stop()
End If

If Me.MyListenThread IsNot Nothing Then
'如果线程还处于运行状态就关闭它
If Me.MyListenThread.ThreadState <> ThreadState.Running Then
Me.MyListenThread.Abort()
End If

Catch ex As Exception
MessageBox.Show(ex.Message, "信息提示 ", MessageBoxBu

ttons.OK, https://www.wendangku.net/doc/0115197900.html,rmation)
End Try
e.Cancel = False
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' 开始监听()
'创建监听线程
Me.MyListenThread = New Thread(AddressOf StartListen)
'启动线程
Me.MyListenThread.Start()
End Sub
Private Sub StartListen()
MyTcpListener = New TcpListener(888)
'开始监听
MyTcpListener.Start()
'While (True)
'获取TcpClient
Dim MyTcpClient As TcpClient = MyTcpListener.AcceptTcpClient()
Dim MyStream As NetworkStream = MyTcpClient.GetStream()
Dim MyBytes(1024) As Byte
Dim MyBytesRead As Integer = MyStream.Read(MyBytes, 0, MyBytes.Length)
Dim MyMessage As String = System.Text.UnicodeEncoding.GetEncoding( "gb2312 ").GetString(MyBytes, 0, MyBytesRead)
Me.RichTextBox2.AppendText(MyMessage)
'End While
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If (Me.TextBox1.Text.Length < 1 Or Me.TextBox2.Text.Length < 1 Or Me.RichTextBox1.Text.Length < 1) Then

End If
Exit Sub
Try
Dim MyMessage As String = "消息来自( " + Me.TextBox2.Text + "): " + Me.RichTextBox1.Text + Chr(10) + Chr(13)
'根据目标计算机地址建立连接
Dim MyTcpClient As TcpClient = New TcpClient(Me.TextBox1.Text, 888)
'获得用于网络访问的数据流
Dim MyTcpStream As https://www.wendangku.net/doc/0115197900.html,workStream = MyTcpClient.GetStream()
Dim MyStream As IO.StreamWriter = New IO.StreamWriter(MyTcpStream, System.Text.UnicodeEncoding.GetEncoding( "gb2312 "))
'将字符串写入流
MyStream.Write(MyMessage)
'将缓冲数据写入基础流
MyStream.Flush()
'关闭网络流
MyStream.Close()
'MyTcpClient.Close()
Me.RichTextBox2.AppendText( "发送: " & Me.RichTextBox1.Text)
Me.RichTextBox1.Clear()
Catch ex As Exception
MessageBox.Show(ex.Message, "信息提示 ", MessageBoxButtons.OK, https://www.wendangku.net/doc/0115197900.html,rmation)
End Try
End Sub
End Class
*********************************************
发送端
Public Class Form1
InheritsSystem.Windows.Forms.Form
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
DimsendsocketAsNewNet.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork,Net.Sockets.SocketType.Stream,Net.Sockets.ProtocolType.Tcp) ''实例化socket
DimipendpiontAsNewNet.IPEndPoint(Net.IPAddress.Parse("192.168.0.1"),8888)''建立终结点
''OpenFileDialog1.ShowDialog()
DimfsAsNewIO.FileStream("c:p.doc",IO.FileMode.OpenOrCreate,IO.FileAccess.Read)''要传输的文件
Dimfssize(fs.Length-1)AsByte
DimstrreadAsNewIO.BinaryReader(fs)''流处理要传输的文件
'

'fs.Read(fssize,0,fssize.Length-1)
strread.Read(fssize,0,fssize.Length-1)
sendsocket.Connect(ipendpiont)''连接远程计算机
sendsocket.Send(fssize)''发送文件
Label1.Text=fs.Length()
fs.Close()
sendsocket.Shutdown(Net.Sockets.SocketShutdown.Send)
''关闭发送连接
sendsocket.Close()''关闭本机socket
EndSub
EndClass


接收端
Public Class Form1
InheritsSystem.Windows.Forms.Form
DimreceivesocketAsNewNet.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork,Net.Sockets.SocketType.Stream,Net.Sockets.ProtocolType.Tcp)
PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
DimhostipendpiontAsNewNet.IPEndPoint(Net.IPAddress.Parse("192.168.0.1"),8888)
receivesocket.Bind(hostipendpiont)
''建立远程计算机的的socket
receivesocket.Listen(2)''监听socket
EndSub
PrivateSubButton1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesButton1.Click
DimrecfsAsNewIO.FileStream("p.doc",IO.FileMode.OpenOrCreate)
''接收数据并将其保存到一个新的文件中
Dimrecbyte(229888)AsByte
DimhostsocketAsNet.Sockets.Socket=
receivesocket.Accept()
''同意和发送端计算机建立连接
DimnewfilestrAsNewIO.BinaryWriter(recfs)''流写
hostsocket.Receive(recbyte)
''recfs.Write(recbyte,0,recbyte.Length-1)
newfilestr.Write(recbyte,0,recbyte.Length-1)
recfs.Close()
hostsocket.Shutdown(Net.Sockets.SocketShutdown.Receive)
hostsocket.Close()
EndSub
EndClass

*****************
Imports System
Imports https://www.wendangku.net/doc/0115197900.html,
Imports https://www.wendangku.net/doc/0115197900.html,.Sockets
Imports System.Text
Imports System.Threading
Imports Microsoft.VisualBasic

'异步读取客户端数据的状态对象
Public Class StateObject
'客户端套接字
Public workSocket As Socket = Nothing
'接收缓冲区大小
Public Const BufferSize As Integer = 1024
'接收缓冲区
Public buffer(BufferSize) As Byte
'接收到的数据串
Public sb As New StringBuilder
End Class

Public Class AsynchronousSocket
Listener
'线程的信号
Public Shared allDone As New Manual
ResetEvent(False)
此服务器等待连接此服务器等待连接,然后使用异步操作接受连接,
从中获取数据
连接的客户端,
将数据返回到
连接的客户端。
“然后脱离
客户和等待另一个客户。
Public Shared Sub Main()
'用于输入数据的数据缓冲区
Dim bytes() As Byte = New [Byte](1023) {}
'为套接字建立本地终结点
Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim ipAddress As IPAddress = ipHostInfo.AddressList(0)


Dim localEndPoint As New IPEndPoint(ipAddress, 11000)
'创建一个TCP/IP套接字。
Dim listener As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
'将套接字绑定到本地终结点并侦听传入连接。
listener.Bind(localEndPoint)
listener.Listen(100)
While True
设置事件为无信号状态
allDone.Reset()
启动一个异步套接字来侦听连接。
Console.WriteLine("Waiting for a connection...")
listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
'等待一个连接在继续前处理和处理。
allDone.WaitOne()
End While
End Sub 'Main
Public Shared Sub AcceptCallback(ByVal ar As IAsyncResult)
'获取处理客户端请求的套接字。
Dim listener As Socket = CType(ar.AsyncState, Socket)
'结束操作
Dim handler As Socket = listener.EndAccept(ar)
'创建异步状态对象接收。
Dim state As New StateObject
state.workSocket = handler
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
End Sub '接受回调
Public Shared Sub ReadCallback(ByVal ar As IAsyncResult)
Dim content As StringString = String.Empty
'从异步状态对象检索状态对象和处理程序套接字。
Dim state As StateObject = CType(ar.AsyncState, StateObject)
Dim handler As Socket = state.workSocket
'从客户端读取数据。
Dim bytesRead As Integer = handler.EndReceive(ar)
If bytesRead > 0 Then
'可能会有更多的数据,所以存储到目前为止的数据。
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))
'检查文件结束标记。如果不在那里,阅读更多的数据。
content = state.sb.ToString()
If content.IndexOf("") > -1 Then
'所有的数据都已从客户端读取。在控制台上显示。
Console.WriteLine("Read {0} bytes from socket. "+ vbLf + " Data : {1}", content.Length, content)
'将数据传回客户端。
Send(handler, content)
Else
' 并不是所有收到的数据。得到更多
handler.BeginReceive(state.buffer, 0, StateObject.
BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
End If
End If
End Sub 'ReadCallback

Private Shared Sub Send(ByVal handler As Socket, ByVal data As String)
' Convert the string data to byte data using ASCII encoding.
Dim byteData As Byte() = Encoding.ASCII.GetBytes(data)
' Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)
End Sub 'Send

Private Shared Sub SendCallback(ByVal ar As IAsyncResult)
' Retrieve the socket from the state object.
Dim handler As Socket = CType(ar.AsyncState, Socket)
' Complete sending the da

ta to the remote device.
Dim bytesSent As Integer = handler.EndSend(ar)
Console.WriteLine("Sent {0} bytes to client.", bytesSent)
handler.Shutdown(SocketShutdown.Both)
handler.Close()
' Signal the main thread to continue.
allDone.Set()
End Sub 'SendCallback
End Class 'AsynchronousSocketListener


*********************************************************
https://www.wendangku.net/doc/0115197900.html, 服务器与客户端数据交互问题?
客户端简单代码:
Imports https://www.wendangku.net/doc/0115197900.html,.Sockets
Imports System.IO

Private Output As NetworkStream
Private Writer As BinaryWriter
Private Reader As BinaryReader
Dim StrSend As String
Dim client As New TcpClient '

client.Connect(servIP, 2006)
Output = client.GetStream
Writer = New BinaryWriter(Output)
Reader = New BinaryReader(Output)
StrSend = "字符串"
System.Threading.Thread.Sleep(100)
Writer.Write(StrSend)

Try
Message = Reader.ReadString
If Message = "OK" Then
LBinfo.Text = "成功!" '测试
Else
LBinfo.Text = "失败!"
End If
System.Threading.Thread.Sleep(100)

Catch ex As Exception
MessageBox.Show("Client Application Closing!")
Finally
Writer.Close()
Reader.Close()
Output.Close()
client.Close()
End Try

服务器端 用线程
Imports https://www.wendangku.net/doc/0115197900.html,.Sockets
Imports System.IO
Imports System.Threading
Imports System.Windows.Forms

Private Connection As Socket
Private readThread As Thread
Private SocketStream As NetworkStream
Private Writer As BinaryWriter
Private Reader As BinaryReader

Public Sub New()
MyBase.New()

'该调用是Windows窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化
readThread = New Thread(AddressOf RunServer)
readThread.Start()
End Sub

Public Sub RunServer()
Dim Listener As TcpListener
Try
Listener = New TcpListener(Net.IPAddress.Parse("192.168.1.16"), 2006)
Listener.Start()
While True
Connection = Listener.AcceptSocket 'accept an incoming connection
SocketStream = New NetworkStream(Connection) 'create networkstream object associated with socket
Writer = New BinaryWriter(SocketStream) 'create object for transferring data across stream
Reader = New BinaryReader(SocketStream) 'read string data sent from client

Try
Do
strIncept = Reader.ReadString
strIncept = DataDisp(strIncept) '此处插入数据处理程序()
SendInfoToClient(strIncept) 'send to client
Loop While Connection.Connected
Catch ex As Exception
MsgBox(ex.ToString)
Finally
Writer.Close()
Reader.Close()
SocketStream.Close()
End Try
End While
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Public Sub SendInfoToClient(ByVal Info As String)
'Send to client
Try
If Connection.Connected Then
Wr

iter.Write(Info)
Connection.Close()
End If
Catch ex As SocketException
MessageBox.Show(ex.ToString)
End Try
End Sub
整个过程都有了


***********************************
现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作
using System;
using System.Collections.Generic;
using System.Text;
using https://www.wendangku.net/doc/0115197900.html,.Sockets;
using System.Threading;
using https://www.wendangku.net/doc/0115197900.html,;

namespace Server_Program
{
///


/// 基于SocketAsyncEventArgs 实现 IOCP 服务器
///

internal sealed class IoServer
{
#region 变量定义

///
/// 监听Socket,用于接受客户端的连接请求
///

private Socket listenSocket;

///
/// 用于服务器执行的互斥同步对象
///

private static Mutex mutex = new Mutex();

///
/// 用于每个I/O Socket操作的缓冲区大小
///

private Int32 bufferSize;

///
/// 服务器上连接的客户端总数
///

private Int32 numConnectedSockets;

///
/// 服务器能接受的最大连接数量
///

private Int32 numConnections;

///
/// 完成端口上进行投递所用的IoContext对象池
///

private IoContextPool ioContextPool;

///
/// 主窗体
///

public MainForm mainForm;

#endregion

#region 构造函数

///
/// 构造函数,建立一个未初始化的服务器实例
///

/// 服务器的最大连接数据
///
internal IoServer(Int32 numConnections, Int32 bufferSize)
{
this.numConnectedSockets = 0;
this.numConnections = numConnections;
this.bufferSize = bufferSize;

this.ioContextPool = new IoContextPool(numConnections);

// 为IoContextPool预分配SocketAsyncEventArgs对象
for (Int32 i = 0; i < this.numConnections; i++)
{
SocketAsyncEventArgs ioContext = new SocketAsyncEventArgs();
https://www.wendangku.net/doc/0115197900.html,pleted += new EventHandler(OnIOCompleted);
ioContext.SetBuffer(new Byte[this.bufferSize], 0, this.bufferSize);

// 将预分配的对象加入SocketAsyncEventArgs对象池中
this.ioContextPool.Add(ioContext);
}
}

#endregion

#region socket数据收发

///
/// 当Socket上的发送或接收请求被完成时,调用此函数
///


/// 激发事件的对象
/// 与发送或接收完成操作相关联的SocketAsyncEventArg对象
private void OnIOCompleted(object sender, SocketAsyncEventArgs e)
{
switch (https://www.wendangku.net/doc/0115197900.html,stOperation)
{
case SocketAsyncOperation.Receive:
this.ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
this.ProcessSend(e);
break;
default:
throw new ArgumentException("The last operation completed on the socket was not a receive or send");
}
}

///


///接收完成时处理函数
///

/// 与接收完成操作相关联的SocketAsyncEventArg对象
private void ProcessReceive(SocketAsyncEventArgs e)
{
// 检查远程主机是否关闭连接
if (e.BytesTransferred > 0)
{
if (e.SocketError == SocketError.Success)
{
Socket s = (Socket)https://www.wendangku.net/doc/0115197900.html,erToken;
//判断所有需接收的数据是否已经完成
if (s.Available == 0)
{
// 设置发送数据
byte[] bty = new byte[12] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x08 };
Array.Copy(bty, 0,e.Buffer, 0, bty.Length);
e.SetBuffer(e.Offset, bty.Length);
if (!s.SendAsync(e)) //投递发送请求,这个函数有可能同步发送出去,这时返回false,并且不会引发https://www.wendangku.net/doc/0115197900.html,pleted事件
{
// 同步发送时处理发送完成事件
this.ProcessSend(e);
}
}
else if (!s.ReceiveAsync(e)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发https://www.wendangku.net/doc/0115197900.html,pleted事件
{
// 同步接收时处理接收完成事件
this.ProcessReceive(e);
}
}
else
{
this.ProcessError(e);
}
}
else
{
this.CloseClientSocket(e);
}
}

///
/// 发送完成时处理函数
///

/// 与发送完成操作相关联的SocketAsyncEventArg对象
private void ProcessSend(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{

Socket s = (Socket)https://www.wendangku.net/doc/0115197900.html,erToken;

//接收时根据接收的字节数收缩了缓冲区的大小,因此投递接收请求时,恢复缓冲区大小
e.SetBuffer(0, bufferSize);
if (!s.ReceiveAsync(e)) //投递接收请求
{
// 同步接收时处理接收完成事件
this.ProcessReceive(e);
}
}
else
{
this.ProcessError(e);
}
}

///


/// 群发指令事件
///

internal string SendAllClient()
{
int cnt = 0;
for (Int32 i = 0; i < this.numConnections; i++)
{
SocketAsyncEventArgs e = ioContextPool.pool[i];
// 检查当前活动的连接
if (https://www.wendangku.net/doc/0115197900.html,erToken != null)
{
try {
if ((https://www.wendangku.net/doc/0115197900.html,erToken as https://www.wendangku.net/doc/0115197900.html,.Sockets.Socket).Available == 0)
{
//向指定连接发送指令
byte[] bty = new byte[12] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x08 };
this.SendToClient(e, bty);
}
}
catch(Exception ex)
{
}
}
}
return cnt.ToString();
}

///
/// 向客户端发送信息
///

private void SendToClient(SocketAsyncEventArgs e, byte[] btyArray)
{
if (e.SocketError == SocketError.Success)
{
Socket s = (Socket)https://www.wendangku.net/doc/0115197900.html,erToken;
//判断所有需接收的数据是否已经完成
if (s.Available == 0)
{
// 设置发送数据
Array.Copy(btyArray, 0, e.Buffer, 0, btyArray.Length);
//****此处报错******<现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作>
e.SetBuffer(e.Offset, btyArray.Length);
if (!s.SendAsync(e)) //投递发送请求,这个函数有可能同步发送出去,这时返回false,并且不会引发https://www.wendangku.net/doc/0115197900.html,pleted事件
{
// 同步发送时处理发送完成事件
this.ProcessSend(e);
}
}
else if (!s.ReceiveAsync(e)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发https://www.wendangku.net/doc/0115197900.html,pleted事件
{
// 同步接收时处理接收完成事件
this.ProcessReceive(

e);
}
}
else
{
this.ProcessError(e);
}
}
#endregion




























相关文档