«

»

Sep
30

Java ile Thread Kullanarak Socket Programlama

Bu yazımda çok işlevsel olmasa da Android için telnet client’ı yazarken kullandığım echo server kodlarını anlatacağım. NIO paketini kullanmadığım için aslında çok da sağlıklı değil ve her bağlantı için ayrıca bir thread oluşturulmaktadır. Bu nedenle çok fazla yüklenmelere dayanamayacak bir server olacak bizimkisi.

Önce Java’da socket işleri nasıl yürüyor ona bakalım. Javada ServerSocket ve Socket olmak üzere kullanıma hazır iki socket türü var(Aslında LocalSocket de var). Server sürekli bekleme işini yaptığımız ve dışardan birisi bağlanırsa ona gereken cevabı verdirttiğimiz makinede sürekli çalışmak zorunda olan programımız. ServerSocket sınıfının constructoru ile hangi porttan bu server hizmetini vereceğimizi belirlememiz gerekiyor.

Olay ise şundan ibaret:

1- ServerSocket’imiz bir portu izler durur.

2- Client bir Socket yardımıyla bizim Server’ımızın portuna naber der.

3- ServerSocket bu bağlantıyı accept() static methoduyla aldıktan sonra bir socket oluşturur.

4- Bu oluşturulan socket ile haberleşirler. Ve mutlu son :)

Neden Thread Kullanmalıyım?

Çok basit! Server’a birden fazla client’ın bağlanabilmesi için bu yapılır. Client tarafından gelen verinin ne kadar sürede geleceği belli değildir. Bu sebeple o verilerin alınma işlemleri bir thread’ın run methodunun içine gömülür. Ardından serverda start() static methodu ile thread çalıştırılır.

Server’ımızın Kodu:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.cagdas.network;
 
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
public class EnterpriseEchoServer {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ServerSocket ss;
 
		try {
			ss = new ServerSocket(23);
			System.out.println(InetAddress.getLocalHost() + " hazir");
			while (true) {
 
				Socket s = ss.accept();
				System.out.println(s.getInetAddress().getHostName() + " "
						+ s.getInetAddress().getHostAddress() + " baglandi");
				new EESThreadPart(s).start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}// Telnet hizmeti
 
	}
 
}

Burada 23 numaralı telnet portunu seçtim. Kodda görüldüğü üzere s socketi serversocketinin accept metodu ile gelen isteği kabul edilip oluşturuluyor. getInetAdress() methodu ile bağlanan kişinin bilgileri HostName ve HostAdress gibi bilgileri alınabiliyor. Ardından s socketi thread’li kısma gönderiliyor.

 

Thread kullanılan Sınıf

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.cagdas.network;
 
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
 
public class EESThreadPart extends Thread {
 
	private Socket s;
 
	public EESThreadPart(Socket s) {
 
		this.s = s;
	}
 
	public void run() {
		PrintStream pr;
		try {
			pr = new PrintStream(s.getOutputStream());
			Scanner sc = new Scanner(s.getInputStream());
			pr.println("Server'a baglandiniz. Cikmak icin bye yazin."); // Client'a
			String gelen; // gonderiliyor
			while (true) { // sonsuz dongu
				gelen = sc.nextLine(); // client'dan geliyor
				if (gelen.trim().equalsIgnoreCase("bye"))
					break;
				System.out.println("Client:" + gelen);
				pr.println("Echo:" + gelen);
			}
			s.close();
			System.out
					.println(s.getInetAddress().getHostName() + " "
							+ s.getInetAddress().getHostAddress()
							+ " serverdan cikti!");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
	}
 
}

Burada PrintStream kullanılarak Client’a veri gönderilmiş ve ondan gelenler de Scanner yardımıyla sonsuz döngü içerisinde beklenmiştir. Bye yazıca client ile bağlantıyı sağlayan socket sonlandırılmakta.

Server’ımızı Nasıl Deneriz?

Telnet portunu (23) kullanmamızın bir nedeni vardı :) Herhangi bir telnet clientı ile programınız çalışıyorken denemelerinizi yapabilirsiniz. Mesela ubuntuda şöyle kullanılabilir:

cagdas@cagdas-K53SV:~$ telnet
telnet> open localhost
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
Server’a baglandiniz. Cikmak icin bye yazin.

2 comments

  1. murat says:

    merhaba bu konu hakkında henüz cok yeniyim ve sizin örneğinizi inceliyordum. bunun denemesini windows ta nasıl yapabiliriz acaba?

  2. cagdas says:

    Sınıfların isimleri kodun aşağıdaki kısmında tanıtılmış. Bu isimlerle class oluşturmalısın (java uzantılı dosya) ardından kopyalamalısın bunları. Bilgisayarına JDK ve Eclipse kurarak geliştirme ortamını hazırlayabilirsin.

    public class EnterpriseEchoServer
    public class EESThreadPart

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre user="" computer="" escaped="">