zoukankan      html  css  js  c++  java
  • Socket编程笔记同步

    命名空间导入

    Imports System.Net.Sockets
    Imports System.Net
    Imports System.Threading
    服务端编程过程:
    1. 监听Listen
    2. 创建连接Accept
    3. 获取数据Receive
    4. 发送数据Send


    服务端开始监听Listen:

        Sub Main()
            Console.WriteLine("正在接收客户端连接……")
    
            listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            listener.Bind(New System.Net.IPEndPoint(IPAddress.Any, 8080))
            listener.Listen(100)
    
    
            Dim t = New Thread(AddressOf AcceptWorkThread) '开启线程
            t.Start()
    
            Console.ReadKey()
    
        End Sub
      
    监听客户端传入
     Sub AcceptWorkThread()
            Threading.Thread.CurrentThread.IsBackground = True
    
            While True
                Dim accept = listener.Accept
    
                '获取远程IP
                Dim remoEP As IPEndPoint = CType(accept.RemoteEndPoint, IPEndPoint)
                Dim recString = String.Format("接收到来自 {0} 的连接", remoEP.Address.ToString)
                Console.WriteLine(recString)
    
    
                Dim receiveThread As System.Threading.Thread 
    = New Thread(New ParameterizedThreadStart(AddressOf ReceiveWorkThread)) receiveThread.Start(accept) End While End Sub

     

    接收数据,接收成功后,并发送消息
        Sub ReceiveWorkThread(ByVal obj As Object)
            Thread.CurrentThread.IsBackground = True
    
            Dim socket As System.Net.Sockets.Socket = CType(obj, Socket)
    
            Dim buffer() As Byte = Nothing
            Dim isReceive As Boolean = False
    
            While True
                Dim err As SocketError
                Dim b(256) As Byte
                Dim readbyes = socket.Receive(b, 0, b.Length, SocketFlags.None, err)
    
                '判断操作是否成功。
                If err = SocketError.Success Then
    
                    If readbyes = 0 Then  '没有接收到数据,退出!
                        socket.Shutdown(SocketShutdown.Both)
                        socket.Close()
                        Console.WriteLine("Socket已退出!")
                        Exit While
                    End If
    
                    If buffer Is Nothing OrElse buffer.Length = 0 Then
                        buffer = b
                    Else
                        Dim data(buffer.Length + b.Length - 1) As Byte
                        buffer.CopyTo(data, 0)
                        b.CopyTo(data, buffer.Length)
    
                        buffer = data
                    End If
    
                    Console.WriteLine(buffer.Length)
    
                    If socket.Available = 0 AndAlso Not buffer Is Nothing AndAlso buffer.Length > 0 Then
                        Dim f As New IO.FileStream("c:\1.rar", IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
                        f.Write(buffer, 0, buffer.Length)
                        f.Close()
    
                        Console.WriteLine("文件接收成功!")
    
                        Dim msg = System.Text.Encoding.Default.GetBytes("文件接收成功。")
                        socket.Send(msg)
    
                    End If
    
                    If socket.Available = 0 Then
                        buffer = Nothing
                    End If
                Else
                    Console.WriteLine(err.ToString)
                    Exit While
                End If
    
    
    
            End While
    
        End Sub
     
    客户端编程
    1. 连接服务端Connect
    2. 发送数据
    3. 接收数据

    连接服务端

     Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            s.Connect(IPAddress.Parse("127.0.0.1"), 8080)
            Console.WriteLine("按任意键开始传送文件……")
            Console.ReadKey()
    发送数据
       '文件读取
            Dim f As New IO.FileStream("d:\2.rar", IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
            Dim b(CInt(f.Length) - 1) As Byte
            f.Read(b, 0, b.Length)
            f.Close()
    
    
            '获取文件长度
            Console.WriteLine("文件长度:" & b.Length)
    
            '发送文件
            s.Send(b, b.Length, SocketFlags.None)

    接收服务端发送来的数据

         Dim t As New System.Threading.Thread(AddressOf ReceiveWorkThread)
            t.Start(s)

    其实这里接收数据与服务端的一样,也是调用ReceiveWorkThread方法。

  • 相关阅读:
    JDBC中的PreparedStatement相比Statement的好处
    说出一些数据库优化方面的经验?
    数据库三范式是什么?
    用jdom解析xml文件时如何解决中文问题?如何解析?
    我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
    MVC的各个部分都有那些技术来实现?如何实现?
    JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
    黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点!  
    串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
    说几个常见的编译时异常类?
  • 原文地址:https://www.cnblogs.com/zqonline/p/1634792.html
Copyright © 2011-2022 走看看