基于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

时间: 2024-08-08 16:31:30

基于GUI的简单聊天室01的相关文章

基于GUI的简单聊天室02

服务器端 与上一篇相比,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 利用List集合来装载客户端的对象. 还需要注意全局变量的应用. 1 /** 2 * 相比01,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 3 * @author Administrator 4 * 5 */ 6 7 import java.io.DataInputStream; 8 import java.io.DataOutputStream; 9 import java.io

Flask基于websocket的简单聊天室

1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.chat.py文件内容如下: from flask import Flask,request,render_template import json from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import

基于Twisted的简单聊天室

实现了私聊,公聊.用户名密码存在redis.为了拓展,做了简单的模块. #coding=utf8 from twisted.internet import reactor, defer from twisted.protocols.basic import LineReceiver from twisted.internet.protocol import Factory, Protocol, ServerFactory import redis class Server(ServerFacto

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

C#实例之简单聊天室(状态管理)

前言        状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生成一个网页实例.此时,旧网页的任务完成,旧网页的实例也随之消失.这种无状态,意味着客户端用户在浏览器中的一些状态或是对数据的一些修改都将丢失. 为了弥补这种基于web应用程序的固有限制,ASP.NET提供了多种用于管理状态的功能. 简单聊天室 这里运用System.Web命名空间的那些管理状态的类,

基于flask的网页聊天室(二)

基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用flask-sqlalchemy来辅助创建 首先修改之前的init文件为: from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from web_chatroom.models impor

Python Socket 简单聊天室2

上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # -*- coding:utf-8 -*- import SocketServer class  mysocketclass(SocketServer.BaseRequestHandler):     def handle(self):         client_inform

ASP.NET 使用application和session对象写的简单聊天室程序

ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览器端的变量对象,用来存储跨网页程序程序的变量或者对象. 说实话,写了快一年的asp.net,application对象还真没怎么用过.看了看书,根据这两个对象的特性写了一个简单的聊天室程序.真的是非常的简陋. 我的思路是,有两个页面Default页和ChatRoom页,页面布局如图: Default

基于Socket的Android聊天室

1        基于Socket的Android聊天室 Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序.本实例使用ServerSocket建立聊天服务器.将服务器端所有的通讯线程保存到一个集合当中,当有用户发来数据,则转发给所有用户,实现聊天室效果.Android端通过使用Socket建立客户端链接,并且在AsyncTask中执行网络读写的任务,将用户输入的内容发送到服务器,并接收服务器发来的数据