code:
Клиентский код:
Код: Выделить всё
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
if (args.length != 2){
System.err.println("You muse specify a valid IP and username!");
System.exit(1);
}
String username = args[1];
try (Socket socket = new Socket(args[0], 31337); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in))) {
out.println(username+" has connected");
Thread readInput = new Thread(new ClientThread(in));
readInput.start();
String message;
while(true) {
if ((message = stdin.readLine()) != null) {
if (message.equals("exit")) {
out.println(new JSONObject().put("COMMAND","EXIT").put("USERNAME",username).toString());
System.exit(1);
} else {
out.println((new JSONObject().put("COMMAND","CHAT").put("USERNAME",username).put("ARG1",message)).toString());
System.out.println((new JSONObject().put("COMMAND","CHAT").put("USERNAME",username).put("ARG1",message)).toString());
}
}
}
}
}
}
< /code>
import org.json.JSONObject;
import java.io.BufferedReader;
public class ClientThread implements Runnable{
BufferedReader in;
static String message;
public ClientThread(BufferedReader in){
this.in = new BufferedReader(in);
}
@Override
public void run() {
while (true) {
try {
if ((message = in.readLine()) != null) {
System.out.println(message);
if ((new JSONObject(message).get("COMMAND")).equals("SERVER_CLOSED")){
System.out.println("Server closed by host.");
System.exit(1);
} else if ((new JSONObject(message).get("COMMAND")).equals("CHAT")){
System.out.println("["+new JSONObject(message).get("USERNAME").toString()+"] : "+new JSONObject(message).get("ARG1").toString());
}
}
} catch (Exception ignored) {
}
}
}
}
< /code>
код сервера: < /p>
import org.json.JSONObject;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
public static List clientList=new ArrayList();
public synchronized void broadcastMessageToAllClients(String username,String message){
for(ThreadedConnection tc: clientList)
tc.sendMessage(new JSONObject().put("COMMAND","CHAT").put("USERNAME",username).put("ARG1",message).toString());
}
public synchronized void broadcastCommandToAllClients(String command){
for(ThreadedConnection tc: clientList)
tc.sendMessage(new JSONObject().put("COMMAND",command).toString());
}
public static void main(String[] args) {
try {
Server server=new Server();
ServerSocket serverSocket = new ServerSocket(31337);
BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in));
Thread serverInput = new Thread(new ServerInput(consoleIn, server));
serverInput.start();
while (true) {
Socket socket = serverSocket.accept();
ThreadedConnection threadedServer = new ThreadedConnection(socket, server);
clientList.add(threadedServer);
Thread thread = new Thread(threadedServer);
System.out.println("Client connected with IP "+socket.getInetAddress().getHostName());
thread.start();
}
} catch (Exception e) {
System.out.println("An error occured.");
}
}
}
< /code>
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ThreadedConnection implements Runnable {
private final Server server;
private final Socket socket;
private PrintWriter out;
public String IP;
public ThreadedConnection(Socket socket, Server server) {
this.socket = socket;
this.server = server;
IP = socket.getInetAddress().getHostName();
}
@Override
public void run() {
try {
out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while(true) {
if ((message = in.readLine()) != null){
System.out.println(message);
if (((new JSONObject(message).getString("COMMAND")).equals("CHAT"))){
server.broadcastMessageToAllClients(new JSONObject(message).get("USERNAME").toString(),new JSONObject(message).get("ARG1").toString());
System.out.println("["+new JSONObject(message).get("USERNAME").toString()+"] : " + new JSONObject(message).get("ARG1").toString());
}
}
}
} catch (Exception ignored) {
}
}
public void sendMessage(String message){
out.println(message);
}
}
< /code>
import java.io.BufferedReader;
import java.io.IOException;
public class ServerInput implements Runnable{
String consoleMessage;
BufferedReader in;
Server server;
public ServerInput(BufferedReader in, Server server){
this.in = in;
this.server = server;
}
@Override
public void run() {
while (true) {
try {
if ((consoleMessage = in.readLine()) != null) {
if (consoleMessage.equals("exit")) {
server.broadcastCommandToAllClients("SERVER_CLOSED");
System.exit(1);
} else {
server.broadcastMessageToAllClients("SERVER",consoleMessage);
System.out.println("[SERVER] : " + consoleMessage);
}
}
} catch (IOException ignored) {
}
}
}
}
< /code>
Похоже, что мой код должен работать, но я получаю результат ниже (простое текстовое сообщение было отправлено на сервер, чтобы показать странность): < /p>
(server)
java -jar IdeaProjects/Server1/out/artifacts/Server1_jar/Server1.jar
Client connected with IP localhost
Hamadr4x has connected
I can't hear you
[SERVER] : I can't hear you
exit
(client)
java -jar IdeaProjects/Client1/out/artifacts/Client1_jar/Client1.jar localhost Hamadr4x
hello
{"ARG1":"hello","USERNAME":"Hamadr4x","COMMAND":"CHAT"}
{"ARG1":"I can't hear you","USERNAME":"SERVER","COMMAND":"CHAT"}
[SERVER] : I can't hear you
{"COMMAND":"SERVER_CLOSED"}
Server closed by host.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -way-round