Мой последний проект для класса - собрать игру, в том числе многопользовательскую. Поэтому я начал пытаться выяснить, как создать java-сеть, и я как бы застрял.Java Networking - клиент/сервер
Каждый из двух игровых клиентов должен иметь возможность отправлять и получать сообщения от другого клиента.
Как я понял, я бы справился с этим, так это то, что у меня есть объекты NetworkServer и NetworkClient, которые работают в своих потоках.
Я думал, что я бы просто начать их от моего основного приложения игры, но я хотел бы сделать некоторые испытания первой, поэтому я этот проект до:
NetworkClient:
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
public class NetworkClient extends Thread {
Socket server;
ObjectOutputStream out;
Timer timer;
public NetworkClient(String hostname, int port) throws IOException
{
server = new Socket(hostname, port);
out = new ObjectOutputStream(server.getOutputStream());
timer = new Timer();
timer.schedule(new SendTask(), 0, 1*1000);
}
public void sendData(Integer b) throws IOException {
out.writeObject(b);
}
class SendTask extends TimerTask {
Integer i = new Integer(1);
public void run() {
System.out.println("Client: Sending Integer: " + i.toString());
try {
sendData(i);
i = new Integer(i.intValue()+1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // run()
} // class SendTask
}
NetworkServer:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class NetworkServer extends Thread {
private ServerSocket serverSocket;
private Socket client;
private Integer i;
private ObjectInputStream in;
public NetworkServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
//serverSocket.setSoTimeout(10000);
}
public void run()
{
try {
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
client = serverSocket.accept();
System.out.println("Just connected to " + client.getRemoteSocketAddress());
in = new ObjectInputStream(client.getInputStream());
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
while(true)
{
try
{
i = (Integer) in.readObject();
System.out.println("Server: Received the integer: " + i.toString());
}
catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}
catch(IOException e)
{
e.printStackTrace();
try { client.close();} catch (IOException e1) {}
break;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Сеть (Дело в том, я использую, чтобы попытаться проверить это):
import java.io.IOException;
public class Network {
NetworkClient client;
NetworkServer server;
public Network() throws IOException {
server = new NetworkServer(6066);
server.start();
client = new NetworkClient("192.168.1.196", 6066);
client.start();
}
public static void main(String [] args)
{
try
{
Network n = new Network();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
У меня есть таймер в там, чтобы облегчить отправку данных от клиента к серверу, который обычно делается с помощью моей игры, но так как Я тестирую, мне нужно было как-то отправить его.
Когда я запускаю это, когда клиент и сервер разговаривают друг с другом, я получаю как отправленные, так и полученные сообщения.
Когда я положил его на свой ноутбук (и изменил IP-адрес в NetworkClient в соответствии с моим рабочим столом и наоборот на своем рабочем столе) и запустил его в обоих местах, клиент на рабочем столе отправляет серверу на ноутбук, но клиент на ноутбуке не отправляет сервер на рабочий стол.
И в какой-то момент во время работы я получаю исключение из-за того, что соединение клиента сбрасывается одноранговым узлом, хотя рабочее соединение клиент/сервер продолжается.
Итак, я думаю, мой вопрос: кто-нибудь знает, почему он работает в одном направлении, но не двунаправленно?
FIXED !!
Редактировать: Gah, я понял это. Это связано с сроками запуска двух серверов.
Я изменил сеть для:
import java.io.IOException;
public class Network {
NetworkClient client;
NetworkServer server;
public Network() throws IOException {
startServer();
startClient();
}
private void startServer() throws IOException {
server = new NetworkServer(6066);
server.start();
}
private void startClient(){
boolean isConnected = false;
while (!isConnected) {
try {
client = new NetworkClient("192.168.1.196", 6066);
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
continue;
}
isConnected = true;
}
client.start();
}
public static void main(String [] args)
{
try
{
Network n = new Network();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Я был уверен, что уже сделал это, но я все равно прошел проверку. java.exe имеет разрешения брандмауэра для входящих и исходящих, а порт 6066 открыт – user677786
Я также добавил вывод двух компьютеров, если это вообще помогает :) – user677786