小编典典
对于成熟的服务器,不建议使用以下答案,因此您应该将Java EE与servlet,Web服务等配合使用。
仅在少数几台计算机希望连接以执行特定任务的情况下才使用此方法,并且使用简单的Java套接字不是普遍问题。想想分布式计算或多人游戏。
编辑:
自从第一篇博文以来,我已经大大更新了此架构,现在已经过测试并且是线程安全的。任何需要它的人都可以在这里下载它。
只需使用(直接或通过子类化)Server和Client,start()它们便已准备就绪。阅读内联注释以获得更强大的选项。
尽管客户端之间的通信非常复杂,但我将尽可能简化它。
这是服务器中的要点:
保留已连接客户端的列表。
定义一个线程,用于服务器输入。
定义接收消息的队列。
从队列中轮询线程,并对其进行处理。
用于发送消息的一些实用方法。
对于客户:
定义一个线程,供客户输入。
定义接收消息的队列。
从队列中轮询线程,并对其进行处理。
这是Server类:
public class Server {
private ArrayList clientList;
private LinkedBlockingQueue messages;
private ServerSocket serverSocket;
public Server(int port) {
clientList = new ArrayList();
messages = new LinkedBlockingQueue();
serverSocket = new ServerSocket(port);
Thread accept = new Thread() {
public void run(){
while(true){
try{
Socket s = serverSocket.accept();
clientList.add(new ConnectionToClient(s));
}
catch(IOException e){ e.printStackTrace(); }
}
}
};
accept.setDaemon(true);
accept.start();
Thread messageHandling = new Thread() {
public void run(){
while(true){
try{
Object message = messages.take();
// Do some handling here...
System.out.println("Message Received: " + message);
}
catch(InterruptedException e){ }
}
}
};
messageHandling.setDaemon(true);
messageHandling.start();
}
private class ConnectionToClient {
ObjectInputStream in;
ObjectOutputStream out;
Socket socket;
ConnectionToClient(Socket socket) throws IOException {
this.socket = socket;
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream(socket.getOutputStream());
Thread read = new Thread(){
public void run(){
while(true){
try{
Object obj = in.readObject();
messages.put(obj);
}
catch(IOException e){ e.printStackTrace(); }
}
}
};
read.setDaemon(true); // terminate when main ends
read.start();
}
public void write(Object obj) {
try{
out.writeObject(obj);
}
catch(IOException e){ e.printStackTrace(); }
}
}
public void sendToOne(int index, Object message)throws IndexOutOfBoundsException {
clientList.get(index).write(message);
}
public void sendToAll(Object message){
for(ConnectionToClient client : clientList)
client.write(message);
}
}
这里是Client类:
public class Client {
private ConnectionToServer server;
private LinkedBlockingQueue messages;
private Socket socket;
public Client(String IPAddress, int port) throws IOException{
socket = new Socket(IPAddress, port);
messages = new LinkedBlokingQueue();
server = new ConnecionToServer(socket);
Thread messageHandling = new Thread() {
public void run(){
while(true){
try{
Object message = messages.take();
// Do some handling here...
System.out.println("Message Received: " + message);
}
catch(InterruptedException e){ }
}
}
};
messageHandling.setDaemon(true);
messageHandling.start();
}
private class ConnectionToServer {
ObjectInputStream in;
ObjectOutputStream out;
Socket socket;
ConnectionToServer(Socket socket) throws IOException {
this.socket = socket;
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream(socket.getOutputStream());
Thread read = new Thread(){
public void run(){
while(true){
try{
Object obj = in.readObject();
messages.put(obj);
}
catch(IOException e){ e.printStackTrace(); }
}
}
};
read.setDaemon(true);
read.start();
}
private void write(Object obj) {
try{
out.writeObject(obj);
}
catch(IOException e){ e.printStackTrace(); }
}
}
public void send(Object obj) {
server.write(obj);
}
}
2020-09-11