簡體   English   中英

Java聯網

[英]Java networking

我正在使用Socket制作一個簡單的網絡。

它工作正常,但問題是它像棋盤游戲一樣工作

每次服務器必須等待客戶端時,客戶端都會等待服務器,依此類推。

每當我從任何一側輸入數據時,我都希望將數據從服務器發送到客戶端以及從客戶端發送到服務器。

這是我在服務器中的代碼的一部分

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

一句話:線程 您的應用程序在每一端都需要多個線程。 特別是,應該有線程專門用於在每一端維護傳入和傳出消息的隊列,以便想要發送或接收消息的代碼不必等待。

這是一個非常大的話題——我無法真正告訴你具體該怎么做。 我推薦 Java 教程的並發章節開始。

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();
}
}

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

客戶端.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();
}
}

每當我從任何一側輸入數據時,我都希望將數據從服務器發送到客戶端以及從客戶端發送到服務器。

為了實現上述目的,您需要您的客戶端和服務器都是multi-threaded 因此,雖然每一側的一個線程偵聽來自另一對等體的數據,但消息的處理實際上是由另一個線程完成的。

如果您之前沒有使用任何語言進行多線程編程,這可能是一項艱巨的任務,所以下面是一個開始的鏈接:

多線程客戶端/服務器應用程序

然后你可以 go 到以下鏈接以獲得更好的構建游戲的想法:

網絡編程示例:網絡游戲框架

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM