[英]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.