Java实现多个客户端聊天程序
复习了一天Java。晚上写了一个HeartChat 0.1,实现多个客户端相互聊天的机制。代码如下:
import java.awt.*;import java.awt.event.*;import java.io.*;import java.lang.*;import java.net.*;public class HeartClient extends Frame {/* * 成员方法出场... */private TextField tfText;private TextArea taContent;private Socket s;private DataOutputStream dos;private DataInputStream dis;/** * 注意,入口... ^^ * @param args */public static void main(String[] args) {new HeartClient().launchFrame();}/** * Loading GU */public void launchFrame(){tfText = new TextField();taContent = new TextArea();this.setSize(300,300);this.setLocation(300,300);this.tfText.addActionListener(new TFListener());this.add(tfText,BorderLayout.SOUTH);this.add(taContent,BorderLayout.NORTH);this.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.pack();this.connect();this.setVisible(true);}/** * 我在努力地连接服务器中... */public void connect() {try {s = new Socket("127.0.0.1",1720);dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());new Thread(new SendThread()).start();//dos.writeUTF("Hello,i find u!");} catch (UnknownHostException e) {System.out.println("UnknownHostException");e.printStackTrace();} catch (IOException e) {System.out.println("IOException");e.printStackTrace();}finally{//关闭啥尼...}}/** * 额不会傻等着tfText(TextField tfText的监听器类) */class TFListener implements ActionListener{private String str;@Overridepublic void actionPerformed(ActionEvent e) {str = tfText.getText().trim();tfText.setText("");try {dos.writeUTF(str);} catch (IOException e1) {System.out.println("IOException");e1.printStackTrace();}}}/** * 客户端接收消息的线程呦... * */class SendThread implements Runnable{private String str;private boolean iConnect = false;public void run(){iConnect = true;recMsg();}/** * 消息,看招,哪里跑...(客户端接收消息的实现) * @throws IOException */public void recMsg() {try {while(iConnect){str = dis.readUTF();taContent.setText(str);}} catch (IOException e) {e.printStackTrace();}}}}
import java.io.*;import java.net.*;import java.util.*;public class HeartServer { /* * 成员变量闪亮登场 */List<ClientThread> clients = new ArrayList<ClientThread>();/** * 这系入口啊,向这里看齐... * @param args */public static void main(String[] args) {new HeartServer().start();}/** * 启动服务器中... * */public void start(){try {boolean iConnect = false;ServerSocket ss = new ServerSocket(1720);iConnect = true;while(iConnect){System.out.println("绑定服务器端口成功!");Socket s = ss.accept();ClientThread currentClient = new ClientThread(s);//创建线程引用System.out.println("发现客户端!");clients.add(currentClient);//把当前客户端加入集合new Thread(currentClient).start();System.out.println("客户端进程已经启动!");}} catch (IOException e) {System.out.println("IOException");e.printStackTrace();}}/** * 给每个客户端留个家(客户端的进程) * */class ClientThread implements Runnable {/* * 成员变量又来啦... */private Socket s;private DataInputStream dis;private DataOutputStream dos;private String str;private boolean iConnect = false;/** * 小构一下 */ClientThread(Socket s){this.s = s;iConnect = true;}public void run(){System.out.println("run方法启动了!");try {while(iConnect){System.out.println("RUN方法中的while循环启动,正在等待客户端的发送消息...");dis = new DataInputStream(s.getInputStream());str = dis.readUTF();System.out.println(str);for(int i=0; i<clients.size(); i++){System.out.println("转发消息中..."+i);ClientThread c = clients.get(i);c.sendMsg(str);}}} catch (IOException e) {e.printStackTrace();}}/** * 转发消息,我做主... * 将送至服务器的消息发送给每个连接到的客户端 */public void sendMsg(String str){try {System.out.println("创建输出管道!");dos = new DataOutputStream(this.s.getOutputStream());System.out.println("正在向客户端写消息!");dos.writeUTF(str);System.out.println("正在向客户端写消息成功!");} catch (IOException e) {e.printStackTrace();}}}}1 楼 xchyou 13 小时前 聊天一般不用SOCKET。。。 2 楼 宋建勇 2 小时前 好像ServerSocketChannel是非阻塞模式,应该比ServerSocket好点,听说是这样...