Download the free trial version
Basic4android Video
Features
Tutorials and manuals
Showcase
Screenshots

Go Back   Android Development Forum - Basic4android > Basic4android > Basic4android Getting started & Tutorials
Documentation Wiki Register Members List B4P Search Today's Posts Mark Forums Read

Basic4android Getting started & Tutorials Android development starts here. Please do not post questions in this sub-forum.

Android Network Tutorial

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 12-21-2010, 01:31 PM
Erel's Avatar
Administrator
 
Join Date: Apr 2007
Posts: 15,689
Awards Showcase
Basic4ppc Founder 
Total Awards: 1
Default Android Network Tutorial

The Network library allows you to communicate over TCP/IP with other computers or devices.
The Network library contains two objects. Socket and ServerSocket.
The Socket object is the communication endpoint. Reading and writing are done with Socket.InputStream and Socket.OutputStream.

ServerSocket is an object that listens for incoming connections. Once a connection is established an event is raised and a socket object is passed to the event sub. This socket will be used to handle the new client.

Client application
Steps required:
- Create and initialize a Socket object.
- Call Socket.Connect with the server address.
- Connection is done in the background. The Connected event is raised when the connection is ready or if it failed.
- Communicate with the other machine using Socket.InputStream to read data and Socket.OutputStream to write data.

Server application
Steps required:
- Create and initialize a ServerSocket object.
- Call ServerSocket.Listen to listen for incoming connections. This happens in the background.
- Once a connection is established the NewConnection event is raised and a Socket object is passes.
- Call ServerSocket.Listen if you want to accept more connections.
- Using the Socket object received, communicate with the client.

We will see two examples.
The first example connects to a time server and displays the current date and time as received from the server.

Code:
Sub Process_Globals
    
Dim Socket1 As Socket
End Sub

Sub Globals

End Sub 

Sub Activity_Create(FirstTime As Boolean)
    Socket1.Initialize(
"Socket1")
    Socket1.Connect(
"nist1-ny.ustiming.org" , 1320000)
End Sub

Sub Socket1_Connected (Successful As Boolean)
    
If Successful = False Then
        
Msgbox(LastException.Message, "Error connecting")
        
Return
    
End If
    
Dim tr As TextReader
    tr.Initialize(Socket1.InputStream)
    
Dim sb As StringBuilder
    sb.Initialize
    sb.Append(tr.ReadLine) 
'read at least one line
    Do While tr.Ready
        sb.Append(
CRLF).Append(tr.ReadLine)
    
Loop
    
Msgbox("Time received: " & CRLF & sb.ToString, "")
    Socket1.Close
End Sub
We are creating a new socket and trying to connect to the server which is listening on port 13.
The next step is to wait for the Connected event.
If the connection is successful we create a TextReader object and initialize it with Socket1.InputStream. In this case we want to read characters and not bytes so a TextReader is used.
Calling tr.ReadLine may block. However we want to read at least a single line so it is fine.
Then we read all the other available lines (tr.Ready means that there is data in the buffer).



In the second application we will create a file transfer application, that will copy files from the desktop to the device.
The device will use a ServerSocket to listen to incoming connections.
Once a connection has been made, we will enable a timer. This timer checks every 200ms whether there is any data waiting to be read.

The file is sent in a specific protocol. First the file name is sent and then the actual file.
We are using a RandomAccessFile object to convert the bytes read to numeric values. RandomAccessFile can work with files or arrays of bytes, we are using the later in this case.
RandomAccessFile can be set to use little endian byte order. This is important here as the desktop uses this byte order as well.

The desktop example application was written with Basic4ppc.
Once connected the user selects a file and the file is sent to the device which saves it under /sdcard/android.
Both applications are attached.

Some notes about the code:
- The server is set to listen on port 2222.
The server displays its IP when it starts. The desktop client should use this IP address when connecting to a real device (this IP will not work with the emulator).
However if you work with the emulator or if your device is connected to the computer in debug mode you can use 'adb' to forward a desktop localhost port to the device.
This is done by issuing "adb forward tcp:5007 tcp:2222"
Now in the client code we should connect to the localhost ip with port 5007.
Code:
Client.Connect("127.0.0.1"5007)
Again if you are testing this application in the emulator you must first run this adb command. Adb is part of the Android SDK.

- Listening to connections:
Code:
Sub Activity_Resume
        ServerSocket1.Listen
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    
If UserClosed Then 
        Timer1.Enabled = 
False
        Socket1.Close
        ServerSocket1.Close 
'stop listening
    End If
End Sub

Sub ServerSocket1_NewConnection (Successful As Boolean, NewSocket As Socket)
    
If Successful Then
        Socket1 = NewSocket
        Timer1.Enabled = 
True
        InputStream1 = Socket1.InputStream
        OutputStream1 = Socket1.OutputStream
        
ToastMessageShow("Connected"True)
    
Else
        
Msgbox(LastException.Message, "Error connecting")
    
End If
    ServerSocket1.Listen 
'Continue listening to new incoming connections
End Sub
In Sub Activity_Resume (which also called right after Activity_Create) we call ServerSocket.Listen and start listening to connections. Note that you can call this method multiple times safely.
In Sub Activity_Pause we close the active connection (if there is such a connection) and also stop listening. This only happens if the user pressed on the back key (UserClosed = True).
The ServerSocket will later be initialized in Activity_Create.

The server side application can handle new connections. It will just replace the previous connection with the new one.
The desktop client example application doesn't handle broken connections. You will need to restart it to reconnect.

Edit: It is recommended to use the new AsnycStreams object instead of polling the available bytes parameter with a timer. Using AsyncStreams is simpler and more reliable.
Attached Files
File Type: zip NetworkExample.zip (23.7 KB, 1107 views)
Reply With Quote
  #2 (permalink)  
Old 12-22-2010, 06:35 PM
schimanski's Avatar
Basic4ppc Veteran
 
Join Date: Oct 2007
Location: Germany
Posts: 289
Default

Hello Erel,

thanks for this network-lib. Together with agrahams threading-lib, my network-apps are running as good as under basic4ppc. Respect!!

But I have two questions:

-I checked if the connection is successful with the following code, but when the connection isn't successful, I get an error, that the socket is not connected. It seems, that 'Successful' always is true I never get the msgbox 'not connected'.

-Is there a way to jump to the android-settings to switch the network on, like jumping to the GPS-settings as
StartActivity(GPS1.LocationSettingsIntent)?


Code:

Sub Socket1_Connected (Successful As Boolean)
  
If Successful Then
       main.filestreamRead=Socket1.InputStream 
       main.filestreamWrite=Socket1.OutputStream 
       
ToastMessageShow("Connected!"True)
  
Else
      
Msgbox("Not Connected!","")
  
End If
End Sub
__________________
schimanski
--------------------------------------
Device: Motorola Defy, Samsung Galaxy Tab P1000
Dekstop: Asus Eee PC
Reply With Quote
  #3 (permalink)  
Old 12-22-2010, 08:21 PM
agraham's Avatar
Basic4ppc Expert
 
Join Date: Jul 2007
Location: Cheshire, UK
Posts: 6,072
Awards Showcase
Innovator medal Beta Tester Forum Contributer 
Total Awards: 3
Default

Quote:
Originally Posted by schimanski View Post
Together with agrahams threading-lib
__________________
Sorry, but I don't answer questions by PM or email.
Please post your queries in the forum.
Reply With Quote
  #4 (permalink)  
Old 12-23-2010, 06:36 AM
Erel's Avatar
Administrator
 
Join Date: Apr 2007
Posts: 15,689
Awards Showcase
Basic4ppc Founder 
Total Awards: 1
Default

There is a bug in Network 1.00 regarding the successful flag. Fixed now: http://www.basic4ppc.com/forum/addit...html#post40303

Using the Phone library you can create this Intent:
Code:
    Dim i As Intent
i.Initialize(
"android.settings.WIFI_SETTINGS""")
StartActivity(i)
BTW, Socket.Connect and ServerSocket.Listen are handled internally in the background and will not block your program.
Reply With Quote
  #5 (permalink)  
Old 12-23-2010, 09:40 AM
schimanski's Avatar
Basic4ppc Veteran
 
Join Date: Oct 2007
Location: Germany
Posts: 289
Default

Thanks, works great!!!
__________________
schimanski
--------------------------------------
Device: Motorola Defy, Samsung Galaxy Tab P1000
Dekstop: Asus Eee PC
Reply With Quote
  #6 (permalink)  
Old 01-12-2011, 06:31 PM
Basic4ppc Expert
 
Join Date: May 2008
Location: Italy
Posts: 599
Awards Showcase
Beta Tester 
Total Awards: 1
Default

Does the library support UDP?
__________________
rgds,
moster67
Reply With Quote
  #7 (permalink)  
Old 01-13-2011, 05:37 AM
Erel's Avatar
Administrator
 
Join Date: Apr 2007
Posts: 15,689
Awards Showcase
Basic4ppc Founder 
Total Awards: 1
Default

No. Only TCP.
Reply With Quote
  #8 (permalink)  
Old 01-24-2011, 03:19 PM
Newbie
 
Join Date: Jan 2011
Posts: 1
Default

Can you initialise the socket object with an IPv6 address, and does android support WLAN connections to IPv6 only networks?
Reply With Quote
  #9 (permalink)  
Old 01-25-2011, 06:39 AM
Erel's Avatar
Administrator
 
Join Date: Apr 2007
Posts: 15,689
Awards Showcase
Basic4ppc Founder 
Total Awards: 1
Default

Quote:
Can you initialise the socket object with an IPv6 address
Yes. You can pass an IPv6 address as the host parameter.
Quote:
and does android support WLAN connections to IPv6 only networks?
According to the documentation it is supported. I haven't tested it myself.
Reply With Quote
  #10 (permalink)  
Old 02-02-2011, 11:40 AM
Junior Member
 
Join Date: Jan 2011
Location: Adelaide, Australia
Posts: 45
Default

After exploring many options, I wonder if this might be the key to interfacing an Android with the real world?

(For those of us with the cheaper pads that don't have bluetooth).

After much searching, I think this might be the cheapest way to convert cat5 to serial WIZnet Serial-to-Ethernet Gateway - WIZ110SR - SparkFun Electronics (well, not quite as the cheapest probably involves buying a W5100 chip and soldering it, but the pins are 0.2mm apart!).

If you can get data to serial, there are many devices that can convert real world data into serial eg picaxe, arduino, propeller.

I do like the simple software interface for these sockets. Sure is a lot easier than trying to write a TCP stack.
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are On

Similar Threads
Thread Thread Starter Forum Replies Last Post
Android Serial tutorial Erel Basic4android Getting started & Tutorials 78 05-20-2012 05:39 AM
Android JSON tutorial Erel Basic4android Getting started & Tutorials 5 05-07-2012 03:33 AM
Android views animation tutorial Erel Basic4android Getting started & Tutorials 46 05-03-2012 01:37 PM
android NDK support? Cor Bugs & wishlist 10 01-24-2011 03:32 AM
Android me1... linum Chit Chat 4 06-16-2010 07:12 PM


All times are GMT. The time now is 10:25 AM.


Powered by vBulletin® Version 3.6.12
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0