Java сеть - PullRequest
       23

Java сеть

0 голосов
/ 09 июня 2011

Я создаю простую сеть, используя Socket.

Работает нормально, но проблема в том, что он работает как настольная игра

Каждый раз, когда серверу приходится ждать клиента, клиент будет ждать сервера и т. Д.

Я хочу, чтобы данные отправлялись с сервера на клиент и с клиента на сервер всякий раз, когда я вводил данные с любой стороны.

Вот часть моего кода на сервере

in = Integer.parseInt(myInputStream.readLine())); // server gets data
out = new Scanner(System.in).nextInt(); 
myOutputStream.println(column);  // server sends data

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Одним словом: Темы .Ваше приложение нуждается в нескольких потоках на каждом конце.В частности, должны быть потоки, предназначенные для обслуживания очередей входящих и исходящих сообщений на каждом конце, так что код, желающий отправить или получить сообщение, не должен ждать.

Это очень большая тема -Я не могу действительно показать вам, что делать.Я бы порекомендовал начать изучение Concurrency Java Tutorial.

0 голосов
/ 28 февраля 2014
Server.java


import java.io.*;

import java.net.*;

public class Server implements Runnable {

String messageIN, messageOUT;
Thread t1 = null, t2 = null;
BufferedReader b1, b2;
ServerSocket ss;
Socket s;
PrintWriter p1;

Server() {
    try {
        ss = new ServerSocket(8000);
        System.out.println();
        System.out.println("Server is Waiting . . . . . ");
        s = ss.accept();
        System.out.println();
        System.out.println("Client Connected ! ! ! ");
        t1 = new Thread(this);
        t2 = new Thread(this);
        t1.start();
        t2.start();
    } catch (Exception e) {
        System.out.println(e);
    }
}
//----------------------------------------------------------------------------------------

public void run() {

    if (Thread.currentThread() == t1) {
        try {
            b1 = new BufferedReader(new InputStreamReader(System.in));
            p1 = new PrintWriter(s.getOutputStream(), true);

            do {
                System.out.println();
                messageIN = b1.readLine();
                System.out.println("Server Says : : : "+messageIN);
                p1.println(messageIN);
            } while (!messageIN.equals("END"));
        } catch (Exception ex) {
        }


    } else {
        try {
            b2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
            do {
                messageOUT = b2.readLine();
                System.out.println("Client Says : : : " + messageOUT);
                System.out.println();
            } while (!messageOUT.equals("END"));
        } catch (Exception e) {
        }
    }
}
//----------------------------------------------------------------------------------------

public static void main(String[] args) {
    new Server();
}
}

//-----------------------------------------------------------------------------------------

Client.java

import java.io.*;
import java.net.*;



 public class Client implements Runnable {

String messageIN, messageOUT;
Thread thread1 = null, thread2 = null;
BufferedReader br1, br2;
Socket s;
PrintWriter pw;

Client() {
    try {
        System.out.println();
        System.out.println("Going to connect to Server");
        s = new Socket("localhost", 8000);
        System.out.println();
        System.out.println("Connected");
        thread1 = new Thread(this);
        thread2 = new Thread(this);
        thread1.start();
        thread2.start();
    } catch (Exception ex) {
        System.out.println("ex = " + ex);
    }
    }
   //-----------------------------------------------------------------------------------------

  public void run() {
    if (Thread.currentThread() == thread2) {
        try {
            br1 = new BufferedReader(new InputStreamReader(System.in));

            do {
                System.out.println();                    
                messageIN = br1.readLine();
                System.out.println("Client Says : : "+messageIN);
                pw = new PrintWriter(s.getOutputStream(), true);
                pw.println(messageIN);
            } while (!messageIN.equals("END"));
        } catch (Exception ex) {
        }



    } else {
        try {
            do {
                br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
                messageOUT = br2.readLine();
                System.out.println("Server Says : : : " + messageOUT);
                System.out.println();
            } while (!messageOUT.equals("END"));

        } catch (Exception e) {
        }

    }
 }

//----------------------------------------------------------------------------------------  
public static void main(String[] args) {
    new Client();
}
}
0 голосов
/ 09 июня 2011

я хочу, чтобы данные отправлялись с сервера клиенту и от клиента к серверу всякий раз, когда я ввожу данные с любой стороны ..

Чтобы достичь вышеизложенного, вам нужно, чтобы ваш клиент и сервер были multi-threaded. Таким образом, хотя один поток на каждой стороне прослушивает данные, поступающие от другого партнера, обработка сообщения фактически выполняется другим потоком.

Если вы еще не занимались многопоточным программированием на каком-либо языке, прежде чем это могло бы стать сложной задачей, поэтому ниже приведена ссылка для начала:

Многопоточные клиент / серверные приложения

Тогда вы можете перейти по следующей ссылке для лучшего понимания структуры вашей игры:

Пример сетевого программирования: сетевая игровая платформа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...