1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
| import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChatServer {
DatagramSocket ds;
byte[] recbuf = new byte[1024];
DatagramPacket rec = new DatagramPacket(recbuf, recbuf.length);
int port;
String newAddress = "";
String addressList = "";
String sendAddressList = "";
public ChatServer(int port) {
this.port = port;
}
public void init() throws Exception {//DatagramSocket
if (port < 1024 || port > 65535) {
System.out.println("initialisation du port a la valeur 2008 ");
ds = new DatagramSocket(2008);
} else {
ds = new DatagramSocket(port);
}
}
public void start() throws Exception {
println("demarrage du port");
println("valeur du port" + port);
init();
receive();
}
public void receive() {
for ( ; ; ) {
try {
ds.receive(rec);
String msg = new String(rec.getData(), rec.getOffset(), rec.getLength());
String natAddress = rec.getAddress().toString().substring(1);
int natPort = rec.getPort();
String Num = msg.substring(0,1);
msg = msg.substring(2);
String line;
switch(Integer.parseInt(Num)){//
case 1 : {
line = "Ò»¸öеÄÓû§µÇ¼: " + msg + " NATµØÖ·: " + natAddress + " ¹ÜÀí¶Ë¿Ú: " + natPort;
sendAddressList = sendAddressList + natAddress + " " + natPort + " ";
newAddress = msg + ":" + natAddress + ":" + natPort;
println(line);
break;
}
case 2 : {
line = "ÒôƵ¶Ë¿Ú: " + natPort;
newAddress = newAddress + ":" + natPort;
println(line);
break;
}
case 3 : {
line = "ÒôƵRTCP¶Ë¿Ú: " + natPort;
newAddress = newAddress + ":" + natPort;
println(line);
break;
}
case 4 : {
line = "ÊÓÆµ¶Ë¿Ú: " + natPort;
newAddress = newAddress + ":" + natPort;
println(line);
break;
}
case 5 : {
line = "ÊÓÆµRTCP¶Ë¿Ú: " + natPort;
newAddress = newAddress + ":" + natPort;
println(line);
if (!sendAddressList.equals(""))
doSend("1 " + newAddress, sendAddressList);
if(!addressList.equals("")){
String address[] = newAddress.split(":");
doSend("7 " + addressList,
address[1] + " " + address[2]);
}
addressList = addressList + newAddress + " ";
break;
}
case 6 : {
line = "Ò»¸ö¿Í»§À뿪: " + msg + " NATµØÖ·: " + natAddress + " ¹ÜÀí¶Ë¿Ú: " + natPort;
println(line);
delAddress(msg, natAddress, natPort);
if(!sendAddressList.equals(""))
doSend("6 " + msg + ":" + natAddress, sendAddressList);
break;
}
case 7 : break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void doSend(String msgSend, String sendAddressList) throws Exception {
String[] s = sendAddressList.split(" ");
byte[] data = msgSend.getBytes();
for(int i =0; i < s.length; i++){
DatagramPacket pack = new DatagramPacket(data, data.length, InetAddress.getByName(s[i]), Integer.parseInt(s[++i]));
ds.send(pack);
}
}
public void delAddress(String msg, String natAddress, int ctrlPort){
String regEx = msg + ":" + natAddress + ":" + ctrlPort + ":.{1,5}:.{1,5}:.{1,5}:.{1,5} ";
Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(addressList);
String s = m.replaceAll("");
addressList = s;
regEx = natAddress + " " + ctrlPort + " ";
p = Pattern.compile(regEx);
m = p.matcher(sendAddressList);
s = m.replaceAll("");
sendAddressList = s;
}
public void println(String s) {
Date nowTime = new Date();
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss aa", Locale.US);
System.out.println(fmt.format(nowTime) + "----" + s);
}
public static void main(String[] args) throws Exception {
new ChatServer(2008).start();
}
} |
Partager