server.java

 import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.awt.*;
import javax.swing.*; @SuppressWarnings("serial")
public class Server extends JFrame {
// Text area for displaying data
private JTextArea jta = new JTextArea();
ArrayList<Client> clients = new ArrayList<Client>();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = new Date();
String time = format.format(d);
// Statistics the number of clients
int clientNo = 0; public static void main(String[] args) {
new Server();
} public Server() {
// Place text area on the frame
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER); setTitle("Server");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); // It is necessary to show the frame here! ServerSocket serverSocket = null;
try {
// Create a server socket
serverSocket = new ServerSocket(2014);
} catch (IOException ex) {
jta.append(" ***端口已被占用!*** " + '\n');
}
jta.append(" ***服务器启动时间: " + time + "***" + '\n'); while (true) {
Socket socket = null;
try {
// Listen for a connection request
socket = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
// To display client inetAddress
InetAddress inetAddress = socket.getInetAddress();
clientNo++;
jta.append(" Client " + clientNo + '\n');
jta.append(" Host name is " + inetAddress.getHostName() + '\n');
jta.append(" IP Address is " + inetAddress.getHostAddress() + '\n'); // Create a new Thread for client
Client task = new Client(socket);
clients.add(task);
new Thread(task).start();
}
} class Client implements Runnable {
Socket socket;
// Create data input and output streams
DataInputStream inputFromClient = null;
DataOutputStream outputToClient = null;
Client c = null; public Client(Socket socket) {
this.socket = socket;
try {
inputFromClient = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
outputToClient = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
} public void sentAll(String str) {
try {
// Receive message from the client
outputToClient.writeUTF(str);
} catch (SocketException e) {
if (c != null)
clients.remove(c);
} catch (IOException e) {
e.printStackTrace();
}
} public void run() {
try {
while (true) {
// Receive sentence from the client
String sentence = inputFromClient.readUTF();
// Send sentence back to the client
for (int i = 0; i < clients.size(); i++) {
c = clients.get(i);
c.sentAll(sentence);
} // Display to the text area
jta.append(" " + time + "\n");
jta.append(" " + sentence + '\n');
}
} catch (IOException e) {
// e.printStackTrace();
clientNo--;
if (clientNo == 0) {
jta.append(" ***无客户端连接!***" + "\n");
clients.remove(c); // 防止新用户使用
} else {
jta.append(" ***退出一用户! 剩余用户: " + clientNo + "***" + "\n");
}
}
}
}
}

client.java

 import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; @SuppressWarnings("serial")
public class Client extends JFrame {
// Text field for receiving data
private JTextField jtfName = new JTextField(); // Enter Name
private JTextField jtfMessage = new JTextField(); // Enter Message // Text Area to display data
private JTextArea jta = new JTextArea(); // Button for send massage
private JButton jbSend = new JButton("Send"); // IO streams
private DataOutputStream toServer;
private DataInputStream fromServer; public static void main(String[] args) {
new Client();
} public Client() {
// Panel p to hold the label and text field
JPanel p = new JPanel();
p.setLayout(new GridLayout(2, 2));
p.add(new JLabel(" Enter Name: "));
p.add(jtfName);
p.add(new JLabel(" Enter Message: "));
p.add(jtfMessage);
jtfName.setHorizontalAlignment(JTextField.LEFT);
jtfMessage.setHorizontalAlignment(JTextField.LEFT); setLayout(new BorderLayout());
add(p, BorderLayout.NORTH);
add(new JScrollPane(jta), BorderLayout.CENTER);
add(jbSend, BorderLayout.SOUTH); // Register listener for jbSend button
jbSend.addActionListener(new ButtonListener()); // Register listener for jtfName JTextField
jtfName.addActionListener(new ButtonListener()); // Register listener for jtfMessage JTextField
jtfMessage.addActionListener(new ButtonListener()); setTitle("Client");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); // It is necessary to show the frame here! try {
// Create a socket to connect to the server
Socket socket = new Socket("localhost", 2014); // Create an input stream to receive data from the server
fromServer = new DataInputStream(socket.getInputStream()); // Create an output stream to send data to the server
toServer = new DataOutputStream(socket.getOutputStream()); // Receive data from the server all the time
while (true) {
// read data from client
String sentence = fromServer.readUTF();
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
Date d = new Date();
String time = format.format(d); // Display to the text area
jta.append(" " + time + "\n");
jta.append(" " + sentence + "\n");
}
} catch (IOException ex) {
jta.append(" ***服务器连接失败!***" + '\n');
}
} private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
// Get the Name and Message from the text field
String Name = jtfName.getText().trim();
String Message = jtfMessage.getText().trim();
// Prevent send a blank message
if (Name != null && Name.length() != 0 && Message != null
&& Message.length() != 0) {
String data = Name + ": " + Message; // Send the data to the server
toServer.writeUTF(data);
toServer.flush();
} else
jta.append(" ***警告:名称和内容均不能为空!*** " + "\n"); } catch (IOException ex) {
System.err.println(ex);
}
}
}
}

下载链接: http://pan.baidu.com/s/1i3oQlyl密码: jk6q

Java版多人聊天室的更多相关文章

  1. java小程序---简陋版多人聊天室

    功能需求: 1 每运行一次主函数,创建一个客户端聊天界面; 2 客户端界面分三块,公屏(显示所有客户端发送的信息),私屏(用于输入个人想要发送的信息),发送按钮(点击一次,将客户端信息发送到服务端) ...

  2. java版两人聊天程序

    server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...

  3. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

  4. java socket之多人聊天室Demo

    一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...

  5. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

  6. Spring整合DWR comet 实现无刷新 多人聊天室

    用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...

  7. Java网络编程案例---聊天室

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决 ...

  8. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  9. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

随机推荐

  1. golang并发练习代码笔记

    golang语言的精髓就是它的并发机制,十分简单,并且极少数在语言层面实现并发机制的语言,golang被成为网络时代的c语言,golang的缔造者也有c语言的缔造者,Go语言是google 推出的一门 ...

  2. 渗透测试工具实战技巧 (转载freebuf)

    最好的 NMAP 扫描策略 # 适用所有大小网络最好的 nmap 扫描策略 # 主机发现,生成存活主机列表 $ nmap -sn -T4 -oG Discovery.gnmap 192.168.56. ...

  3. tcp连接过程中的三次握手和四次挥手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手握手建立连接 @第一次握手: 建立连接是,客户端A发送SYN包到服务器B,并进入SYN_SEND状态,等待B确认. @第二次握手: 服务 ...

  4. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

  5. NetworkX初相识

    听说NetworkX是一个很牛的复杂网络研究的工具,就来试一下吧. import networkx as nx G= nx.Graph()#建立一个空白的图 G.add_node("node ...

  6. The server of Nginx(一)——Nginx基础及静态网站的构建

    一.Nginx介绍 火了半边天的Nginx和Apache一样也是Web服务器,专为性能优化而开发,也可以像Squid一样做反向代理,或者邮件代理等许多用途,并有windows的移植版,其最知名的优点是 ...

  7. 【python】10分钟教你用Python做个打飞机小游戏超详细教程

    更多精彩尽在微信公众号[程序猿声] 我知道你们一定想先看效果如何 00 目录 整体框架 开始之前-精灵类Sprite 子弹类class Bullet 玩家飞机类class Player 敌机类clas ...

  8. google 浏览器的Debug 调试工具使用

    一个写后台的人 有一天要自己找前台页面的错误 于是乎就得会前台debug 于是乎我不会 就在网上找了一些资料看  不就是几个按钮 嘛 有啥难的  上图片 1.Google 浏览器 F12 就可以看到 ...

  9. Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON

    Home / Qt 学习之路 2 / Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON  豆子 ...

  10. 【Leetcode】Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. class Solution { public ...