基于GUI的简单聊天室01

运用了Socket编程,gui,流的读入和写出,线程控制等

思路:

1、首先是在客户端中先建立好聊天的GUI

2、建立服务器端,设置好端口号(用SocketServer),其中需要两个boolean变量来分别表示服务器是否已经开启和是否有客户端连接进来,

  利用while循环来让服务器在开启的情况下不断接收客户端的信息。利用DataOutputStream来进行通讯

3、客户端连接服务器(Socket)

首先是客户端的类

  1 import java.awt.BorderLayout;
  2 import java.awt.event.ActionEvent;
  3 import java.awt.event.ActionListener;
  4 import java.awt.event.WindowAdapter;
  5 import java.awt.event.WindowEvent;
  6 import java.io.DataOutputStream;
  7 import java.io.IOException;
  8 import java.net.Socket;
  9 import java.net.UnknownHostException;
 10 
 11 import javax.swing.JFrame;
 12 import javax.swing.JTextArea;
 13 import javax.swing.JTextField;
 14 
 15 /**
 16  * 完成图形界面
 17  * @author Administrator
 18  *
 19  */
 20 public class ChatClient extends JFrame{
 21     JTextField jTextField = new JTextField();
 22     JTextArea jTextArea = new JTextArea();
 23     Socket s;
 24     DataOutputStream bo;
 25     public static void main(String[] args) {
 26         new ChatClient().launchFrame();
 27     }
 28     
 29     public void launchFrame() {
 30         setLocation(200, 150);
 31         this.setSize(450, 450);
 32         this.add(jTextArea,BorderLayout.NORTH);
 33         this.add(jTextField,BorderLayout.SOUTH);
 34         jTextField.addActionListener(new TFListener());
 35         //pack();
 36         this.addWindowListener(new WindowAdapter() {
 37             @Override
 38             public void windowClosing(WindowEvent arg0) {
 39                 disConnect();
 40                 System.exit(0);
 41             }
 42         });;
 43         
 44         setVisible(true);
 45         connect();
 46     }
 47     
 48     /**
 49      * 建立连接的方法
 50      * @throws IOException 
 51      * @throws UnknownHostException 
 52      */
 53     public void connect() {
 54          try {
 55             s = new Socket("127.0.0.1",8888);
 56             bo = new DataOutputStream(s.getOutputStream());
 57         } catch (UnknownHostException e) {
 58             e.printStackTrace();
 59         } catch (IOException e) {
 60             e.printStackTrace();
 61         }
 62          System.out.println("连接成功");
 63     }
 64     /**
 65      * 断开连接,关闭资源的方法
 66      */
 67     public void disConnect() {
 68         try {
 69             s.close();
 70             bo.close();
 71         } catch (IOException e1) {
 72             e1.printStackTrace();
 73         }
 74         
 75     }
 76     
 77     /**
 78      * 内部类,实现监听
 79      * 将文本框中的输入打印到文本域中
 80      *
 81      */
 82     private class TFListener implements ActionListener{
 83 
 84         @Override
 85         public void actionPerformed(ActionEvent e) {
 86             String content = jTextField.getText().trim();
 87             jTextArea.setText(content);
 88             jTextField.setText("");
 89             //将文本发送到服务器
 90             try {
 91                 System.out.println(s);
 92                 bo.writeUTF(content);
 93                 bo.flush();
 94             } catch (IOException e1) {
 95                 e1.printStackTrace();
 96             }
 97         }
 98         
 99     }
100 }

然后是服务器的类

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatSever {
	public static void main(String[] args) {
		// 布尔类型变量表示服务器是否开着
		boolean started = false;
		ServerSocket ss = null;
		Socket s = null;
		DataInputStream bi = null;
		// 建立服务端,8888为端口号
		try {
			ss = new ServerSocket(8888);
		} 
		catch (BindException e) {
			System.out.println("Socket has been used !");
			System.out.println("请重启服务器 !");
			System.exit(0);
		}catch (IOException e) {
			e.printStackTrace();
		}
		// 服务器开启后,started变为true
		try {
			started = true;
			// 接受客户端的连接
			while (started) {
				// 布尔类型变量bConnected表示有没有用户连接
				boolean bConnected = false;
				s = ss.accept();
				// 服务器连接后bConnected为true
				bConnected = true;
				System.out.println("一个客户连接");
				bi = new DataInputStream(s.getInputStream());
				while (bConnected) {
					String str = bi.readUTF();
					System.out.println(str);
					//bi.close();
				}
			}
		} catch (EOFException e) {
			System.out.println("Client close!");
		} catch (Exception e) {
			 e.printStackTrace();
		} finally {
			try {
				if (bi != null)
					bi.close();
				if (s != null)
					s.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}

		}
	}
	
}

  

转载于:https://www.cnblogs.com/happyeven/p/10765829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值