Sockets - java/android/nodejs

Data publikacji: 2012-06-13 , Wyświetleń: 6396

fade anim Gniazdka są komponentem sieciowym dostępnym od niepamiętnych czasów. Ale dopiero ostatnimi czasy stają się popularne. Głównie ze względu na ich HTML'ową implementację oraz takie rozwiązania jak NODEjs. Wrzucę tutaj parę linijek kodu demonstrującego proste ich zastosowanie. Będzie to klient dla systemu Android oraz server napisany w Javie oraz w nodejs

 

Server - NODEJS

Server działa bardzo prosto. Gdy otrzyma tekst "FINISH" zakończy swoje działanie. W przypadku otrzymania tekstu "www" odeśle adres kenumir.pl. W kodzie są komentarze (nie ma co objaśniać).

var net = require('net');

// tworzenie servera
var server = net.createServer(function (socket) {
	socket.on('end', function() {
		console.log('server disconnected');
	});
	
	/*
	odbieranie danych
	*/
	socket.on('data', function(buff) {
		/*
		kończenie działania
		*/
		if (buff == "FINISH\n") {
			console.log("FINISH SERV");
			server.close();
		}
		/*
		odsyłamy adres strony
		*/
		if (buff == "www\n") {
			socket.write("kenumir.pl\n");
		}
	});
	/*
	jeżeli chcemy aby server odsyłał wszystko co odbierze to odkomentować linie poniżej
	*/
	//socket.pipe(socket);
});

// nasłuchujemy na konkretnym porcie i adresie
server.listen(8007, '192.168.1.101');

 

Server - Java

W Javie kodu jest nieco więcej ale też jest dość prosty. Skutek działania obydwu serverów jest taki sam.

package com.sock.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.logging.Handler;
import java.util.logging.LogRecord;

public class SockServer {

	private static Boolean doEnd = false;

	public static void main(String[] args) {
		System.out.println("SERVER START");
		ServerApp app = new ServerApp();
		
	}

	private static class ServerApp {
		private ServerSocket server;
		private static ServerApp self = null;
		
		public static synchronized ServerApp getInstance(){
			return self;
		};
		private ArrayList clients = new ArrayList();
		
		public ServerApp(){
			self = this;
			try {
				server = new ServerSocket(8007);
				do {
						System.out.println("WAITING FOR CLIENT...");
						Socket s = server.accept();
						new SockReadThread(s).start();
				
				} while(!doEnd);
				server.close();
				System.out.println("SERVER END");
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		public void finishApp(){
			System.out.println("SERVER APP FINISHED");
			System.exit(0);
		}
	}
	
	public static class SockReadThread extends Thread {
		private Socket sock;
		public SockReadThread(Socket s) {
			sock = s;
		}
		
		public void run() {
			System.out.println("ACCEPTED CLIENT");
			BufferedReader input;
			try {
				do {
					input = new BufferedReader(new InputStreamReader(sock.getInputStream()));
					String st = input.readLine();
					System.out.println("GET: " + st);
					if (st.equals("FINISH")) {
						sock.close();
						doEnd = true;
						Thread.currentThread().interrupt();
						System.out.println("FINISHING...");
						ServerApp.getInstance().finishApp();
					}
					if (st.equals("www")) {
						OutputStream out = sock.getOutputStream();
						out.write(new String("http://kenumir.pl/\n").getBytes());
						System.out.println("SEND: http://kenumir.pl/");
					}
				} while (!Thread.currentThread().isInterrupted());
				
				System.out.println("thread end");
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}

}

Klient - Android

Klient ma najwięcej kodu ale tutaj obsługujemy także UI usera więc to jest tego powodem. Plik XML z wyglądem Activity można pobrać tutaj.

package com.sock.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class SockClientActivity extends Activity {
    
	private Socket client;
	private EditText txt, user, msg;
	private Handler msgH = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			Toast.makeText(SockClientActivity.this, "MSG: " + (String)msg.obj, Toast.LENGTH_LONG).show();
		}
	};
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		txt = (EditText)findViewById(R.id.editText1);
		user = (EditText)findViewById(R.id.editText2);
		msg = (EditText)findViewById(R.id.editText3);
		
		Random r = new Random();
		user.setText("test" + (r.nextInt(100) + 1));
	}

	public void sendMsg(View v) {
		if (client != null && client.isConnected()) {
			try {
				client.getOutputStream().write(new String(msg.getText().toString() + "\n").getBytes());
				Log.i("ss", "SEND: " + msg.getText().toString());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void disconect(View v) {
		if (client != null && !client.isClosed()) {
			try {
				client.getOutputStream().write(new String("FINISH\n").getBytes());
				client.close();
				Log.i("ss", "disconect");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void connect(View v) {
		new Thread(new Runnable(){
			@Override
			public void run() {
				try {
					client = new Socket(txt.getText().toString(),8007); //"192.168.1.101"

					final BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));

					OutputStream out = client.getOutputStream();
					out.write(new String("USER: " + user.getText().toString() + "\n").getBytes());
					
					while(!Thread.currentThread().isInterrupted()) {
						String l = input.readLine();
						Message msg = Message.obtain(msgH);
						msg.obj = l;
						msgH.sendMessage(msg);
						Log.i("ss", "GET: " + l);
					}
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
    	
    }
}

Ot i to całość. Więcej zabawy jest z UI czy sposobem komunikacji niż z inplementacją gniazdek. W przyszłości przy wolnym czasie może coś tu dopisze albo dodam klienta HTML5 (Web Socket).

 

Małe podsumowanie

Sama aplikacja serverowa nie robi praktycznie nic jak tylko odsyła do klienta adres strony po tym jak wpisze on tekst "www". Na konsoli servera można obserwować jak podłączają się kolejni klienci oraz jakie wiadomości wysyłają.

Tagi: socket, java, android, nodejs