Java-在线聊天系统-非线程
一、概述
1.目标:建立基于tcp协议的聊天系统
2.思路:用java socket编程
二、代码
1.ChatServer.java
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException; public class ChatServer{ public static void main(String[] args) { DataInputStream dis = null;
Socket s = null;
ServerSocket ss = null;
boolean started =false; try {
ss = new ServerSocket(8888);
} catch (IOException e1) {
e1.printStackTrace();
} try {
started = true;
while(started){
boolean bConnect = false;
//!!!!!注意accept()是阻塞性方法,当被readUTF()阻塞时它不会被执行
s = ss.accept();
System.out.println("a client connect------"+s);
dis = new DataInputStream(s.getInputStream());
bConnect = true;
while(bConnect){
//!!!!!注意readUTF()是阻塞性方法
System.out.println(dis.readUTF());
}
}
} catch (EOFException e) {
System.out.println("客户端已关闭!");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(dis != null ) dis.close();
if(s != null ) s.close();
if(ss != null ) ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.Chatclient.java
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class ChatClient extends Frame{ private TextField tfText;
private TextArea taContent;
// private Button btnSend;
private Socket socket;
private DataOutputStream dos; public void launchFrame(){ addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
disconnect();
System.exit(0);
}
}); tfText = new TextField();
taContent = new TextArea();
// btnSend = new Button("发送");
//
// btnSend.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// //taContent.setText(taContent.getText()+"\n\r"+tfText.getText());
// //tfText.setText("");
// try {
// DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// dos.writeUTF(tfText.getText());
// dos.close();
// socket.close();
// } catch (IOException e1) {
// e1.printStackTrace();
// }
// }
// }); tfText.addActionListener(new TFListener()); add(taContent,BorderLayout.NORTH);
add(tfText,BorderLayout.CENTER);
// add(btnSend,BorderLayout.SOUTH);
setLocation(300, 100);
pack();
setVisible(true);
connect("localhost", 8888);
} //当调用了此方法,会自动把成员变量给socket连接上server
public void connect(String address, int port){
try {
socket = new Socket(address, port);
dos = new DataOutputStream(socket.getOutputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} //退出时释放资源
public void disconnect(){
try {
if(dos != null ) dos.close();
if(socket != null ) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} class TFListener implements ActionListener{ @Override
public void actionPerformed(ActionEvent e) {
taContent.setText(taContent.getText().trim()+"\n\r"+tfText.getText()); try {
dos.writeUTF(tfText.getText());
dos.flush();
tfText.setText("");
//dos.close();
//socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} public static void main(String[] args) {
new ChatClient().launchFrame();
}
}
三、运行结果

Java-在线聊天系统-非线程的更多相关文章
- Java多线程之非线程安全
在Java多线程中我会重点总结五个如下的技术点: 1.非线程安全是如何出现的 2.synchronized对象监视器为Objec时的使用 3.synchronized对象监视器为Class时的使用 4 ...
- JAVA中的线程安全与非线程安全
原文:http://blog.csdn.net/xiao__gui/article/details/8934832 ArrayList和Vector有什么区别?HashMap和HashTable有什么 ...
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...
- Java 非线程安全的HashMap如何在多线程中使用
Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的.在多线程条件下,容易导致死循环,具体表现为CPU使用率100%.因此多线程环境下保证 HashMap 的线程安全 ...
- java多线程之守护线程与非守护线程
在java线程中有两种线程,一种是用户线程,其余一种是守护线程. 守护线程具有特殊的含义,比如gc线程.当最后一个非守护线程执行完后,守护线程随着jvm一同结束工作. java中的守护线程需要将Dae ...
- 为什么JAVA虚拟机分为线程共享和非线程共享?
大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟 ...
- java 多线程 线程安全及非线程安全的集合对象
一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用.防止出现数据不一致或 ...
- java中线程安全和非线程安全的集合
线程安全 非线程安全 Collection Vector ArrayList.LinkedList HashSet.TreeSet Map HashTable HashMap.TreeMap 字符串 ...
- Java线程安全和非线程安全
ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的 ...
随机推荐
- Crawling is going on - Alpha版本使用说明
[Crawling is going on - Alpha版本] 使 用 说 明 北京航空航天大学计算机学院 远航1617 小组 产品版本: Alpha版本 产品名称:Crawling is ...
- 断点续传 (HTTP) 归纳
由于最近项目中要上传较大的文件,基于公司原有的底层框架的局限性,对于大文件的传输都束手无策,基于文件传输的安全性,考虑用断点续传(HTTP)以及FTP上传两种方式实现下面归纳下HTTP续传和FTP上传 ...
- 使用AzCopy跨账户迁移blob
昨天北美紧急通知要停掉几个开发和测试的订阅,当天必须完成,因为事情比较多,搞得有点我措手不及,但是唯一的遗憾是Azure VM. 因为在上面做了很多东西,很多资料和环境都是做好的,如果被删除掉实在可惜 ...
- 设计模式之代理模式(Proxy)
只能指针是代理模式的一种: 智能指针实现需要注意的问题: 1.构造函数指明显示构造. 2.拷贝构造函数,先断开前一个指针,然后用之前指针的值初始化现在的指针. 3.赋值函数需要先断开之前的指针,然后释 ...
- IIS8托管WCF服务
WCF服务程序本身不能运行,需要通过其他的宿主程序进行托管才能调用WCF服务功能,常见的宿主程序有IIS,WAS,Windows服务,当然在学习WCF技术的时候一般使用控制台应用程序或WinForm程 ...
- Leetcode#126 Word Ladder II
原题地址 既然是求最短路径,可以考虑动归或广搜.这道题对字典直接进行动归是不现实的,因为字典里的单词非常多.只能选择广搜了. 思路也非常直观,从start或end开始,不断加入所有可到达的单词,直到最 ...
- Leetcode#76 Minimum Window Substring
原题地址 用两个指针分别记录窗口的左右边界,移动指针时忽略那些出现在S种但是没有出现在T中的字符 1. 扩展窗口.向右移动右指针,当窗口内的字符即将多于T内的字符时,停止右移 2. 收缩窗口.向右调整 ...
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
这个类型的resource 后面多个SRGB 表示SRGB空间是指gamma 矫正系数为2.2的色彩空间,这个问题我没有问别人,是我自己是上网查的,我觉得我不是个女人了......我又level up ...
- IIS Express 及 vs2008下使用IIS Express
介绍 IIS Express 开发 ASP.NET 的应用程序是我的主要工作.当然我会选择最适合的开发环境.客户多属于企业用户,我的开发的选择,多半是 ASP.NET Web Application ...
- XSS的原理分析与解剖(二)
0×01 前言: 上节(http://www.freebuf.com/articles/web/40520.html)已经说明了xss的原理及不同环境的构造方法.本期来说说XSS的分类及挖掘方法. ...