GVKun编程网logo

Socket.IO 1.0.x:按ID获取套接字(获取套接字地址长度)

14

本文将带您了解关于Socket.IO1.0.x:按ID获取套接字的新内容,同时我们还将为您解释获取套接字地址长度的相关知识,另外,我们还将为您提供关于7.1套接字(socket)、Android进程通

本文将带您了解关于Socket.IO 1.0.x:按ID获取套接字的新内容,同时我们还将为您解释获取套接字地址长度的相关知识,另外,我们还将为您提供关于7.1 套接字(socket)、Android 进程通信套接字LocalSocket、C#之Socket(套接字)通信、C++根据SOCKET获取套接字IP、Port等信息的实用信息。

本文目录一览:

Socket.IO 1.0.x:按ID获取套接字(获取套接字地址长度)

Socket.IO 1.0.x:按ID获取套接字(获取套接字地址长度)

在0.9.x版本中,我们可以通过ID获得套接字,如下所示:

io.sockets.socket(socketId)

但是在1.0.x中我们不能。如何在1.0.x中按ID查找套接字?

答案1

小编典典

对于socket.io 1.0,请使用:

io.sockets.connected[socketId]

对于0.9,其io.sockets.sockets [socketId]而不是io.sockets.socket [socketId]

7.1 套接字(socket)

7.1 套接字(socket)

套接字(socket)是计算机之间进行通信的一种技术,它允许不同主机上的进程之间进行数据交换。在Python中,我们可以使用socket模块来创建和使用套接字。

首先,我们需要导入socket模块:

import socket

在网络编程中,有两种主要类型的套接字:流套接字(Stream Sockets)和数据报套接字(Datagram Sockets)。流套接字使用传输控制协议(TCP)进行通信,而数据报套接字使用用户数据报协议(UDP)进行通信。我们将主要关注TCP套接字,因为它们更常用且提供了可靠的双向通信。

创建套接字

要创建一个TCP套接字,我们可以使用socket.socket()函数:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

这里,socket.AF_INET表示我们使用IPv4地址,socket.SOCK_STREAM表示我们使用TCP协议。

绑定套接字

创建套接字后,我们需要将其绑定到一个地址和端口。这可以使用bind()方法完成:

address = (''localhost'', 12345)
s.bind(address)

这里,我们绑定了套接字到本地地址(''localhost'')和端口(12345)。

监听连接

在绑定套接字后,我们需要开始监听客户端的连接。我们可以使用listen()方法来实现这一点:

s.listen(5)

这里的数字5表示允许的最大连接数。

接受连接

当有客户端尝试连接时,我们可以使用accept()方法来接受连接。这将返回一个新的套接字对象和客户端地址:

client_socket, client_address = s.accept()

发送和接收数据

现在我们已经建立了连接,可以使用send()recv()方法发送和接收数据。例如:

data = client_socket.recv(1024)  # 接收最多1024字节的数据
client_socket.send(b''Hello, client!'')  # 发送数据

请注意,我们需要使用字节类型的数据进行通信。

关闭套接字

通信完成后,我们需要关闭套接字以释放资源。我们可以使用close()方法来实现这一点:

client_socket.close()
s.close()

这就是一个简单的TCP套接字服务器的基本结构。为了让您更好地理解,这里有一个完整的示例:

TCP服务器示例

import socket

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    address = (''localhost'', 12345)
    s.bind(address)
    s.listen(5)

    print("Waiting for connections...")
    client_socket, client_address = s.accept()
    print(f"Connected to {client_address}")

    data = client_socket.recv(1024)
    print(f"Received: {data}")

    client_socket.send(b''Hello, client!'')

    client_socket.close()
    s.close()

if __name__ == ''__main__'':
    main()

这个示例展示了如何创建一个简单的TCP服务器,它接受来自客户端的连接和数据,并向客户端发送一条消息。您可以根据自己的需求修改这个示例,以实现不同的功能。
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file

Android 进程通信套接字LocalSocket

Android 进程通信套接字LocalSocket

我们知道,Android上常见的多进程通讯有以下几种:

AIDL 进程通信接口

Binder接口

Messenger通信框架

BroadCastReciever 广播

ContentObserver/ContentProvider

FileObserver(http://blog.csdn.net/happy_6678/article/details/7095012)

网络,(http网络中转,rpc,dwr,jms,xmpp)

Intent通信

 

当然,我们还有另一种方案

LocalSocket 是Unix进程通信的基础

 

认识几个常用的函数:

客户端:

     LocalSocket客户端使用,创建套接字

     LocalSocketAddress 套接字地址,其实就是文件描述符(主要是服务器的地址,当然也可以客户端自个绑定地址)

setSoTimeout设置超时

connect客户端主动向服务端请求连接

服务端:

LocalServerSocket服务端使用,创建套接字同时指定文件描述符

accept等待客户端连接(阻塞)

共同:

getInputStream获取套接字输入流

getOutputStream获取套接字输出流

close关闭套接字,客户服务都需要

关于套接字的通信直接就是对java输入输出流的操作了,但是有一点很重要:对于套接字获取的各种输入或者输出流,如果调用close函数关闭了对应的流,那么套接字也会自动关闭了,再次对其获取输入输出流的时候会提示 socket not creat 。这点不同于C下socket的 shutdown函数,我也因为这折腾了很久。

下面不多说上代码,我对在客户端对其做了小小的封装:

class ClientConnect {  
    private static final String TAG = "ClientConnect";  
    private static final String name = "com.repackaging.localsocket";  
    private LocalSocket Client = null;  
    private PrintWriter os = null;  
    private BufferedReader is = null;  
    private int timeout = 30000;  
      
    public void connect(){    
        try {  
            Client = new LocalSocket();  
            Client.connect(new LocalSocketAddress(name));  
            Client.setSoTimeout(timeout);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
              
    public void send(String[] data) {  
        try {  
            os = new PrintWriter(Client.getOutputStream());  
            for(int i = 0 ; i < data.length ; i ++){  
                os.println(data[0]);  
            }  
            os.println(FLAG);  
            os.flush();  
            Log.d(TAG,"send");  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    public String recv() {  
        Log.d(TAG,"recv");  
        String result = null;  
        try {  
            is = new BufferedReader(new InputStreamReader(Client.getInputStream()));  
            result = is.readLine();  
            Log.d(TAG, result);  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
        }  
        return result;  
    }  
      
    public void close() {  
        try {  
            is.close();  
            os.close();  
            Client.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

由于是在Android代码上使用,为了防止ANR,对于服务端,肯定是放到线程中去的。对于阻塞模式的客户端(recv等函数),也必须放在线程中。

服务端线程:

class ServerThread implements Runnable {  
  
    @Override  
    public void run() {  
        LocalServerSocket server = null;  
        BufferedReader mBufferedReader = null;  
        PrintWriter os = null;  
        LocalSocket connect = null;  
        String readString =null;  
        try {  
            server = new LocalServerSocket("com.repackaging.localsocket");        
            while (true) {  
                connect = server.accept();  
                Credentials cre = connect.getPeerCredentials();  
                Log.i(TAG,"accept socket uid:"+cre.getUid());  
                mBufferedReader = new BufferedReader(new InputStreamReader  
                        (connect.getInputStream()));  
                while((readString=mBufferedReader.readLine())!=null){  
                    if(readString.equals("finish")) break;  
                    Log.d(TAG,readString);  
                }  
                os = new PrintWriter(connect.getOutputStream());  
                os.println("allow");  
                os.flush();  
                Log.d(TAG,"send allow");  
            }     
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        finally{  
            try {  
                mBufferedReader.close();  
                os.close();  
                connect.close();  
                server.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
}

 

C#之Socket(套接字)通信

C#之Socket(套接字)通信

一、socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

二、套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

三、服务端

private void btnListen_Click(object sender, EventArgs e)
{
    IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网卡IP。本机端口查看netstat -an
    //服务端Socket定义
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Bind(point); //绑定IP
    socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个客户端,排队
    ShowMsg("服务器开始监听");

    Thread thread = new Thread(AcceptInfo);
    thread.Start(socket);

}

//记录通信用的Socket
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();

// private Socket client;
void AcceptInfo(object o)
{
    Socket socket = o as Socket;
    while (true)
    {
        //通信用socket
        try
        {
            Socket clientSocket = socket.Accept();//如果客户端有请求,生成一个新的Socket
            string point = clientSocket.RemoteEndPoint.ToString();
            ShowMsg(point + "连接客户端成功!");
            dic.Add(point, clientSocket);
            //接收消息
            Thread th = new Thread(ReceiveMsg);
            th.Start(clientSocket);
        }
        catch (Exception ex)
        {
            break;
        }
    }
    socket.Close();
}
//接收消息
void ReceiveMsg(object socket)
{
    Socket clientSocket = socket as Socket;
    while (true)
    {
        //接收客户端发送过来的数据
        try
        {
            //定义byte数组存放从客户端接收过来的数据
            byte[] buffer = new byte[1024 * 1024];
            
           int n = clientSocket.Receive(buffer);//将接收过来的数据放到buffer中,并返回实际接受数据的长度

            //将字节转换成字符串
            string words = Encoding.Unicode.GetString(buffer, 0, n);
            Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words);
            byte[] msg = Encoding.Unicode.GetBytes(words);
            clientSocket.Send(msg);//发送数据,字节数组
        }
        catch (Exception ex)
        {
            break;
        }
    }
    clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据
    clientSocket.Close();//关闭socket,释放资源
}

四、客户端

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连接到的服务端IP
clientSocket.Connect(point);//连接到服务器
ShowMsg("连接成功");
ShowMsg("服务器" + client.RemoteEndPoint.ToString());
ShowMsg("客户端:" + client.LocalEndPoint.ToString());
Thread th = new Thread(ReceiveMsg);//连接成功后,就可以接收服务器发送的信息了
th.IsBackground = true;
th.Start();

clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据
clientSocket.Close();//关闭socket,释放资源

五、Socket对象的成员

1、属性

名称说明
AddressFamily获取 Socket 的地址族。
Available获取已经从网络接收且可供读取的数据量。
Blocking获取或设置一个值,该值指示 Socket 是否处于阻止模式。
Connected获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。
Handle获取 Socket 的操作系统句柄。
LocalEndPoint获取本地终结点。
RemoteEndPoint获取远程终结点。
ProtocolType获取 Socket 的协议类型。
SocketType获取 Socket 的类型。
ReceiveBufferSize获取或设置一个值,它指定 Socket 接收缓冲区的大小。
ReceiveTimeout获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。
SendBufferSize获取或设置一个值,该值指定 Socket 发送缓冲区的大小。
SendTimeout获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。

2、方法

Accept

名称说明
Accept()为新建连接创建新的 Socket。
BeginAccept(AsyncCallback, Object)  开始一个异步操作来接受一个传入的连接尝试。
EndAccept(Byte[], IAsyncResult)异步接受传入的连接尝试,并创建新的 Socket 对象来处理远程主机通信。 此方法返回包含所传输的初始数据的缓冲区。
AcceptAsync(SocketAsyncEventArgs) 开始一个异步操作来接受一个传入的连接尝试。

Connect

名称说明
Connect(EndPoint)与远程主机建立连接。
BeginConnect(EndPoint, AsyncCallback, Object)开始一个对远程主机连接的异步请求。
EndConnect(IAsyncResult)结束挂起的异步连接请求。
ConnectAsync(SocketAsyncEventArgs)开始一个对远程主机连接的异步请求。

Disconnect

名称说明
Disconnect(Boolean)关闭套接字连接并允许重用套接字。
BeginDisconnect(Boolean, AsyncCallback, Object)开始异步请求从远程终结点断开连接。
EndDisconnect(IAsyncResult)结束挂起的异步断开连接请求。
DisconnectAsync(SocketAsyncEventArgs)关闭套接字连接并允许重用套接字。

Receive

名称说明
Receive(Byte[])从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。
BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)开始从连接的 Socket 中异步接收数据。
EndReceive(IAsyncResult)结束挂起的异步读取。
ReceiveAsync(SocketAsyncEventArgs)开始一个异步请求以便从连接的 Socket 对象中接收数据。

ReceiveFrom

名称说明
ReceiveFrom(Byte[], EndPoint)将数据报接收到数据缓冲区并存储终结点。
BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始从指定网络设备中异步接收数据。
EndReceiveFrom(IAsyncResult, EndPoint)结束挂起的、从特定终结点进行异步读取。
ReceiveFromAsync(SocketAsyncEventArgs)开始从指定网络设备中异步接收数据。

ReceiveMessageFrom

名称说明
ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation)使用指定的 SocketFlags 将指定字节数的数据接收到指定的数据缓冲区位置,并存储终结点和数据包信息。
BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,然后存储终结点和数据包信息。
EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation)结束挂起的、从特定终结点进行异步读取。 此方法还显示有关数据包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多信息。
ReceiveMessageFromAsync(SocketAsyncEventArgs)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,并存储终结点和数据包信息。

Send

名称说明
Send(Byte[])将数据发送到连接的 Socket。
BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)将数据异步发送到连接的 Socket。
EndSend(IAsyncResult)结束挂起的异步发送。
SendAsync(SocketAsyncEventArgs)将数据异步发送到连接的 Socket 对象。

SendFile

名称说明
SendFile(String)使用 Socket 传输标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。
BeginSendFile(String, AsyncCallback, Object)使用 Socket 标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。
EndSendFile(IAsyncResult)结束文件的挂起异步发送。

SendTo

名称说明
SendTo(Byte[], EndPoint)将数据发送到指定的终结点。
BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)以异步方式将数据发送到特定远程主机。
EndSendTo(IAsyncResult)结束挂起的、向指定位置进行的异步发送。
SendToAsync(SocketAsyncEventArgs)以异步方式将数据发送到特定远程主机。

其它

名称说明
Select(IList, IList, IList, Int32)确定一个或多个套接字的状态。
SendPacketsAsync(SocketAsyncEventArgs)将文件集合或者内存中的数据缓冲区以异步方法发送给连接的 Socket 对象。
Bind(EndPoint)使 Socket 与一个本地终结点相关联。
Listen(Int32)将 Socket 置于侦听状态。
CancelConnectAsync(SocketAsyncEventArgs)取消一个对远程主机连接的异步请求。
GetSocketOption(SocketOptionLevel, SocketOptionName)返回指定的 Socket 选项的值,表示为一个对象。
SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean)将指定的 Socket 选项设置为指定的 Boolean 值。
SetIPProtectionLevel(IPProtectionLevel)设置套接字的 IP 保护级别。
Shutdown(SocketShutdown)禁用某 Socket 上的发送和接收。
Close()关闭 Socket 连接并释放所有关联的资源。
Dispose()释放 Socket 类的当前实例所使用的所有资源。

到此这篇关于C#之Socket(套接字)通信的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • C#基于Sockets类实现TCP通讯
  • 利用C#实现SSLSocket加密通讯的方法详解
  • C# Socket的TCP通讯的实例代码
  • 使用C#开发Socket通讯的方法

C++根据SOCKET获取套接字IP、Port等信息

C++根据SOCKET获取套接字IP、Port等信息

下面是小编 jb51.cc 通过网络收集整理的代码片段。

小编小编现在分享给大家,也给大家做个参考。

//通过套接字获取IP、Port等地址信息
bool GetAddressBySocket(SOCKET m_socket,SOCKADDR_IN &m_address)
{
    memset(&m_address,sizeof(m_address));
    int nAddrLen = sizeof(m_address);
  
    //根据套接字获取地址信息
    if(::getpeername(m_socket,(SOCKADDR*)&m_address,&nAddrLen) != 0)
    {
        printf("Get IP address by socket Failed!n");
        return false;
    }
      
    //读取IP和Port
    cout<<"IP: "<<::inet_ntoa(m_address.sin_addr)<<"  PORT: "<<ntohs(m_address.sin_port)<<endl;
    return true;
}

以上是小编(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给程序员好友。

我们今天的关于Socket.IO 1.0.x:按ID获取套接字获取套接字地址长度的分享已经告一段落,感谢您的关注,如果您想了解更多关于7.1 套接字(socket)、Android 进程通信套接字LocalSocket、C#之Socket(套接字)通信、C++根据SOCKET获取套接字IP、Port等信息的相关信息,请在本站查询。

本文标签: