Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class MultiThreadServer {
- public static void main (String [] args) throws Exception {
- DatagramSocket serverSocket = new DatagramSocket(6666);
- while (true) {
- byte[] receiveData = new byte[1024];
- byte[] sendData = new byte[1024];
- DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
- serverSocket.receive(receivePacket);
- String message = new String(receivePacket.getData());
- InetAddress clientAddress = receivePacket.getAddress();
- int clientPort = receivePacket.getPort();
- // Create a new thread to handle the client connection
- Thread t = new Thread(new ClientHandler(clientAddress, clientPort));
- t.start();
- }
- }
- }
- public class ClientHandler implements Runnable {
- private static List<Integer> usedPorts = new ArrayList<>();
- private DatagramSocket socket;
- private InetAddress clientAddress;
- private int clientPort;
- public ClientHandler(InetAddress clientAddress, int clientPort) throws Exception {
- this.clientAddress = clientAddress;
- this.clientPort = clientPort;
- this.socket = getSocket();
- }
- public DatagramSocket getSocket() throws SocketException {
- int port = 0;
- do {
- port = 6666 + (int)(Math.random()*2222);
- } while(usedPorts.contains(port));
- return new DatagramSocket(port);
- }
- public void run() {
- try {
- send("HELLO");
- while(true) {
- String text = new String(receive());
- send(text);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void send(String msg) throws IOException {
- DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, clientAddress, clientPort);
- socket.send(packet);
- }
- private byte[] receive() throws IOException {
- byte[] buffer = new byte[1024];
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
- socket.receive(packet);
- return packet.getData();
- }
- }
- public class Client {
- private int myPort = 4444+(int)(Math.random()*4444); // to be able to run few clients on same OS
- private int remotePort = 6666;
- private DatagramSocket socket;
- public static void main(String[] args) throws IOException {
- new Client().go();
- }
- private void go() throws IOException {
- System.out.println("My port is " + myPort);
- this.socket = new DatagramSocket(myPort);
- remotePort = getConnection(socket);
- System.out.println("Received remote port is " + remotePort);
- Scanner scanner = new Scanner(System.in);
- String line = scanner.nextLine();
- while (!line.equals("q")) {
- send(line);
- String response = new String(receive());
- System.out.println(response);
- line = scanner.nextLine();
- }
- socket.close();
- }
- private int getConnection(DatagramSocket socket) throws IOException {
- // sending first message on server
- String msg = "HELLO";
- InetAddress remoteAddress = InetAddress.getLocalHost();
- DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, remoteAddress, remotePort);
- socket.send(packet);
- // getting first message from server and returning the port
- byte[] buffer = new byte[1024];
- DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
- socket.receive(receivePacket);
- return receivePacket.getPort();
- }
- private void send(String msg) throws IOException {
- DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), remotePort);
- socket.send(packet);
- }
- private byte[] receive() throws IOException {
- byte[] buffer = new byte[1024];
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
- socket.receive(packet);
- return packet.getData();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment