服务器端 :
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
public class ChatServer {
boolean started = false;
ServerSocket serverSocket = null;
List<Client> clients = new ArrayList<Client>();
public static void main(String[] args) {
new ChatServer().start();
}
public void start() {
try {
serverSocket = new ServerSocket(7777);
started = true;
}
catch(BindException e2) {
System.out.println("端口使用中 ... ...");
System.out.println("请关闭双关程序!");
System.exit(0);
}
catch(Exception e) {
e.printStackTrace();
}
try{
while(started) {
Socket socket = serverSocket.accept();
Client client = new Client(socket);
System.out.println("连接上了... ...");
new Thread(client).start();
clients.add(client);
}
} catch (IOException e) {
System.out.println("Server 关闭");
}finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Client implements Runnable {
private Socket socket;
private DataInputStream dis = null;
private DataOutputStream dos = null;
boolean bConnected = false;
public Client(Socket socket) {
this.socket = socket;
try {
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
bConnected = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(String str) {
try {
dos.writeUTF(str);
} catch (IOException e) {
clients.remove(this);
System.out.println("对方退出了!我从List里去掉");
//e.printStackTrace();
}
}
public void run() {
//Client c = null;
try{
while(bConnected) {
String str = dis.readUTF();
System.out.println(str);
for(int i = 0;i<clients.size();i++) {
Client c = clients.get(i);
c.send(str);
}
}
}catch (EOFException e) {
System.out.println("Server 关闭");
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(dis != null){
dis.close();
}
if(dos != null){
dos.close();
}
if(socket != null){
socket.close();
socket = null;
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
客户端 :
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class ChatClient extends Frame {
Socket socket = null;
TextField textField = new TextField();
TextArea textArea = new TextArea();
DataOutputStream dos = null;
DataInputStream dis = null;
boolean bContented = false;
Thread thread = new Thread(new ClientTalk());
public void MainFrame() {
setLocation(200, 200);
setSize(400, 300);
add(textArea,BorderLayout.NORTH);
add(textField,BorderLayout.SOUTH);
textField.addActionListener(new TextFieldListener());
pack();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
disConnect();
System.exit(0);
}
});
setVisible(true);
connect();
thread.start();
}
private class TextFieldListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str = textField.getText();
//textArea.setText(str);
textField.setText("");
try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void disConnect() {
try {
dos.close();
dis.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void connect() {
try {
socket = new Socket("127.0.0.1",7777);
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
bContented = true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
class ClientTalk implements Runnable {
public void run() {
try{
while(bContented) {
String str = dis.readUTF();
//System.out.println(str);
textArea.setText(textArea.getText() + str + '\n');
}
}catch(SocketException e) {
e.printStackTrace();
}catch(EOFException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new ChatClient().MainFrame();
}
}
分享到:
相关推荐
4. 图像处理:可以实现简单的图像查看器或编辑器,使用Java的AWT和Swing库处理图像。这可能包括缩放、旋转、滤镜应用等操作,需要了解像素处理和色彩模型。 5. 简单的数据库应用:可以创建一个联系人管理程序,利用...
2. **端口扫描器**: 端口扫描是网络安全领域的一个重要工具,用于探测目标主机开放的网络端口。Java提供了Socket和ServerSocket类来处理网络连接,通过尝试连接目标IP的不同端口,我们可以判断哪些端口处于监听...
标题中的“uc7.9+qq2011java通用版软件”指的是两个经典的老版本移动应用,分别针对UC浏览器(UCWeb)和QQ聊天软件。这些版本是为Java平台设计的,Java作为早期智能手机广泛使用的开发语言,适用于多种设备,具有较...
MolyX Board是一款商业源码,主要用于编程和开发工作,其版本为2.7 beta 2。这个压缩包中包含了该软件的源代码,供开发者研究、学习或进行二次开发。MolyX Board可能是一个开源项目,允许用户查看、修改和分发其源...
4. **Java程序分析器**: - 文件I/O:读取Java源代码文件。 - 语法解析:理解Java语言结构,可能需要用到词法分析和语法分析工具,如ANTLR。 - 类与接口分析:识别类的继承关系、内部类、接口等。 - AST抽象语法...
《JAVA五子棋手机网络对战游戏的设计与实现》是一个基于Java编程语言的项目,它展示了如何构建一个手机上的实时网络对战游戏。这个项目涵盖了多个重要的IT知识点,包括网络编程、多线程、图形用户界面(GUI)设计...
【盈盈通JSP网络聊天软件】是一款基于JavaServer Pages(JSP)技术构建的在线聊天应用程序,旨在提供一个实时沟通平台,使用户能够通过互联网进行便捷的交流。这款软件的UTF-8编码确保了多语言环境下的兼容性和正确...
《五子棋大师项目解析——基于Java的在线聊天与对战平台》 “FiveChess-master_1.rar”这个压缩包文件包含的是一个名为“FiveChess-master”的项目,它集成了五子棋游戏与在线聊天功能,是Java编程语言的一个实例...
1. **qq2011_beta1_build0011_unsigned.jad**:这是一个早期版本的QQ聊天应用的测试版,用于Java设备。jad文件是Java应用程序的描述文件,它包含有关应用程序的信息,而jar文件则包含实际的代码和资源。 2. **TTPod...
Asmack是一个开源的Java库,它是Smack的Android版本,专为在Android平台上处理XMPP(可扩展消息传递和存在协议)而设计。XMPP是一种开放标准的即时通讯协议,广泛用于创建实时通信系统,如聊天应用、协作工具和在线...
ckeditor是另一款非常流行的开源在线富文本编辑器,支持多种编程语言和平台,如PHP、ASP.NET、Java等。ckeditor_3.0.1_open.rar表示的是ckeditor的3.0.1版本的开源版本,开源意味着源代码公开,允许用户自由使用、...
2. **ajaxtags-1.2-beta3.jar** - **用途**: 提供了一套Ajax标签库,使得开发者可以在JSP页面中像使用普通标签那样使用Ajax功能。 - **应用场景**: 需要动态更新网页部分内容而不重新加载整个页面的应用场景,例如...
- **架构选择**:采用MVC(Model-View-Controller)架构,将模型、视图与控制器分离,提高系统的可维护性和扩展性。 #### 2. 详细设计 - **用户界面模块**:设计简洁美观的界面,实现棋盘显示、棋子移动等功能。 -...
- Protocol Codec:编码解码器,用于在网络传输前将数据转换为适合传输的格式,反之亦然。 3. `netty-all-4.1.25.Final.jar`: 这是Netty的核心库文件,包含了Netty所有模块的功能,包括服务器和客户端的实现、...
该框架可以作为Adobe Flash Media Server (FMS)的一种低成本替代方案,尤其适合于开发实时视频聊天应用、在线教育平台以及直播服务等场景。Red5的核心功能包括视频流传输、音频流传输、数据共享和交互式通信等。 ##...