[转]Java写的聊天程序
客户端:
package zju.lh;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
@SuppressWarnings("serial")
public class ChatClient extends Frame{
Socket s = null;
DataInputStream dis = null;
DataOutputStream dos = null;
boolean connected = false;
String name;
Thread rt = null;
TextField tfTxt = new TextField();
TextArea taContent = new TextArea();
//Button buttonSend = new Button("发送");
public static void main(String[] args){
new ChatClient("dd").lauchFrame();
}
public ChatClient(String name){
this.name = name;
}
public void lauchFrame(){
this.setLocation(400, 300);
this.setSize(500, 400);
this.setTitle(name);
this.add(tfTxt, BorderLayout.SOUTH);
this.add(taContent, BorderLayout.NORTH);
this.tfTxt.addActionListener(new TFListener());
//this.add(buttonSend, BorderLayout.AFTER_LINE_ENDS);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent arg0){
close();
System.exit(0);
}
});
this.pack();
this.setVisible(true);
connect();
rt = new Thread(new ReceiveThread());
rt.start();
}
public void connect(){
try{
s = new Socket("127.0.0.1", 8888);
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
connected = true;
}catch(UnknownHostException ex){
ex.printStackTrace();
}
catch(IOException ex){
ex.printStackTrace();
}
}
@SuppressWarnings("deprecation")
public void close(){
try{
if(dis != null)
dis.close();
if(dos != null)
dos.close();
}catch(Exception ex){
ex.printStackTrace();
}finally{
Thread.yield();
rt.stop();
System.out.println("退出了. . . . . .");
}
}
public void sendMsg(String msg){
try{
dos.writeUTF(msg);
dos.flush();
}catch(IOException e){
e.printStackTrace();
}
}
private class TFListener implements ActionListener{
public void actionPerformed(ActionEvent e){
String msg = name + " : " + tfTxt.getText().trim() + "\n";
taContent.append(msg);
tfTxt.setText("");
sendMsg(msg);
}
}
private class ReceiveThread implements Runnable {
private void receive(){
String msg = "";
try{
msg = dis.readUTF();
taContent.append(msg);
}catch(IOException e){
}
}
public void run(){
while(connected){
receive();
}
}
}
}
服务器端:
package zju.lh;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import java.util.Vector;
public class ChatServer {
boolean started = false;
ServerSocket ss = null;
public static Vector<ClientThread> cts = new Vector<ClientThread>();
public static void main(String[] args){
new ChatServer().start();
}
public void start(){
try{
ss = new ServerSocket(8888);
started = true;
System.err.println("/*********服务器已经启动在8888端口监听************/");
}catch(Exception ex){
System.err.print("出错");
ex.printStackTrace();
System.exit(0);
}
try{
while(started){
Socket s = ss.accept();
ClientThread ct = new ClientThread(s);
new Thread(ct).start();
cts.add(ct);
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
if(ss != null)
ss.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
private class ClientThread implements Runnable{
private Socket s;
private DataInputStream dis;
private DataOutputStream dos;
private boolean connected = false;
private Vector<ClientThread> threads = cts;
public ClientThread(Socket s){
this.s = s;
try{
this.dis = new DataInputStream(s.getInputStream());
this.dos = new DataOutputStream(s.getOutputStream());
this.connected = true;
}catch(IOException ex){
ex.printStackTrace();
}
}
public void transmit(String msg){
try{
dos.writeUTF(msg);
dos.flush();
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void run(){
try{
while(connected){
String msg = dis.readUTF();
for(ClientThread ct : threads){
if(ct != this)
ct.transmit(msg);
}
}
}catch(Exception ex){
}finally{
try{
if(dos != null)
dos.close();
if(dis != null)
dis.close();
if(s != null){
s.close();
//移除这个客户端的连接
cts.remove(this);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
浙公网安备 33010602011771号