1. 程式人生 > >用視窗程式做Java socket編寫聊天程式

用視窗程式做Java socket編寫聊天程式

服務端:

import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
 boolean started = false;
 ServerSocket ss = null;
 List<Client> clients = new ArrayList<Client>();
 public static void main(String[] args) {
  new ChatServer().start();
 }
 public void start() {
  try {
   ss = new ServerSocket(8888);
   started = true;
  } catch (BindException e) {
   System.out.println("埠使用中....");
   System.out.println("請關掉相關程式並重新執行伺服器!");
   System.exit(0);
  } catch (IOException e) {
   e.printStackTrace();
  } 
  try { 
   while(started) {
    Socket s = ss.accept();
    Client c = new Client(s);
                                                                 System.out.println("a client connected!");
    new Thread(c).start();
    clients.add(c);
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    ss.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 class Client implements Runnable {
  private Socket s;
  private DataInputStream dis = null;
  private DataOutputStream dos = null;
  private boolean bConnected = false;
  
  public Client(Socket s) {
   this.s = s;
   try {
    dis = new DataInputStream(s.getInputStream());
    dos = new DataOutputStream(s.getOutputStream());
    bConnected = true;
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
  public void send(String str) {
   try {
    dos.writeUTF(str);
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
  public void run() {
   try {
    while(bConnected) {
     String str = dis.readUTF();
                                                                                 System.out.println(str);
     for(int i=0; i<clients.size(); i++) {
      Client c = clients.get(i);
      c.send(str);
     }
    }
   } catch (EOFException e) {
    System.out.println("Client closed!");
   } catch (IOException e) {
    e.printStackTrace();
   } finally {
    try {
     if(dis != null) dis.close();
     if(dos != null) dos.close();
     if(s != null)  {
      s.close();
      //s = null;
     }
    } catch (IOException e1) {
     e1.printStackTrace();
    }
   }
  }
  
 }
}

客戶端:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class ChatClient extends Frame {
 Socket s = null;
 DataOutputStream dos = null;
 DataInputStream dis = null;
 private boolean bConnected = false;
 TextField tfTxt = new TextField();
 TextArea taContent = new TextArea();
 Thread tRecv = new Thread(new RecvThread());
 public static void main(String[] args) {
  new ChatClient().launchFrame(); 
 }

 public void launchFrame() {
  setLocation(400, 300);
  this.setSize(300, 300);
  add(tfTxt, BorderLayout.SOUTH);
  add(taContent, BorderLayout.NORTH);
  pack();
  this.addWindowListener(new WindowAdapter() {

   @Override
   public void windowClosing(WindowEvent arg0) {
    disconnect();
    System.exit(0);
   }
   
  });
  tfTxt.addActionListener(new TFListener());
  setVisible(true);
  connect();
  
  tRecv.start();
 }
 
 public void connect() {
  try {
   s = new Socket("127.0.0.1", 8888);
   dos = new DataOutputStream(s.getOutputStream());
   dis = new DataInputStream(s.getInputStream());
System.out.println("connected!");
   bConnected = true;
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
 
 public void disconnect() {
  try {
   dos.close();
   dis.close();
   s.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
   }
 
 private class TFListener implements ActionListener {

  public void actionPerformed(ActionEvent e) {
   String str = tfTxt.getText().trim();
   tfTxt.setText("");
   
   try {
    dos.writeUTF(str);
    dos.flush();
   } catch (IOException e1) {
    e1.printStackTrace();
   }
   
  }
  
 }
 
 private class RecvThread implements Runnable {

  public void run() {
   try {
    while(bConnected) {
     String str = dis.readUTF();
     
     taContent.setText(taContent.getText() + str + '\n');
    }
   } catch (SocketException e) {
    System.out.println("�˳��ˣ�bye!");
   } catch (IOException e) {
    e.printStackTrace();
   } 
   
  }
  
 }
}