How to receive an incoming message in Socket Programming iOS - iphone

I'm developing an App where I'm able to send/recieve messages to/from PHP server using socket, I'm referring Ray's tutorial for Socket programming.
But now I want to send to send messages to another user who is using the App, I have his IP Address and Port no, So I can send message to the user but How will that user recieve the message, because he not connected to my port. How will he notify that there is an incoming message for him?
I'm doing socket programming for very first time.

Related

Ejabberd Message delivery while application is terminated

I am developing a chat app using ejabberd server for both IOS and Android. I also wrote a module for ejabberd to get the offline messages sent to my own server api .
my own server api will send notifications to the IOS/Android platforms using FCM.
On the client side , if the application is in the foreground or the background , it will stay connected to ejabberd and if the client receives the message then ejabberd will send the message delivery status.
I am facing an issue while the app is terminated ( service is not running ) which means it is not connected to ejabberd (offline) . if i send a message to this app while it is not terminated , it will receive a notification but the message still undelivered . how can mark the messages as delivered when receiving the notification while the app is terminated.
to explain it more , the same functionality is working fine with whatsapp :
device A has whatsapp installed and whatsapp was turned off (terminated)
Device B has whatsapp running
Device B sends a message to device A
Device A receives a whatsapp notification
Without doing anything on Device A , the message status on Device B is marked as delivered .
How can I implement this scenario with ejabberd ?
In case someone went into this issue , here is the solution that I implemented with help of #Mickaël Rémond from his answer.
I configured ejabberd to send the offline messages to an http service ( your own server) please refer to this link for further on how to do it
your server should catch the above call and generate a notification message (FCM ) in my case and send it to recipient device
recipient device will catch the notification which includes the message
recipient device will call http service (your own server backend)that responsible for sending the deliver ack to the original sender . you need to pass from, to , stanzaId , vhost with this call
backend server will use ejabberd-api (set of exposed apis to manage ejabberd through rest apis calls) to send delivery message using this api
please note the following notes also :
sending the delivery message from your own server to ejabberd will not delete them from ejabberd database
if the user re-connected to the ejabberd server then the recipient will receive the message again from ejabberd .
It is probably too complex for a simple Stack Overflow question, as you need to integrate several moving part on client and server:
You need to execute code in background when receiving push notifications on iOS (you need that property set on your app in your app provisioning profile and have code to handle that). The client will initiate an HTTPS query to let the server know that the message was delivered.
You need to have an endpoint that will get the delivered HTTPS calls and generate either a message ack or a chat marker on behalf of the user and route it in ejabberd.
In real world, this is not enough if you want to take into account the fact that you can only have 1 push in the queue on APNS. If you have several messages sent while the device is not on the network, you will need to have the device check all received messages while offline on the server, otherwise you will lose messaging.
You need to rely on XMPP Message Archive Management (MAM) to handle that history.
As you see, this is not a simple few tens of line of codes but need real design and involved work.

Socket to receive data and push to client browser in a web application

There is a SocketServer which I need to connect, receive data and then push it back to clients (web browser).
I just need to confirm the approach. I will create a Socket connection which will keep listening for message inside a ServletContextListener. The message will be then be stored in ServletContext so that it's available to push it back to client browser.
Should I create socket connection inside ServletContextLister? Or is there any other way to listen to socket?
For pushing data back to client, I don't want to have a bi-directional communication. So should I go for SSE or Html5 WebSockets? Any java framework supporting SSE or WebSocket along with client side library?
Thanks
I implemented this and its working fine. For server I went with Jetty 8 and used jetty's WebSocket.
Briefly how I implemented is, for listening to messages from SocketServer I implemented ServletContextListener which initializes Socket which will consume the messages.
When a user hits a url I add the WebSocket connection to a Collection and store that collection as ServletContext attribute. This WebSocket list is then accessed by the Socket which iterates and sends messages where whenever messages arrives. The message is then pushed back to all the connected clients.

XMPP Message not delivered at openfire

Earlier I was using smack as the client side library and sending the message to the openfire and it was working properly.
Now I want to use netty along with smack to establish the connection. I am able to create the channel and openfire shows me the connection created but I am not able to send the Registration packet to the openfire. I am writing the packet on the channel but its not getting delivered at the openfire.
Can you please help.
Use wireshark to see if the XMPP packets are been delivered.
If not you need to check your code.

Is that possible to use SIP in LAN network?

I don't know enough about SIP. As far as I know SIP can not be used in LAN. But it's features are very good. I want to use it for a LAN messenger (with video conference facilities).
Is there any way of using SIP in LAN network ?
The SIP protocol can be used over any reliable transport (TCP, XMPP, instant messaging channel, etc...) to a service (e.g. a server such as a SIP proxy) that knows how to route the SIP INVITE message from the caller to the callee. e.g. If you send an INVITE to bob#foobar.com, there's needs to be a service that knows how to find "bob" and deliver the message. Likewise, when Bob sends back his response messages back, the messages need to route back to the caller who sent the original INVITE.
And you can do SIP without a server - provided the computer already have a connection (direct or indirect) to the other computer intended for the call.
But SIP isn't anything special. If you were to invent your own video conferencing protocol, it would probably look a lot like SIP. SIP's primary job is for both sides of a call to exchange IP/port candidates for connecting directly in addition to codec and bandwidth negotiation data.
After the SIP messages are exchanged, ICE/STUN/TURN take over and RTP packets typically flow. SIP isn't used in the call except to end the call.
What are you really trying to do anyway?
Thread is Old but still I would like to contribute to this. There are various SIP server like http://www.officesip.com/index.html which works in LAN and can be connected to hardware phone too and soft client also.
Jitsi is open source cross platform SIP/xmpp client:https://jitsi.org/
And if you want to XMPP server Openfire is the best:http://www.igniterealtime.org/projects/openfire/
I hope this will definitely help someone..!

Connect to a mobile phone

I know how to make a TCP connection from a phone to a URL (server)
I know how to make an HTTP connection from a phone to a URL (server)
I do not know how to make a connection from a server to a phone
Is there a way to use the phone number of a phone to bridge from voice network to data network of the same provider (VERIZON or AT&T or ROGERS in Canada)?
In essence I wish to find a way to make a "phone call" from a server, over the Internet and over the local data network or WiFi, to a phone, without using any intermediaries
We are willing to pay for this info (optionally)
You can use Push Notification Systems for connecting to the phone. Ideally, you'd want to initiate a pull of data from the device when it receives a push notification from your server. This is because push notifications can handle only small amounts of data.
Another option for you, would be to open a socket on the client device and broadcast this address to your server during startup. Later, your server can directly connect to the listening port on your device, provided the app is still running.
You could send a push message to the phone and let the phone establish the connection.
Just a rough short sketch, maybe this will help you. If I'd had to solve that problem
i would use androids Cloud2Device messaging to tell the phone to connect to a certain
server which you specify in the message from the cloud. Then the phone connects to your command server and you can tell over the connection what the phone should do.
This way you dont have to execute a server on the phone.
Look here
My Ideas
1.Have a look at http://developer.android.com/reference/android/net/sip/package-summary.html
2.Use C2DM(cloud to device message),It will send the message to your app
3.Use XMPP chat client from the server you can send the message to android app after receiving message your app can call(it depends on your logic)
There is no universal one-to-one mapping between cellular phone numbers and IP addresses (e.g. the user could have driven out of cell tower range to a coffee shop with wifi). So this is impossible to do directly.
The services that do seem to do this require a running app on the mobile device to cooperate by periodically connecting to some centralized database using its current IP address, which some server can record in its database for you to do a lookup when want to try to connect to that mobile device. Google "SIP service providers".