Article View: pl.comp.lang.java
Article #153864"Usieciowienie" gier
From: TheGuru
Date: Wed, 11 Sep 2013 09:08
Date: Wed, 11 Sep 2013 09:08
405 lines
12645 bytes
12645 bytes
Witajcie,
napisałem kilka gier logicznych (kolejne czekają )
https://play.google.com/store/apps/developer?id=TheGuru#?t=W251bGwsbnVsbCxudWxsLDEsImNvbS50aGVndXJ1Lm1hdGhncmFwaCJd.
Gry tracą na atrakcyjności kiedy można grać tylko na 1 urządzeniu (a
niektóre nie mają sensu kiedy znasz "karty" przeciwnika).
Od jakiegoś czasu próbuje dodać do nich obsługę sieci ale idzie mi gorzej
niż po grudzie.
Przerobiłem podobne wątki na tym forum ale nie ogarnąłem tematu.
Może mam złe założenia i w ogóle nie idę w dobrym kierunku.
Komunikację wyobrażam to sobie jak w np GG. Pierwszy zawodnik wykonuje ruch
i w formie krótkiego stringa wysyłam informację np 10050906 co by znaczyło
że z pola 10:5 wykonuje ruch na pole 9:6.
W sieci znalazłem kod prostego komunikatora napisanego w C. Próbowałem go
przerobić na interfejs androida ale cos mi nie poszło bo nie mam
komunikacji.
Aplikacje uruchamiam w 2 oknach AVD licząc, że będę mógł pisać z jednego do
drugiego, jak to działało w przykładzie C.
Niestety na andku nie działa. Jak by co to mam wykupiony serwer (co prawda
do zdjęć, ale mam dostęp do ftp i chyba mogę go użyć jeśli będzie taka
potrzeba).
Będę zobowiązany jeśli ktoś poświęci swój czas by mi pomóc.
Poniżej przesyłam kod.
To NIE JEST użyteczna aplikacja tylko program testujący :-)
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/bStworz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Utwórz połączenie" />
<Button
android:id="@+id/bPolacz"
android:layout_width="168dp"
android:layout_height="wrap_content"
android:text="Połącz" />
<TextView
android:id="@+id/tvTresc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.37"
android:hint="Tereść rozmowy" />
<EditText
android:id="@+id/etZdanie"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="napisz" />
<Button
android:id="@+id/bWyslij"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Wyślij" />
</LinearLayout>
MainActivity.java
package com.example.komunikator;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;
public class MainActivity extends Activity implements OnClickListener {
Serwer serwer;
Klient klient;
TextView tvWyswietl;
EditText etNapisz;
Button bStworz, bPolacz, bWyslij;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvWyswietl = (TextView) findViewById(R.id.tvTresc);
etNapisz = (EditText) findViewById(R.id.etZdanie);
bStworz = (Button) findViewById(R.id.bStworz);
bPolacz = (Button) findViewById(R.id.bPolacz);
bWyslij = (Button) findViewById(R.id.bWyslij);
bStworz.setOnClickListener(this);
bPolacz.setOnClickListener(this);
bWyslij.setOnClickListener(this);
serwer = new Serwer(tvWyswietl,etNapisz);
klient = new Klient("127.0.0.1");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bStworz:
serwer.startRunning();
//tvWyswietl.setText("start running");
break;
case R.id.bPolacz:
break;
case R.id.bWyslij:
break;
}
}
}
Serwer.java
Kod:
package com.example.komunikator;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Serwer {
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;
private TextView tvTresc;
private EditText etZdanie;
// constructor
public Serwer(TextView tvT, EditText etT) {
tvTresc = tvT;
etZdanie = etT;
}
// ustanowienie i uruchomienie serwera
public void startRunning() {
try {
tvTresc.append("\npróba \n");
server = new ServerSocket(6789, 100);
tvTresc.append("Serwer : " + String.valueOf(server));
while (true) {
tvTresc.append("próba 2");
try {
waitForConnection();
setupStreams();
whileChatting();
} catch (EOFException eofException) {
showMessage("\n Server zakończył połączenie");
} finally {
closeCrap();
tvTresc.setText("próba 3");
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
tvTresc.append("\npróba 4");
}
// wait for connection and display info
private void waitForConnection() throws IOException {
showMessage("Czekaj na połączenie...\n");
connection = server.accept();
showMessage("Jesteś połączony z "
+ connection.getInetAddress().getHostName());
}
// get string to send and receive data
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream());
output.flush();
input = new ObjectInputStream(connection.getInputStream());
showMessage("\n Strumień danych ustanowiony! \n");
}
// podczas połączenia
private void whileChatting() throws IOException {
String message = "Jesteś teraz połączony! ";
sendMessage(message);
ableToType(true);
do {
try {
message = (String) input.readObject();
showMessage("\n" + message);
} catch (ClassNotFoundException classNotFoundException) {
showMessage("\n Nie rozpoznaję tego typu ");
}
} while (!message.equals("CLIENT - END"));
}
// zamknięcie soketu i połączenia po zakończeniu
private void closeCrap() {
showMessage("\n zamykam połączenie... \n");
ableToType(false);
try {
output.close();
input.close();
connection.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
private void sendMessage(String message) {
try {
output.writeObject("SERVER - " + message);
output.flush();
showMessage("\nSERVER + " + message);
} catch (IOException ioException) {
tvTresc.append("\n Błąd : Nie mogę wysłać wiadomości! ");
}
}
private void showMessage(final String text) {
//tvTresc.setText("próba 9");
tvTresc.append(text);
}
// let the user type stuff to
private void ableToType(final boolean tof) {
/*
* SwingUtilities.invokeLater(new Runnable() {
*
* @Override public void run() { userText.setEditable(tof); } });
*/
}
}
Klient.java
Kod:
package com.example.komunikator;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Klient{
private ObjectOutputStream output;
private ObjectInputStream input;
private String message = "";
private String serverIP;
private Socket connection;
private TextView tvTresc;
private EditText etZdanie;
public Klient(String host) {
serverIP = host;
}
public void startRunning() {
// Połącz z serwerem
try {
connectToServer();
setupStreams();
whileChatting();
} catch (EOFException eofException) {
showMessage("\n Klient zakończył połączenie");
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
closeCrap();
}
}
// connect to server
private void connectToServer() throws IOException {
showMessage("Próbuje sie połączyć...\n");
connection = new Socket(InetAddress.getByName(serverIP), 6789);
showMessage("Połączony z : "
+ connection.getInetAddress().getHostName());
}
// ustawienie strumienia i odbiór wiadomości
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream());
output.flush();
input = new ObjectInputStream(connection.getInputStream());
showMessage("\n strumień gotowy");
}
// podczas przesyłania wiadomości
private void whileChatting() throws IOException {
//ableToType(true);
do {
try {
message = (String) input.readObject();
showMessage("\n" + message);
} catch (ClassNotFoundException classNotFoundException) {
showMessage("\n nie rozpoznaja typu");
}
} while (!message.equals("SERVER - END"));
}
//zamknięcie strumienia i soketu
private void closeCrap() {
showMessage("\n połączenie zakończone...");
ableToType(false);
try {
output.close();
input.close();
connection.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
// wysyłanie wiadomości do serwera
private void sendMessage(String message) {
try {
output.writeObject("CLIENT - " + message);
output.flush();
showMessage("\nCLIENT - " + message);
} catch (IOException ioException) {
tvTresc.append("\n cos poszło nie tak !");
}
}
// change / update chatWindow
private void showMessage(final String m) {
tvTresc.append(m);
/*
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
chatWindow.append(m);
}
});*/
}
// gives user permissions to type crap into the text box
private void ableToType(final boolean tof){
/*
SwingUtilities.invokeLater(
new Runnable() {
public void run(){
userText.setEditable(tof);
}
}
);*/
}
}
Technical Details
Message-ID:
<l0pbtl$k7b$1@news.icpnet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.icpnet.pl!.POSTED!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.icpnet.pl!.POSTED!not-for-mail From: "TheGuru" <theguru@wp.pl> Newsgroups: pl.comp.lang.java Subject: "Usieciowienie" gier Date: Wed, 11 Sep 2013 11:08:02 +0200 Organization: ICP News Server Lines: 406 Message-ID: <l0pbtl$k7b$1@news.icpnet.pl> NNTP-Posting-Host: c35-254.icpnet.pl Mime-Version: 1.0 X-Trace: news.icpnet.pl 1378890485 20715 62.21.35.254 (11 Sep 2013 09:08:05 GMT) X-Complaints-To: abuse@icpnet.pl NNTP-Posting-Date: Wed, 11 Sep 2013 09:08:05 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Newsreader: Microsoft Windows Live Mail 16.4.3508.205 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3508.205 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit