支持多用户聊天,客户端UDP发送消息到服务器,服务器TCP发送消息到每一个客户。
Server [服务器]
Usage javac Server.java ; java Server 7777
Write by Hifan for CS; Date May 17 2005 to May 30 2005
import java.io.;
import java.net.;
import java.util.Vector;
import javax.swing.;
import java.awt.event.;
public class Server extends JFrame
{
static ServerSocket serverSocket = null;
static int serverUDPport = 9999;
static Vector vecSocket = new Vector(10,10);
public static void main(String args[]) throws IOException
{
if(args.length!=1)
{
System.out.println(Usagenjava Server [ServerPort]nLike java Server 7777n);
System.exit(-1);
}
Create Server Socket!
try{
serverSocket=new ServerSocket(Integer.parseInt(args[0]));
System.out.println(Successfully Listen on port +Integer.parseInt(args[0]));
} catch (IOException e) {
System.out.println(Could not Listen on port +Integer.parseInt(args[0]));
System.exit(-1);
}
new JabberThread(9999).start();
Frame
Server myServer = new Server(Server - Listening at +args[0]);
myServer.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{ QUIT□SERVERn
Send QUIT SERVERn to LocalHost
DatagramSocket socketUDP = null;
String quit = new String(QUIT SERVERn);
byte[] buf = new byte[256];
buf = quit.getBytes();
try {
socketUDP = new DatagramSocket();
} catch (SocketException e2) {
System.err.println(SocketException +e2);
System.out.println(Can not create UDP socket[to send QUIT SERVER to LocalHost]!);
}
InetAddress address = null;
try {
address = InetAddress.getByName(LocalHost);
} catch (UnknownHostException e2) {
System.err.println(UnknownHostException +e2);
System.out.println(Can not parse ServerIP[LocalHost]!);
}
DatagramPacket packet = new DatagramPacket(buf,buf.length,address,serverUDPport);
try {
socketUDP.send(packet);
} catch (IOException e3) {
System.err.println(IOException +e3);
System.out.println(Can not send QUIT SERVERn throught UDP!);
}
System.exit(0);
}
});
myServer.setSize(300,300);
myServer.setVisible(true);
boolean listening=true;
while(listening)
{
System.out.println(Waitinging!);
Socket socket = serverSocket.accept();
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
HELO□screen_namen
String read = is.readLine();
String screen_name = read.substring(5);
WELCOME□udp_portn
os.println(WELCOME +serverUDPport);
os.flush();
is.close();
os.close();
vecSocket.addElement(screen_name);
vecSocket.addElement(socket);
System.out.println(screen_name+ connect successfully!);
}
serverSocket.close();
}
public Server(String str) { super(str); }
};
class JabberThread extends Thread
{
DatagramSocket socketUDP;
public JabberThread(int port)
{
try {
socketUDP = new DatagramSocket(port);
} catch (SocketException e) {
System.err.println(SocketException +e);
System.out.println(Can not create UDP server!);
}
}
public void run()
{
boolean socketConnect = true;
try {
while(socketConnect)
{
UDP to get message from Client!
byte [] buf = new byte [256];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
socketUDP.receive(packet);
Print the message on the Server Standard Output!
String received = new String(packet.getData());
for(int i=0;i256;++i) Hifan I am Hifan!n0000-256-0000! trim can not!
{
char point = received.charAt(i);
if( point == 'n') {
received = received.substring(0,i+1);
break;
}
}
If the message is QUIT message!
String client_name = null; store the client name who send the message;
boolean to_delete = false; Flag show whether to delete the client[socket]
if(received.substring(0,4).equals(QUIT))
{
client_name = received.substring(6,received.length()-1);
if(client_name.equals(SERVER))
socketConnect = false; show whether to quit the server
else
{
to_delete = true;
received = client_name + QUITn;
}
}
System.out.print(received);
Send the message to all Clients!
for(int i=0;iServer.vecSocket.size();i+=2)
{
String screen_name = (String) Server.vecSocket.elementAt(i);
Socket socket = (Socket) Server.vecSocket.elementAt(i+1);
PrintWriter os = new PrintWriter(socket.getOutputStream());
os.print(received);
os.flush();
}
to delete the client;
if(to_delete)
{
int index = 0 ;
while( (index=Server.vecSocket.indexOf(client_name)) != -1 )
{
Server.vecSocket.remove(index);
Server.vecSocket.remove(index);not index+1,delete one so the size decrease 1;
System.out.println(client_name + has gone!);
}
}
to quit the Server
}
}
catch (IOException e) {
System.err.println(IOException +e);
System.out.println(JabberThread error!);
}
}
}
Client [客户端]
run.bat javac Client.java; java Client HiFan LocalHost 7777
Write by Hifan for Java Program. Date May 17 2005 to May 30 2005
import java.io.;
import java.awt.;
import java.awt.event.;
import javax.swing.;
import java.net.;
public class Client implements ActionListener
{
Four Members
JFrame f;
JButton b;
JTextField tf;
static JTextArea ta;
static JScrollPane s;
static String screen_name;
static String ServerIP;
static int ServerPort;
static int ServerPortUDP;
static Socket socket;
static DatagramSocket socketUDP;
String message;
static String serverMessage;
static BufferedReader is;
static PrintWriter os;
static boolean socketConnect = true;
main function
public static void main(String args[]) throws UnknownHostException, IOException
{
judgeStandardInput(args);
createSocket();
Client myClient = new Client();
while(socketConnect)
{
getMessageTCP();
displayMessage();
judgeServerMessage();
}
destroySocket();
System.exit(0);
}
Client Construct
public Client()
{
f = new JFrame(ChatRoom[Client] - +screen_name+ Connect);
b = new JButton(Quit);
tf = new JTextField(256);
ta = new JTextArea(0,0);
s = new JScrollPane(ta); s.setViewportView((Component)ta);
ta.setEditable(false);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(socketConnect)
sendMessageUDP(QUIT + screen_name + n);
System.exit(0);
}
});
b.addActionListener(this); When Button b[Quit] is pressed;
tf.addActionListener(this); When press Enter in the TextField;
f.getContentPane().setLayout(new BorderLayout()); Default
f.getContentPane().add(North,tf);
f.getContentPane().add(Center,s);
f.getContentPane().add(South,b);
f.setSize(300,300);
f.setVisible(true);
}
Judge how much standard input.
public static void judgeStandardInput(String args[])
{
if(args.length==3)
{
if(args[0].equals(QUIT) args[0].equals(SERVER))
System.out.println(You can not login with QUIT or SERVER);
screen_name = args[0];
ServerIP = args[1];
ServerPort = Integer.parseInt(args[2]);
}
else
{ Tell how to use it!
System.out.print(Usagenjava Client [youName] [ServerIP] [Port]nLike Java Client Hifan 127.0.0.1 7777n);
System.exit(-1);
}
}
Create Socket
public static void createSocket()
{
try {
System.out.pri