一、概述

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-在线聊天系统-非线程的更多相关文章

  1. Java多线程之非线程安全

    在Java多线程中我会重点总结五个如下的技术点: 1.非线程安全是如何出现的 2.synchronized对象监视器为Objec时的使用 3.synchronized对象监视器为Class时的使用 4 ...

  2. JAVA中的线程安全与非线程安全

    原文:http://blog.csdn.net/xiao__gui/article/details/8934832 ArrayList和Vector有什么区别?HashMap和HashTable有什么 ...

  3. Java中的守护线程 & 非守护线程(简介)

    Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...

  4. Java 非线程安全的HashMap如何在多线程中使用

    Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的.在多线程条件下,容易导致死循环,具体表现为CPU使用率100%.因此多线程环境下保证 HashMap 的线程安全 ...

  5. java多线程之守护线程与非守护线程

    在java线程中有两种线程,一种是用户线程,其余一种是守护线程. 守护线程具有特殊的含义,比如gc线程.当最后一个非守护线程执行完后,守护线程随着jvm一同结束工作. java中的守护线程需要将Dae ...

  6. 为什么JAVA虚拟机分为线程共享和非线程共享?

    大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟 ...

  7. java 多线程 线程安全及非线程安全的集合对象

    一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用.防止出现数据不一致或 ...

  8. java中线程安全和非线程安全的集合

    线程安全 非线程安全 Collection Vector ArrayList.LinkedList HashSet.TreeSet Map HashTable HashMap.TreeMap 字符串 ...

  9. Java线程安全和非线程安全

    ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的 ...

随机推荐

  1. Web中Listener的创建

    使用Listener只需要两个步骤: 定义Listener实现类. 通过Annotation或在web.xml文件中配置Listener 实现Listener类 监听不同Web事件的监听器不相同,常用 ...

  2. [uwp开发]数据绑定那些事(1)

    现在是msp候选人,是时候写点技术博客来加分了(实则是个人的心得体会). 注:以下都是个人理解,错误在所难免,欢迎批评指正 以前接触过WPF,只会简单的一些操作,现在在逐渐学习UWP(Universa ...

  3. Team Homework #2 Decide the roles of each team member ——IloveSE

    大家好,我们是IloveSEers! 徐姗,我是一个性格开朗,但却认为计算机比较枯燥的女生.经过两年的学习,自己的编程能力,并不是很强,在这方便还需多多练习.对于软件工程这门课,我充满期待,因为我不仅 ...

  4. Mysql高级之存储过程

    参考地址1:http://www.2cto.com/database/201411/350819.html 参考地址2:http://www.jb51.net/article/39471.htm my ...

  5. Grails 1.2参考文档速读(10):Controller

    转载:http://keyvalue.blog.51cto.com/1475446/303260       从本篇起,我们将开始进入Grails的Web层,首先让我们从Controller说起. G ...

  6. 【桌面程序搞界面再也不怕了】:迅雷BOLT入门(一)开篇 附程序和源码

    本来想多蛤一下前因后果,突然意兴阑珊不想多说啦,直接帖效果吧. 这个是用迅雷BOLT把原来写的一个IE拦截器的界面重写了一下.界面效果是直接从单位的大屏系统改过来的,其中文本框部分,还请设计大屏的小姑 ...

  7. WC2016游记

    出发的时候,长沙忽然就出了太阳,明媚而和煦. [day0 25] 噫吁嚱,危乎高哉!蜀道之难,难于上青天! 总之本来上午已经准备好9:50的飞机…然后就在一次次的手机查询中变成了5点多…然后也不是直飞 ...

  8. 【BZOJ】【1269】【AHOI2006】文本编辑器editor

    Splay Splay序列维护的模板题了……为了便于处理边界情况,我们可以先插入两个空格当作最左端和最右端,然后……其实本题主要考察的就是Build.splay和Findkth这三个操作,我们可以实现 ...

  9. 【BZOJ】【1798】【AHOI2009】Seq维护序列

    线段树 属于线段树中级应用吧…… 要打两种标记:乘法和加法标记.一开始我想着可以像只有加法标记那样,永不下传,查询的时候依次累加就好了.后来发现不会写……只好每次update的时候……遇到标记!下传! ...

  10. [转载]为什么我希望用C而不是C++来实现ZeroMQ

    来源: http://blog.jobbole.com/19647/ 开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的.在我的整个职业生涯里我都在使 ...