java简易聊天室

来源:互联网 发布:淘宝店名可以修改吗 编辑:程序博客网 时间:2024/05/22 04:39

server端

package com.One;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.BindException;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.util.ArrayList;import java.util.List;public class ChatServer {boolean started = false;ServerSocket ss = null;List<Client> clients = new ArrayList<Client>();public static void main(String[] args) throws IOException {new ChatServer().start();}public void start() {try {ss = new ServerSocket(8240);} catch (BindException e) {System.out.println("端口使用中,请关掉相关资源并重新启动服务器");} catch (IOException e) {e.printStackTrace();}try {started = true;while (started) {boolean bConnected = false;Socket s = ss.accept();Client c = new Client(s);new Thread(c).start();clients.add(c);}} catch (IOException e) {System.out.println("Client closed");} finally {try {ss.close();} catch (IOException e1) {e1.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 {dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());bConnected = true;} catch (IOException e) {e.printStackTrace();}}public void send(String str){//一开始这里有错误的,已经修正,不写try catch因为解决不了    try{   dos.writeUTF(str);    }catch(IOException e){    clients.remove(this);    System.out.println("对方退出了!我从List里面去掉了");    }}@Overridepublic 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(SocketException e){   System.out.println("a client quit!");}catch (EOFException e) {System.out.println("退出了,bye");} catch (IOException e) {e.printStackTrace();} finally {try {if (dis != null)dis.close();if (dos != null)dos.close();if (s != null)s.close();} catch (IOException e) {e.printStackTrace();}}}}}

client端

package com.One;import java.awt.BorderLayout;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.Socket;import java.net.SocketException;import java.net.UnknownHostException;import javax.swing.JFrame;public class ChatClient extends JFrame {/** *  */private static final long serialVersionUID = 1255082554537179096L;TextField tfTxt = new TextField();TextArea taContent = new TextArea();Socket s = null;DataOutputStream dos;DataInputStream dis;private boolean f = false;Thread rRecv = 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() {@Overridepublic void windowClosing(WindowEvent arg0) {disconnect();System.exit(0);}});tfTxt.addActionListener(new TFListener());setVisible(true);connect();rRecv.start();}public void disconnect() {try {dos.close();dis.close();s.close();} catch (IOException e) {e.printStackTrace();}/* * try { f = false; rRecv.join();// 等着线程执行完,由于前面f置false,就保证了不会错了 // * 如果join错了呢?听麻烦的 // join方法 有一个阻塞式方法,不容易停止的 //对付阻塞方法,等待它500ms,然后停止这个方法可以写一下 } catch * (InterruptedException e) { e.printStackTrace(); } finally { try { * dos.close(); dis.close(); s.close(); } catch (IOException e) { * e.printStackTrace(); } } */}public void connect() {try {s = new Socket("127.0.0.1", 8240);dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());System.out.println("Connected");f = true;} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private class TFListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent arg0) {String str = tfTxt.getText().trim();// taContent.setText(str);tfTxt.setText("");try {dos.writeUTF(str);dos.flush();} catch (IOException e1) {e1.printStackTrace();}}}private class RecvThread implements Runnable {@Overridepublic void run() {try {while (f) {String s = dis.readUTF();// readUTF会阻塞taContent.setText(taContent.getText() + s);System.out.println(s);}} catch (SocketException e) {System.out.println("退出了,bye!");} catch(EOFException e){          System.out.println("退出了,Bye");}catch (IOException e) {e.printStackTrace();}}}}


0 0
原创粉丝点击