Java TCP/IP kommunikáció

Java TCP/IP kommunikáció
2011-05-04T18:32:02+02:00
2011-05-04T18:32:02+02:00
2022-11-21T18:50:40+01:00
FlashBboy
Sziasztok!

A problémám a következő:

Egy sakkjátékhoz készítek hálózati kommunikációt kezelő szerver kliens alkalmazást.Egy 3D-s sakkprogramról van szó, ami egy külön appletként már működőképes, a célom hogy a lépések validálását a szerver végezze. A kliens indításakor egy lobby részbe kerül a játékos, ahol egy egyszerű táblázatban megjelennek a kliensek akik csatlakoztak a szerverhez. A lehető legegyszerűbb megoldást keresem a játékosok kezelésére, mert sajnos szorít a határidő és a munkám mellett nem sokat tudok foglalkozni vele. Mellékelem a kliens/szerver kódot. A probléma a következő, a szerver már tárolja a csatlakozott klienseket, tárolja a szálakat, és amikor csatlakozik egy játékos kommunikál vele..Azt szeretném, ha egy új kliens csatlakozásakor, minden eddig belépettnek frissüljön a táblázata, az éppen csatlakozó kliens által a szervernek küldött adatokkal.Úgy gondolkoztam, hogy egy Map-ben társítottam a csatlakozott klienseket az általuk küldött infoval és ezen végigszaladva mindig elkértem az adott klienshez tartozó Streamet és azon próbáltam küldeni a többi adatot. Nem vagyok otthon a tcp ip kliens szerver kommunikációban, úgyh erős a gyanúm, hogy vmi triviális szarvashibát követek el, remélem tudtok ebben segíteni nekem fontos lenne. Ha ez a rész elkészülne, ez alapján időben be tudnám fejezni a programot.


package network; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; import java.net.ServerSocket; import java.net.Socket; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.StringTokenizer; import chess3D.Player; public class LobbyServer { static Integer playerNumber = new Integer(0); static Thread[] threads; static ThreadGroup rootThreadGroup = null; static HashMap<Player, Socket> SessionInfo = new HashMap<Player, Socket>(); //A játékosokat a kapcsolathoz társító map protected static ThreadGroup getRootThreadGroup( ) { if ( rootThreadGroup != null ) return rootThreadGroup; ThreadGroup tg = Thread.currentThread( ).getThreadGroup( ); ThreadGroup ptg; while ( (ptg = tg.getParent( )) != null ) tg = ptg; return tg; } public static Thread[] getAllThreads( ) { final ThreadGroup root = getRootThreadGroup( ); final ThreadMXBean thbean = ManagementFactory.getThreadMXBean( ); int nAlloc = thbean.getThreadCount( ); int n = 0; Thread[] threads; do { nAlloc *= 2; threads = new Thread[ nAlloc ]; n = root.enumerate( threads, true ); } while ( n == nAlloc ); return java.util.Arrays.copyOf( threads, n ); } /* * A kapott Stringből Player entitást készítünk */ private static int port = 1001; /* port the server listens on */ public static void main (String[] args) { ServerSocket server = null; try { server = new ServerSocket(port); /* start listening on the port */ } catch (IOException e) { System.err.println("Could not listen on port: " + port); System.err.println(e); System.exit(1); } Socket client = null; while(true) { try { client = server.accept(); } catch (IOException e) { System.err.println("Accept failed."); System.err.println(e); System.exit(1); } /* start a new thread to handle this client */ Thread t = new Thread(new ClientConn(client)); System.out.println("DEBUG (PlayerNumber): "+playerNumber); System.out.println("DEBUG (ThreadName): "+t.getName()); t.start(); t.setName((playerNumber++).toString()); threads = LobbyServer.getAllThreads(); } } } class ClientConn implements Runnable { private Socket client; protected BufferedReader in = null; protected PrintWriter out = null; protected int clientNumber = LobbyServer.playerNumber+1; public Player stringToPlayer(String s) { Player p = new Player(); StringTokenizer tokenizer = new StringTokenizer(s); p.setName(tokenizer.nextToken()); p.setColor(Integer.parseInt(tokenizer.nextToken())); p.setMatchesWon(Integer.parseInt(tokenizer.nextToken())); p.setMatchesLost(Integer.parseInt(tokenizer.nextToken())); p.setPlaying(Boolean.valueOf(tokenizer.nextToken())); return p; } ClientConn(Socket client) { this.client = client; try { in = new BufferedReader(new InputStreamReader( client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); } catch (IOException e) { System.err.println("ClientConn exception : "+e); return; } } public Socket getClient() { return client; } public void setClient(Socket client) { this.client = client; } @Override public void run() { LobbyServerProtocol protocol = new LobbyServerProtocol(this); String msg; try { while ((msg = in.readLine()) != null) { out.println("OK"); try { Thread.sleep(150); } catch (InterruptedException e) { e.printStackTrace(); } //Futó szálak listázása, az első 4 számunkra nem fontos for (int i = 0;i < LobbyServer.threads.length-5; i++) { System.out.println("ThreadName " + LobbyServer.threads[i+5].getName()); } LobbyServer.SessionInfo.put(stringToPlayer(in.readLine()),this.getClient()); Collection c = LobbyServer.SessionInfo.keySet(); Collection c2 = LobbyServer.SessionInfo.values(); Iterator itrKey = c.iterator(); while(itrKey.hasNext()){ String outGoingPlayerInfo = itrKey.next().toString(); System.out.println("ITERATOR : "+ outGoingPlayerInfo); Iterator itrVal = c2.iterator(); Socket conn = (Socket)itrVal.next(); out = new PrintWriter(conn.getOutputStream(), true); sendMsg(outGoingPlayerInfo+"_"+conn.isConnected(), out); while (itrVal.hasNext()) { conn = (Socket)itrVal.next(); out = new PrintWriter(conn.getOutputStream(), true); out.println("Players : " + outGoingPlayerInfo); out.flush(); System.out.println("Connected : " + conn.isConnected()); } } } } catch (IOException e) { System.err.println(e); } } public void sendMsg(String msg) { out.println(msg); } public void sendMsg(String msg, PrintWriter outGoing) { outGoing.println(msg); } } class LobbyServerProtocol { private ClientConn conn; public LobbyServerProtocol(ClientConn c) { conn = c; } }

Ez a szerver kódja, nincs agyonkommentezve, de szerintem aki segíteni tud, annak ez nem lesz akadály :) Kis magyarázat : A conn a csatlakozó kliens. A szerveren a threads[] tartalmazza a szállakat. A SessionInfo társítja a socketeket a játékos infoihoz. A kapcsolat csak rövid Stringeket fog küldeni, később is csak a bábu induló és érkezési pozicíóját.

A kliens kódja :


package network; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JApplet; import javax.swing.JScrollPane; import javax.swing.JTable; import chess3D.Player; public class LobbyClientTest extends JApplet implements ActionListener, KeyListener { /** * */ private static final long serialVersionUID = 6165262271269964956L; private static final String host = "localhost"; private static final Integer port = 1001; public PrintWriter out; public BufferedReader in; private String playerName; Player playerInfo = new Player(); Socket server; /* * Statisztika */ private Integer matchesWon; private Integer matchesLost; JTable playerList = new JTable(10,4); /* * Jatekban van-e */ private Boolean playing; /* * Tablazat a megjelenítéshez */ private JTable createTable() { System.out.println("DEBUG : createTable"); String[] columnNames = {"Player", "Matches Won", "Matches Lost", "Playing?" }; PlayerListTableModel columnModel = new PlayerListTableModel(30, columnNames); playerList.setModel(columnModel); playerList.getColumn("Player").setMinWidth(200); JScrollPane scrollPane = new JScrollPane(playerList); playerList.setFillsViewportHeight(true); add(scrollPane); return playerList; } public void autoRefresh(String playerInfo) { System.out.println(playerInfo); } @Override public void init() { setLayout( new BorderLayout() ); Dimension size = new Dimension(500,300); setSize(size); try { System.out.println("Connecting..."); JTable playerList = createTable(); PlayerWindow p = new PlayerWindow(); p.setLocation(400, 300); p.setVisible(true); /* * Inicializáljuk a táblázatot, első helyen magunkat megjelenítve */ while (true) { //Amíg nem adunk meg nevet, nem léphetünk tovább if (!p.getPlayerInfo().getName().equals("")) { playerInfo = p.getPlayerInfo(); playerList.setValueAt(playerInfo.getName(), 0, 0); playerList.setValueAt(new Integer(0), 0, 1); playerList.setValueAt(new Integer(0), 0, 2); playerList.setValueAt(new Boolean(false), 0, 3); p.dispose(); break; } } /* try to open a socket to the server at the given host:port */ server = new Socket(host, port); System.out.println("Connected"); /* obtain an output stream to the server... */ PrintWriter o
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd