318 lines
8.2 KiB
Java
318 lines
8.2 KiB
Java
package chat;
|
|
|
|
import java.net.*;
|
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
|
import java.util.List;
|
|
import java.awt.event.*;
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
import chat.User;
|
|
import chat.Message;
|
|
|
|
class SendThread extends Thread {
|
|
String address;
|
|
Message message;
|
|
int port;
|
|
|
|
SendThread(Message in_message, String in_address, int in_port)
|
|
{
|
|
message = in_message;
|
|
address = in_address;
|
|
port = in_port;
|
|
}
|
|
public void run()
|
|
{
|
|
Socket link;
|
|
boolean connected = false;
|
|
ObjectOutputStream out;
|
|
|
|
while(!connected)
|
|
{
|
|
try
|
|
{
|
|
link = new Socket(address, port);
|
|
out = new ObjectOutputStream(link.getOutputStream());
|
|
out.writeObject(message);
|
|
connected = true;
|
|
}
|
|
catch(IOException e)
|
|
{
|
|
e.printStackTrace();
|
|
connected = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
class ReceiveThread extends Thread {
|
|
|
|
int port;
|
|
JTextArea displayArea;
|
|
List<User> known_users;
|
|
|
|
ReceiveThread(int in_port, JTextArea in_displayArea, List<User> in_known_users)
|
|
{
|
|
port = in_port;
|
|
displayArea = in_displayArea;
|
|
known_users = in_known_users;
|
|
}
|
|
public void run()
|
|
{
|
|
try
|
|
{
|
|
ServerSocket servSocket = new ServerSocket(port);
|
|
boolean exit = false;
|
|
|
|
while(!exit)
|
|
{
|
|
try
|
|
{
|
|
Socket link = servSocket.accept();
|
|
ObjectInputStream in = new ObjectInputStream(link.getInputStream());
|
|
Message message = (Message) in.readObject();
|
|
if(message.getText() != null)
|
|
{
|
|
displayArea.append(message.getAuthor() + " : " + message.getText() + "\n");
|
|
}
|
|
else
|
|
{
|
|
displayArea.append(message.getAuthor() + " has left the chat.\n");
|
|
for(int i = 0;i < known_users.size();i ++)
|
|
{
|
|
if (known_users.get(i).getName().equals(message.getAuthor()))
|
|
known_users.remove(i);
|
|
}
|
|
}
|
|
displayArea.setCaretPosition(displayArea.getDocument().getLength());
|
|
link.close();
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
catch(IOException e)
|
|
{
|
|
System.out.println("nik2 !");
|
|
}
|
|
}
|
|
}
|
|
|
|
class ConnectionListenerThread extends Thread {
|
|
JTextArea displayArea;
|
|
List<User> known_users;
|
|
|
|
ConnectionListenerThread(List<User> in_known_users, JTextArea in_displayArea)
|
|
{
|
|
known_users = in_known_users;
|
|
displayArea = in_displayArea;
|
|
}
|
|
public void run()
|
|
{
|
|
boolean exit = false;
|
|
boolean accepted = true;
|
|
byte[] buffer = new byte[100];
|
|
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
|
|
DatagramPacket responsePacket;
|
|
|
|
DatagramSocket requestSocket;
|
|
DatagramSocket responseSocket;
|
|
|
|
ByteArrayOutputStream bStream;
|
|
ObjectOutput oo;
|
|
|
|
String username;
|
|
|
|
byte[] response1;
|
|
try
|
|
{
|
|
requestSocket = new DatagramSocket(1234);
|
|
responseSocket = new DatagramSocket();
|
|
|
|
while(!exit)
|
|
{
|
|
try
|
|
{
|
|
bStream = new ByteArrayOutputStream();
|
|
oo = new ObjectOutputStream(bStream);
|
|
|
|
System.out.println("Waiting for connection request");
|
|
requestSocket.receive(request);
|
|
username = new String(request.getData(), 0, request.getLength());
|
|
InetAddress clientAddress= request.getAddress();
|
|
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
|
|
System.out.println("Response:");
|
|
|
|
for(User user:known_users)
|
|
{
|
|
System.out.println(user.getName() + ":" + user.getAddress());
|
|
}
|
|
oo.writeObject(known_users);
|
|
response1 = bStream.toByteArray();
|
|
responsePacket = new DatagramPacket(response1, response1.length, clientAddress, 1337);
|
|
responseSocket.send(responsePacket);
|
|
|
|
accepted = true;
|
|
for(User a:known_users)
|
|
{
|
|
accepted = accepted && (!username.equals(a.getName()));
|
|
}
|
|
if(accepted)
|
|
{
|
|
known_users.add(new User(username, clientAddress.getHostAddress()));
|
|
displayArea.append(username + " has joined the chat.\n");
|
|
displayArea.setCaretPosition(displayArea.getDocument().getLength());
|
|
}
|
|
else
|
|
{
|
|
System.out.println("Username already taken");
|
|
}
|
|
}
|
|
catch(SocketTimeoutException e) {}
|
|
}
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
System.out.println(e.getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
public class NetworkClient {
|
|
private User user;
|
|
private List<User> known_users;
|
|
private JTextArea chatText;
|
|
|
|
static String getLocalIP() {
|
|
String ip = "";
|
|
try(final DatagramSocket socket = new DatagramSocket()){
|
|
socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
|
|
ip = socket.getLocalAddress().getHostAddress();
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
System.out.println("niiiiiiiikkk");
|
|
}
|
|
return ip;
|
|
}
|
|
|
|
NetworkClient(JTextArea in_chatText)
|
|
{
|
|
user = new User("", "");
|
|
chatText = in_chatText;
|
|
known_users = new ArrayList<User>();
|
|
}
|
|
|
|
boolean connect(String username)
|
|
{
|
|
boolean nameAvailable = true;
|
|
boolean connected = false;
|
|
DatagramSocket connectionSocket;
|
|
DatagramSocket userListSocket;
|
|
|
|
DatagramPacket connectionRequest;
|
|
DatagramPacket userListPacket;
|
|
|
|
ObjectInputStream userListStream;
|
|
|
|
ArrayList<User> userList;
|
|
|
|
byte[] buffer1 = new byte[20000];
|
|
|
|
if(username == null || username.compareTo("") == 0)
|
|
return false;
|
|
|
|
try
|
|
{
|
|
connectionSocket = new DatagramSocket();
|
|
userListSocket = new DatagramSocket(1337);
|
|
|
|
userListSocket.setSoTimeout(500);
|
|
|
|
connectionRequest = new DatagramPacket(username.getBytes(), username.length(),
|
|
InetAddress.getByName("25.255.255.255"), 1234);
|
|
System.out.println("Sending connection request");
|
|
connectionSocket.send(connectionRequest);
|
|
|
|
try
|
|
{
|
|
userListPacket = new DatagramPacket(buffer1, buffer1.length);
|
|
|
|
System.out.println("Waiting for reply");
|
|
userListSocket.receive(userListPacket);
|
|
System.out.println("Received a reply from " + userListPacket.getAddress().getHostAddress());
|
|
|
|
userListStream = new ObjectInputStream(new ByteArrayInputStream(userListPacket.getData()));
|
|
|
|
userList = (ArrayList<User>) userListStream.readObject();
|
|
|
|
for(User a:userList)
|
|
{
|
|
nameAvailable = nameAvailable && (!username.equals(a.getName()));
|
|
}
|
|
if(nameAvailable)
|
|
{
|
|
System.out.println(userList.size() + " users currently connected");
|
|
for(int i = 0;i < userList.size();i ++)
|
|
{
|
|
System.out.println(userList.get(i).getName() + " : " + userList.get(i).getAddress());
|
|
known_users.add(userList.get(i));
|
|
}
|
|
known_users.add(new User(username, "25.67.234.235"));
|
|
connected = true;
|
|
}
|
|
}
|
|
catch(SocketTimeoutException e)
|
|
{
|
|
known_users.add(new User(username, "25.67.234.235"));
|
|
System.out.println("Reply timed out");
|
|
connected = true;
|
|
}
|
|
|
|
connectionSocket.close();
|
|
userListSocket.close();
|
|
}
|
|
catch (SocketException e2)
|
|
{
|
|
System.out.println(e2.getMessage());
|
|
}
|
|
catch (Exception e3)
|
|
{
|
|
System.out.println(e3.getMessage());
|
|
}
|
|
|
|
if(connected)
|
|
{
|
|
user.setName(username);
|
|
|
|
chatText.append(username + " has joined the chat.\n");
|
|
chatText.setCaretPosition(chatText.getDocument().getLength());
|
|
|
|
ReceiveThread t2 = new ReceiveThread(1237, chatText, known_users);
|
|
|
|
ConnectionListenerThread t3 = new ConnectionListenerThread(known_users, chatText);
|
|
t2.start();
|
|
t3.start();
|
|
}
|
|
|
|
return connected;
|
|
}
|
|
|
|
void send (String message)
|
|
{
|
|
for(User recipient:known_users)
|
|
{
|
|
SendThread t1 = new SendThread(new Message(user.getName(), message), recipient.getAddress(), 1237);
|
|
t1.start();
|
|
}
|
|
}
|
|
}
|