react-native-tcp-socket connection event not working

26 Views Asked by At

in the application I made using this library react-native-tcp-socket, the server is created and the functions in the listen event work, but server.on('connection',() => {}) does not work

Server.js

import TcpSocket from 'react-native-tcp-socket';
import NetInfo from '@react-native-community/netinfo';

export const server = new TcpSocket.Server();
export let address = null;
const getWifi = async () => {
  try {
    const state = await NetInfo.fetch();
    if (state.isConnected) {
      const netInfo = state;
      const newIpAddress = netInfo.details && netInfo.details.ipAddress;
      return newIpAddress;
    }
  } catch (error) {
    console.log(error);
  }
};

export const closeServer = () => {
  if (server) {
    console.log(`server closed`);
    server.close();
  } else {
    console.log('server not found');
  }
};

export const init = async () => {
  const ip = await getWifi();
  server.on('connection', socket => {
    socket.on('data', () => {
      socket.write('Echo server\r\n');
    });
  });

  server.listen({port: 0, host: `127.0.0.1`, reuseAddress: true}, () => {
    const port = server.address()?.port;
    if (!port) throw new Error('Server port not found');
    address = server.address();
    console.log(address);
  });
};

Client.js

import TcpSocket from 'react-native-tcp-socket';
import NetInfo from '@react-native-community/netinfo';
export const client = new TcpSocket.Socket();
const getWifi = async () => {
  try {
    const state = await NetInfo.fetch();
    if (state.isConnected) {
      const netInfo = state;
      const newIpAddress = netInfo.details && netInfo.details.ipAddress;
      return newIpAddress;
    }
  } catch (error) {
    console.log(error);
  }
};

export const init = async port => {
  const ip = await getWifi();
  const options = {
    port: port,
    host: `127.0.0.1`,
    localAddress: `127.0.0.1`,
    reuseAddress: true,
    localPort: port,
    interface: "wifi",
  };

  client.connect(options, () => {
    client.write(`connected to server`);
  });

  client.on('data', data => {
    console.log(`new data`, data.toString());
  });
};

SocketProvder.jsx to start the server

import React, {useEffect, useState} from 'react';
import {SocketContext} from './SocketContext';
import {closeServer, server, init} from '../server/Server';

export default function SocketProvider({children}) {
  const [isInitServer, setIsInitServer] = useState(false);
  useEffect(() => {
    if (isInitServer) {
      server.on('connection', socket => {
        console.log(socket.address());
        socket.on('data', data => {
          console.log(`in server `, data.toString());
        });
      });
      console.log(server.eventNames());
      init();
    }
    return () => {
      if (isInitServer) {
        closeServer();
        setIsInitServer(false);
      }
    };
  }, [isInitServer]);

  
  return (
    <SocketContext.Provider
      value={{
        isInitServer,
        setIsInitServer,
      }}>
      {children}
    </SocketContext.Provider>
  );
}

ClientProvider.js

import React, {useEffect, useState} from 'react';
import {ClientContext} from './ClientContext';
import {init, client} from '../server/Client';
export default function ClientProvider({children}) {
  const [isJoinedClient, setIsJoinedClient] = useState({
    isConnectected: false,
    port: null,
  });

  useEffect(() => {
    if (isJoinedClient.isConnectected && isJoinedClient.port !== null) {

      client.on('data', data => {
        console.log(`client data`, data.toString());
      });
      client.on('error', err => {
        console.log(`client error: `, err);
        client.destroy();
        beginIsJoined();
      });
      init(isJoinedClient.port);
    }

    return () => {
      if (isJoinedClient.isConnectected && isJoinedClient.port !== null) {
        client.destroy();
        beginIsJoined();
      }
    };
  }, [isJoinedClient]);

  const handleIsJoined = (boolVal, port) => {
    setIsJoinedClient(prev => ({
      ...prev,
      isConnectected: boolVal,
      port: port,
    }));
  };
  const beginIsJoined = () => {
    setIsJoinedClient(prev => ({
      ...prev,
      isConnectected: false,
      port: null,
    }));
  };

  return (
    <ClientContext.Provider
      value={{isJoinedClient, setIsJoinedClient: handleIsJoined}}>
      {children}
    </ClientContext.Provider>
  );
}

server.on('connection', socket => {
        console.log(socket.address());
        socket.on('data', data => {
          console.log(`in server `, data.toString());
        });

In this method, it should write the address of the socket when there is a connection or log when there is data coming in, but it is not working, can you help me what I might be doing wrong?

thanks in advance

0

There are 0 best solutions below