changement du système de connection TCP pour les messages: gestion d'une connection TCP permanente par utilisateur plutôt qu'une connection par message
这个提交包含在:
父节点
f45cfe2d1a
当前提交
b91f7a1c10
共有 3 个文件被更改,包括 159 次插入 和 129 次删除
|
@ -13,8 +13,6 @@ import java.util.*;
|
||||||
import chat.User;
|
import chat.User;
|
||||||
|
|
||||||
public class ClientWindow implements ActionListener {
|
public class ClientWindow implements ActionListener {
|
||||||
|
|
||||||
|
|
||||||
JFrame chatWindow;
|
JFrame chatWindow;
|
||||||
|
|
||||||
JPanel chatPanel;
|
JPanel chatPanel;
|
||||||
|
|
|
@ -14,41 +14,41 @@ import java.util.*;
|
||||||
import chat.User;
|
import chat.User;
|
||||||
import chat.Message;
|
import chat.Message;
|
||||||
|
|
||||||
class SendThread extends Thread {
|
//class SendThread extends Thread {
|
||||||
String address;
|
// String address;
|
||||||
Message message;
|
// Message message;
|
||||||
int port;
|
// int port;
|
||||||
|
//
|
||||||
SendThread(Message in_message, String in_address, int in_port)
|
// SendThread(Message in_message, String in_address, int in_port)
|
||||||
{
|
// {
|
||||||
message = in_message;
|
// message = in_message;
|
||||||
address = in_address;
|
// address = in_address;
|
||||||
port = in_port;
|
// port = in_port;
|
||||||
}
|
// }
|
||||||
public void run()
|
// public void run()
|
||||||
{
|
// {
|
||||||
Socket link;
|
// Socket link;
|
||||||
boolean connected = false;
|
// boolean connected = false;
|
||||||
ObjectOutputStream out;
|
// ObjectOutputStream out;
|
||||||
|
//
|
||||||
while(!connected)
|
// while(!connected)
|
||||||
{
|
// {
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
link = new Socket(address, port);
|
// link = new Socket(address, port);
|
||||||
out = new ObjectOutputStream(link.getOutputStream());
|
// out = new ObjectOutputStream(link.getOutputStream());
|
||||||
out.writeObject(message);
|
// out.writeObject(message);
|
||||||
connected = true;
|
// connected = true;
|
||||||
}
|
// }
|
||||||
catch(IOException e)
|
// catch(IOException e)
|
||||||
{
|
// {
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
connected = false;
|
// connected = false;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
class ReceiveThread extends Thread {
|
class ReceiveThread extends Thread {
|
||||||
|
|
||||||
|
@ -69,14 +69,24 @@ class ReceiveThread extends Thread {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ServerSocket servSocket = new ServerSocket(port);
|
ServerSocket servSocket = new ServerSocket(port);
|
||||||
|
Socket link;
|
||||||
boolean exit = false;
|
boolean exit = false;
|
||||||
|
boolean connected = false;
|
||||||
|
|
||||||
|
while(!connected)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
link = servSocket.accept();
|
||||||
|
connected = true;
|
||||||
|
|
||||||
while(!exit)
|
while(!exit)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Socket link = servSocket.accept();
|
System.out.println("Waiting for a message");
|
||||||
ObjectInputStream in = new ObjectInputStream(link.getInputStream());
|
ObjectInputStream in = new ObjectInputStream(link.getInputStream());
|
||||||
|
System.out.println("Received a message");
|
||||||
Message message = (Message) in.readObject();
|
Message message = (Message) in.readObject();
|
||||||
if(message.getText() != null)
|
if(message.getText() != null)
|
||||||
{
|
{
|
||||||
|
@ -85,27 +95,27 @@ class ReceiveThread extends Thread {
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
displayArea.append(message.getAuthor() + " has left the chat.\n");
|
displayArea.append(message.getAuthor() + " has left the chat.\n");
|
||||||
for(int i = 0;i < known_users.size();i ++)
|
known_users.remove(new User(message.getAuthor()));
|
||||||
{
|
|
||||||
if (known_users.get(i).getName().equals(message.getAuthor()))
|
|
||||||
known_users.remove(i);
|
|
||||||
}
|
|
||||||
knownUsersPanel.setText("");
|
knownUsersPanel.setText("");
|
||||||
knownUsersPanel.append("Online:\n");
|
knownUsersPanel.append("Online:\n");
|
||||||
for(User a:known_users)
|
for(User u:known_users)
|
||||||
{
|
{
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
knownUsersPanel.append(" " + u.getName() + " \n");
|
||||||
}
|
}
|
||||||
|
exit = true;
|
||||||
}
|
}
|
||||||
displayArea.setCaretPosition(displayArea.getDocument().getLength());
|
displayArea.setCaretPosition(displayArea.getDocument().getLength());
|
||||||
link.close();
|
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch(Exception e)
|
||||||
{
|
{
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
link.close();
|
||||||
|
servSocket.close();
|
||||||
|
}
|
||||||
|
catch(SocketTimeoutException e) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch(IOException e)
|
catch(IOException e)
|
||||||
{
|
{
|
||||||
|
@ -118,10 +128,12 @@ class ConnectionListenerThread extends Thread {
|
||||||
JTextArea displayArea;
|
JTextArea displayArea;
|
||||||
JTextArea knownUsersPanel;
|
JTextArea knownUsersPanel;
|
||||||
List<User> known_users;
|
List<User> known_users;
|
||||||
|
List<Socket> dest_sockets;
|
||||||
|
|
||||||
ConnectionListenerThread(List<User> in_known_users, JTextArea in_displayArea, JTextArea in_knownUsersPanel)
|
ConnectionListenerThread(List<User> in_known_users, List<Socket> in_dest_sockets, JTextArea in_displayArea, JTextArea in_knownUsersPanel)
|
||||||
{
|
{
|
||||||
known_users = in_known_users;
|
known_users = in_known_users;
|
||||||
|
dest_sockets = in_dest_sockets;
|
||||||
displayArea = in_displayArea;
|
displayArea = in_displayArea;
|
||||||
knownUsersPanel = in_knownUsersPanel;
|
knownUsersPanel = in_knownUsersPanel;
|
||||||
}
|
}
|
||||||
|
@ -136,12 +148,10 @@ class ConnectionListenerThread extends Thread {
|
||||||
DatagramSocket requestSocket;
|
DatagramSocket requestSocket;
|
||||||
DatagramSocket responseSocket;
|
DatagramSocket responseSocket;
|
||||||
|
|
||||||
ByteArrayOutputStream bStream;
|
|
||||||
ObjectOutput oo;
|
|
||||||
|
|
||||||
String username;
|
String username;
|
||||||
|
String response = "";
|
||||||
|
|
||||||
byte[] response1;
|
byte[] responseBytes;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
requestSocket = new DatagramSocket(1234);
|
requestSocket = new DatagramSocket(1234);
|
||||||
|
@ -151,23 +161,24 @@ class ConnectionListenerThread extends Thread {
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
bStream = new ByteArrayOutputStream();
|
|
||||||
oo = new ObjectOutputStream(bStream);
|
|
||||||
|
|
||||||
System.out.println("Waiting for connection request");
|
System.out.println("Waiting for connection request");
|
||||||
requestSocket.receive(request);
|
requestSocket.receive(request);
|
||||||
username = new String(request.getData(), 0, request.getLength());
|
username = new String(request.getData(), 0, request.getLength());
|
||||||
InetAddress clientAddress= request.getAddress();
|
InetAddress clientAddress= request.getAddress();
|
||||||
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
|
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
|
||||||
System.out.println("Response:");
|
|
||||||
|
|
||||||
for(User user:known_users)
|
for(User u:known_users)
|
||||||
{
|
{
|
||||||
System.out.println(user.getName() + ":" + user.getAddress());
|
response += u.getName() + " ";
|
||||||
}
|
}
|
||||||
oo.writeObject(known_users);
|
response += ";";
|
||||||
response1 = bStream.toByteArray();
|
for(Socket s:dest_sockets)
|
||||||
responsePacket = new DatagramPacket(response1, response1.length, clientAddress, 1337);
|
{
|
||||||
|
response += s.getInetAddress() + " ";
|
||||||
|
}
|
||||||
|
System.out.println("Response :" + response);
|
||||||
|
responseBytes = response.getBytes();
|
||||||
|
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337);
|
||||||
responseSocket.send(responsePacket);
|
responseSocket.send(responsePacket);
|
||||||
|
|
||||||
accepted = true;
|
accepted = true;
|
||||||
|
@ -177,7 +188,10 @@ class ConnectionListenerThread extends Thread {
|
||||||
}
|
}
|
||||||
if(accepted)
|
if(accepted)
|
||||||
{
|
{
|
||||||
known_users.add(new User(username, clientAddress.getHostAddress()));
|
ReceiveThread next = new ReceiveThread(1237, displayArea, known_users, knownUsersPanel);
|
||||||
|
next.start();
|
||||||
|
|
||||||
|
known_users.add(new User(username));
|
||||||
|
|
||||||
Collections.sort(known_users);
|
Collections.sort(known_users);
|
||||||
|
|
||||||
|
@ -209,6 +223,7 @@ class ConnectionListenerThread extends Thread {
|
||||||
public class NetworkClient {
|
public class NetworkClient {
|
||||||
private User user;
|
private User user;
|
||||||
private List<User> known_users;
|
private List<User> known_users;
|
||||||
|
private List<Socket> dest_sockets;
|
||||||
private JTextArea chatText;
|
private JTextArea chatText;
|
||||||
private JTextArea knownUsersPanel;
|
private JTextArea knownUsersPanel;
|
||||||
|
|
||||||
|
@ -227,10 +242,11 @@ public class NetworkClient {
|
||||||
|
|
||||||
NetworkClient(JTextArea in_chatText, JTextArea in_knownUsersPanel)
|
NetworkClient(JTextArea in_chatText, JTextArea in_knownUsersPanel)
|
||||||
{
|
{
|
||||||
user = new User("", "");
|
user = new User("");
|
||||||
chatText = in_chatText;
|
chatText = in_chatText;
|
||||||
knownUsersPanel = in_knownUsersPanel;
|
knownUsersPanel = in_knownUsersPanel;
|
||||||
known_users = new ArrayList<User>();
|
known_users = new ArrayList<User>();
|
||||||
|
dest_sockets = new ArrayList<Socket>();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean connect(String username)
|
boolean connect(String username)
|
||||||
|
@ -241,11 +257,8 @@ public class NetworkClient {
|
||||||
DatagramSocket userListSocket;
|
DatagramSocket userListSocket;
|
||||||
|
|
||||||
DatagramPacket connectionRequest;
|
DatagramPacket connectionRequest;
|
||||||
DatagramPacket userListPacket;
|
DatagramPacket responsePacket;
|
||||||
|
|
||||||
ObjectInputStream userListStream;
|
|
||||||
|
|
||||||
ArrayList<User> userList;
|
|
||||||
|
|
||||||
byte[] buffer1 = new byte[20000];
|
byte[] buffer1 = new byte[20000];
|
||||||
|
|
||||||
|
@ -266,36 +279,40 @@ public class NetworkClient {
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
userListPacket = new DatagramPacket(buffer1, buffer1.length);
|
responsePacket = new DatagramPacket(buffer1, buffer1.length);
|
||||||
|
|
||||||
System.out.println("Waiting for reply");
|
System.out.println("Waiting for reply");
|
||||||
userListSocket.receive(userListPacket);
|
userListSocket.receive(responsePacket);
|
||||||
System.out.println("Received a reply from " + userListPacket.getAddress().getHostAddress());
|
System.out.println("Received a reply from " + responsePacket.getAddress().getHostAddress());
|
||||||
|
|
||||||
userListStream = new ObjectInputStream(new ByteArrayInputStream(userListPacket.getData()));
|
String[] response = new String(responsePacket.getData()).split(";");
|
||||||
|
|
||||||
userList = (ArrayList<User>) userListStream.readObject();
|
String[] usernameList = response[0].split(" ");
|
||||||
|
String[] addressList = response[1].split(" ");
|
||||||
|
|
||||||
for(User a:userList)
|
|
||||||
|
for(String u:usernameList)
|
||||||
{
|
{
|
||||||
nameAvailable = nameAvailable && (!username.equals(a.getName()));
|
nameAvailable = nameAvailable && (!username.equals(u));
|
||||||
}
|
}
|
||||||
if(nameAvailable)
|
if(nameAvailable)
|
||||||
{
|
{
|
||||||
System.out.println(userList.size() + " users currently connected");
|
System.out.println(usernameList.length + " users currently connected");
|
||||||
for(int i = 0;i < userList.size();i ++)
|
for(String u:usernameList)
|
||||||
{
|
{
|
||||||
System.out.println(userList.get(i).getName() + " : " + userList.get(i).getAddress());
|
known_users.add(new User (u));
|
||||||
known_users.add(userList.get(i));
|
}
|
||||||
|
for(String a:addressList)
|
||||||
|
{
|
||||||
|
dest_sockets.add(new Socket(a, 1237));
|
||||||
}
|
}
|
||||||
known_users.add(new User(username, "25.67.234.235"));
|
|
||||||
Collections.sort(known_users);
|
Collections.sort(known_users);
|
||||||
connected = true;
|
connected = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(SocketTimeoutException e)
|
catch(SocketTimeoutException e)
|
||||||
|
//Si on est tout seul sur le réseau (on ne reçoit aucune réponse)
|
||||||
{
|
{
|
||||||
known_users.add(new User(username, "25.67.234.235"));
|
|
||||||
System.out.println("Reply timed out");
|
System.out.println("Reply timed out");
|
||||||
connected = true;
|
connected = true;
|
||||||
}
|
}
|
||||||
|
@ -315,6 +332,18 @@ public class NetworkClient {
|
||||||
if(connected)
|
if(connected)
|
||||||
{
|
{
|
||||||
user.setName(username);
|
user.setName(username);
|
||||||
|
known_users.add(new User(username));
|
||||||
|
ReceiveThread t2 = new ReceiveThread(1237, chatText, known_users, knownUsersPanel);
|
||||||
|
ConnectionListenerThread t3 = new ConnectionListenerThread(known_users, dest_sockets, chatText, knownUsersPanel);
|
||||||
|
|
||||||
|
t2.start();
|
||||||
|
t3.start();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dest_sockets.add(new Socket("25.67.234.235", 1237));
|
||||||
|
}
|
||||||
|
catch(IOException e){}
|
||||||
|
|
||||||
chatText.append(username + " has joined the chat.\n");
|
chatText.append(username + " has joined the chat.\n");
|
||||||
chatText.setCaretPosition(chatText.getDocument().getLength());
|
chatText.setCaretPosition(chatText.getDocument().getLength());
|
||||||
|
@ -325,12 +354,6 @@ public class NetworkClient {
|
||||||
{
|
{
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
knownUsersPanel.append(" " + a.getName() + " \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
ReceiveThread t2 = new ReceiveThread(1237, chatText, known_users, knownUsersPanel);
|
|
||||||
|
|
||||||
ConnectionListenerThread t3 = new ConnectionListenerThread(known_users, chatText, knownUsersPanel);
|
|
||||||
t2.start();
|
|
||||||
t3.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return connected;
|
return connected;
|
||||||
|
@ -338,10 +361,19 @@ public class NetworkClient {
|
||||||
|
|
||||||
void send (String message)
|
void send (String message)
|
||||||
{
|
{
|
||||||
for(User recipient:known_users)
|
// for(User recipient:known_users)
|
||||||
|
// {
|
||||||
|
// SendThread t1 = new SendThread(new Message(user.getName(), message), recipient.getAddress(), 1237);
|
||||||
|
// t1.start();
|
||||||
|
// }
|
||||||
|
for(Socket s:dest_sockets)
|
||||||
{
|
{
|
||||||
SendThread t1 = new SendThread(new Message(user.getName(), message), recipient.getAddress(), 1237);
|
try
|
||||||
t1.start();
|
{
|
||||||
|
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||||
|
out.writeObject(new Message(user.getName(), message));
|
||||||
|
}
|
||||||
|
catch(IOException e){}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,13 @@ import java.util.*;
|
||||||
public class User implements Comparable<User>, Serializable{
|
public class User implements Comparable<User>, Serializable{
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private String address;
|
// private String address;
|
||||||
|
|
||||||
|
|
||||||
public User(String in_name, String in_address)
|
public User(String in_name)
|
||||||
{
|
{
|
||||||
name = in_name;
|
name = in_name;
|
||||||
address = in_address;
|
// address = in_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String new_name)
|
public void setName(String new_name)
|
||||||
|
@ -23,14 +23,14 @@ public class User implements Comparable<User>, Serializable{
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
public void setAddress(String new_address)
|
/*public void setAddress(String new_address)
|
||||||
{
|
{
|
||||||
name = new_address;
|
name = new_address;
|
||||||
}
|
}
|
||||||
public String getAddress()
|
public String getAddress()
|
||||||
{
|
{
|
||||||
return address;
|
return address;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
boolean equals(User b)
|
boolean equals(User b)
|
||||||
{
|
{
|
||||||
|
|
正在加载…
在新工单中引用