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