聊天单线程(后续添加多线程)

Client

  1 package com.tan.chat;
  2
  3 import java.awt.BorderLayout;
  4 import java.awt.Container;
  5 import java.awt.event.ActionListener;
  6 import java.awt.event.ActionEvent;
  7 import java.net.ServerSocket;
  8 import java.net.Socket;
  9 import java.io.ObjectInputStream;
 10 import java.io.ObjectOutputStream;
 11
 12 import javax.swing.JFrame;
 13 import javax.swing.JTextArea;
 14 import javax.swing.JTextField;
 15 import javax.swing.JScrollPane;
 16
 17 import com.tan.bean.User;
 18
 19 public class ChatServer extends JFrame {
 20     private ObjectInputStream m_input; // 输入流
 21     private ObjectOutputStream m_output; // 输出流
 22     private JTextField m_enter; // 输入区域
 23     private JTextArea m_display; // 显示区域
 24     private int m_clientNumber = 0; // 连接的客户数
 25
 26     public ChatServer() // 在图形界面中添加组件
 27     {
 28         super("聊天程序服务器端");
 29         Container c = getContentPane();
 30         m_enter = new JTextField();
 31         m_enter.setEnabled(false);
 32         m_enter.addActionListener(new ActionListener() {
 33             public void actionPerformed(ActionEvent event) { // 向客户端发送数据
 34                 try {
 35                     String s = event.getActionCommand();
 36                     m_output.writeObject(s);
 37                     m_output.flush();
 38                     mb_displayAppend("服务器端: " + s);
 39                     m_enter.setText(""); // 清除输入区域的原有内容
 40                 } catch (Exception e) {
 41                     System.err.println("发生异常:" + e);
 42                     e.printStackTrace();
 43                 } // try-catch结构结束
 44             } // 方法actionPerformed结束
 45         } // 实现接口ActionListener的内部类结束
 46         ); // addActionListener方法调用结束
 47         c.add(m_enter, BorderLayout.NORTH);
 48         m_display = new JTextArea();
 49         c.add(new JScrollPane(m_display), BorderLayout.CENTER);
 50     } // J_ChatServer构造方法结束
 51
 52     public void mb_displayAppend(String s) {
 53         m_display.append(s + "\n");
 54         m_display.setCaretPosition(m_display.getText().length());
 55         m_enter.requestFocusInWindow(); // 转移输入焦点到输入区域
 56     } // 方法mb_displayAppend结束
 57
 58     public boolean mb_isEndSession(String m) {
 59         if (m.equalsIgnoreCase("q"))
 60             return (true);
 61         if (m.equalsIgnoreCase("quit"))
 62             return (true);
 63         if (m.equalsIgnoreCase("exit"))
 64             return (true);
 65         if (m.equalsIgnoreCase("end"))
 66             return (true);
 67         if (m.equalsIgnoreCase("结束"))
 68             return (true);
 69         return (false);
 70     } // 方法mb_isEndSession结束
 71
 72     public void mb_run() {
 73         try {
 74             ServerSocket server = new ServerSocket(5000);
 75             String m; // 来自客户端的消息
 76             while (true) {
 77                 m_clientNumber++;
 78                 mb_displayAppend("等待连接[" + m_clientNumber + "]");
 79                 Socket s = server.accept();
 80                 mb_displayAppend("接收到客户端连接[" + m_clientNumber + "]");
 81                 m_output = new ObjectOutputStream(s.getOutputStream());
 82                 m_input = new ObjectInputStream(s.getInputStream());
 83                 m_output.writeObject("连接成功");
 84                 m_output.flush();
 85                 m_enter.setEnabled(true);
 86                 do {
 87                     m = (String) m_input.readObject();
 88                     mb_displayAppend("客户端: " + m);
 89                 } while (!mb_isEndSession(m));// do-while循环结束
 90                 m_output.writeObject("q"); // 通知客户端退出程序
 91                 m_output.flush();
 92                 m_enter.setEnabled(false);
 93                 m_output.close();
 94                 m_input.close();
 95                 s.close();
 96                 mb_displayAppend("连接[" + m_clientNumber + "]结束");
 97             } // while循环结束
 98         } catch (Exception e) {
 99             System.err.println("发生异常:" + e);
100             e.printStackTrace();
101             mb_displayAppend("连接[" + m_clientNumber + "]发生异常");
102         } // try-catch结构结束
103     } // 方法mb_run结束
104
105     public static void main(String args[]) {
106         ChatServer app = new ChatServer();
107
108         app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
109         app.setSize(350, 150);
110         app.setVisible(true);
111         app.mb_run();
112     } // 方法main结束
113 } // 类J_ChatServer结束

Server

多线程还没有添加,消息响应也还没弄,后续完善

时间: 2024-12-26 15:53:15

聊天单线程(后续添加多线程)的相关文章

Manjaro为包管理器pacman和yaourt\yay 添加多线程下载

用轻量级的axle代替了默认的wget来下载升级包. 1. paman添加多线程 vim /etc/pacman.conf 如果有类似xfercommand的话,注释掉,加上下面这句 XferCommand = /usr/bin/axel -n 15 -o %o %u 原文地址:https://www.cnblogs.com/geoffreyone/p/10333529.html

JAVA单线程以及java多线程的实现方式

1.java单线程的实现 public class SingletonThread { @SuppressWarnings("static-access") public static void main(String[] args) { Thread t =Thread.currentThread(); t.setName("单例线程"); System.out.println(t.getName()+" 正在运行"); for(int i=0

轻松把玩HttpClient之封装HttpClient工具类(四),单线程调用及多线程批量调用测试

本文主要来分享一下该工具类的测试结果.工具类的整体源码不再单独分享,源码基本上都已经在文章中了.开始我们的测试. 单线程调用测试: public static void testOne() throws HttpProcessException{ System.out.println("--------简单方式调用(默认post)--------"); String url = "http://tool.oschina.net/"; //简单调用 String re

FCGI单线程环境和多线程环境下的例子

0.背景 在项目中加入了等待通讯的内容,所以原来单个请求处理时间增加了.单线程处理的fcgi就会浪费CPU和用户时间,所以需要多线程来处理,减少用户排队时间. 将处理用户请求的部分从单线程变为多线程,需要大概了解改动会不会影响性能. 得到的结论是:多线程和单线程在执行的流程和使用方法几乎一样,所以多线程不会带来额外的负担. 1.单线程的处理步骤 1.1一个简单的单线程fcgi请求 C代码   #include <fcgi_stdio.h> void main(void) { int count

单线程爬虫VS多线程爬虫的效率对比

单线程爬虫: import re import requests import time url_EB = 'http://www.amazon.com/gp/search/other/ref=sr_sa_p_4?me=A22XNR713HGDVG&rh=n%3A9063592011%2Ck%3Aprojector&bbn=9063592011&keywords=projector&pickerToList=brandtextbin&ie=UTF8&qid=

在单进程单线程或单进程多线程下实现log4cplus写日志并按大小分割

基于脚本配置来过滤log信息 除了通过程序实现对log环境的配置之外,log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能.通过 脚本可以完成对logger.appender和layout的配置,因此可以解决怎样输出,输出到哪里的问题,我将在全文的最后 一部分中提到多线程环境中如何利用脚本配置来配合实现性能测试,本节将重点介绍基脚本实现过滤log信息的功能. 首先简单介绍一下脚本的语法规则: 包括Appender的配置语法和logger的配置语法,其中: 1.

Python爬虫之路——简单网页抓图升级版(添加多线程支持)

转载自我的博客:http://www.mylonly.com/archives/1418.html 经过两个晚上的奋斗.将上一篇文章介绍的爬虫略微改进了下(Python爬虫之路--简单网页抓图),主要是将获取图片链接任务和下载图片任务用线程分开来处理了,并且这次的爬虫不只能够爬第一页的图片链接的,整个http://desk.zol.com.cn/meinv/以下的图片都会被爬到,并且提供了多种分辨率图片的文件下载,详细设置方法代码凝视里面有介绍. 这次的代码仍然有点不足,Ctrl-C无法终止程序

小白,BeautifulSoup初步整理,后续添加

form bs4 import BeautifulSoup要导入bs4模块注意BeautifulSoup大小写soup = BeautifulSoup('html','html.parser')第一个参数html为要解析的html文档,html是字符串 解析到soup中后才可以开始使用 soup中用的比较多的方法为find_all()用法有:soup.find_all('a')//找出所有的a标签中的内容,返回的是一个数组,数组中的每个元素又是BeautifulSoup对象find_all()中

多线程读取,单线程写入

场景: 应用中有一个IPList数组,用于屏蔽一些IP的访问,这个IP数组可以动态修改(写入). 我之前设计是这样: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 private String[] ipList; public boolean isDisallowIP(String ip) {     if (ipList == null)     {         return true;     }     else     {