一.客户端程序,有窗口,可以输入、显示所有人发的信息
package com.adu.client;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Client extends JFrame {
TextArea textArea = new TextArea();// 创建一个文本域
TextField textField = new TextField();// 创建一个文本框
Button button_send = new Button("发送");
Button button_clear = new Button("清屏");
static Socket clientLink;
BufferedReader br;
PrintStream ps;
String msg;
StringBuffer sb = new StringBuffer();
static {
try {
clientLink = new Socket("127.0.0.1",8888);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public Client() {
super("客户端");
}
public void runClient() {
this.setLocation(400, 450);
this.setSize(400, 400);
this.add(textArea, BorderLayout.NORTH);// 把文本添加到窗体中
this.add(textField, BorderLayout.SOUTH);// 把文本框添加到窗体中
this.add(button_send, BorderLayout.EAST);// 把按钮添加到窗体中
this.add(button_clear, BorderLayout.WEST);
this.setVisible(true);// 窗体是否可见
this.pack();// 自动调整布局
textField.setText("请输入信息");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
br = new BufferedReader(new InputStreamReader(clientLink
.getInputStream()));
ps = new PrintStream(clientLink.getOutputStream());
// 发送按钮事件
button_send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
msg = textField.getText();
System.out.println(msg);
// 这里不能用缓冲流,向服务器发送信息
ps.println(msg);
ps.flush();
}
});
// 回车时,文本域事件
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
msg = textField.getText();
// 这里不能用缓冲流写
ps.println(msg);
ps.flush();
}
});
// 清屏按钮事件
button_clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setText("");
sb.delete(0, sb.length());
}
});
// 接受服务器信息
while (true) {
msg = br.readLine();
sb.append(msg + "\n");
textArea.setText(sb.toString());
textField.setText("");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != clientLink) {
clientLink.close();
}
if (null != br) {
br.close();
}
if (null != ps) {
ps.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().runClient();
}
}
二.服务器端实现了线程的控制,只要启动就可以监听客户端的请求以及发送的消息
package com.adu.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* @author GYH
*
*/
public class Server {
static ServerSocket server;
Socket clientLink;
List<Socket> clientLinkList = new ArrayList<Socket>();
int count;
static {
try {
// 开启服务器
server = new ServerSocket(8888);
System.out.println("服务器已启动!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void runServer() {
try {
while (true) {
clientLink = server.accept();
System.out.println("连接数:" + (++count));
clientLinkList.add(clientLink);
ServerThread st = new ServerThread(clientLinkList, clientLink);
new Thread(st).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.runServer();
}
}
package com.adu.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.List;
public class ServerThread implements Runnable {
List<Socket> clientLinkList;
Socket clientLink;
BufferedReader br;
PrintStream ps;
String msg;
String ip;
public ServerThread(List<Socket> clientLinkList, Socket clientLink) {
this.clientLinkList = clientLinkList;
this.clientLink = clientLink;
}
@Override
public void run() {
try {
br = new BufferedReader(new InputStreamReader(clientLink
.getInputStream()));
//获得当前用户的IP
ip=clientLink.getInetAddress().getHostAddress();
//把当前用户发来的信息发送给所有用户.
while (null != (msg=br.readLine())) {
for (int i = 0; i < clientLinkList.size(); i++) {
ps = new PrintStream(clientLinkList.get(i)
.getOutputStream());
ps.println("IP为:"+ip+"的朋友说:"+msg+"\n");
ps.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(null!=clientLink){
clientLink.close();
}
if(null!=br){
br.close();
}
if(null!=ps){
ps.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
Java聊天程序源码是一个用于学习和理解网络编程和并发处理的宝贵资源,尤其对于初学者或希望提升Java技能的开发者而言。在这个项目中,你将找到一个完整的Java应用程序,它实现了客户端-服务器通信模型,允许用户...
Java聊天程序源码是用于学习Java网络编程的宝贵资源,它包含了两个不同的聊天室实例:ChatRoom_1和ChatRoom_2。这些源代码能够帮助开发者深入理解如何使用Java实现客户端-服务器通信,以及如何构建多用户交互的聊天...
Java聊天程序源码.zip是一个包含Java编程语言实现的聊天应用程序的源代码集合。这个程序提供了丰富的功能,使得用户能够在一个互动的环境中进行实时交流。以下是该聊天程序的关键知识点和技术细节: 1. **网络编程*...
【Java聊天程序源码解析】 Java聊天程序是一种基于Java编程语言实现的通信应用,它可以允许用户在局域网内进行实时的信息交流。本项目提供的源码涵盖了从设计到实现的全过程,是学习Java网络编程和多线程技术的理想...
Java聊天程序源码是一种用于构建实时通信应用的编程资源,主要使用Java编程语言编写。Java因其跨平台性、丰富的库支持以及高效的性能,常被选为开发聊天应用程序的基础。在这个项目中,源码已经经过了测试,证明它...
Java聊天程序源码整理是一个关于使用Java编程语言开发聊天应用程序的资源集合。这个资源包可能包含了一个完整的聊天应用的源代码,以及相关的说明文档和可能的解压密码。以下是基于这个主题的一些关键知识点: 1. *...
Java聊天程序源码是开发基于Java的实时通讯应用的基础,这类程序通常涉及到网络编程和多线程技术。Java语言因其跨平台性和丰富的类库而成为实现聊天应用的理想选择。在这个项目中,我们可以看到一个简单的聊天程序,...
【Java聊天程序源码解析】 本Java聊天程序是一款功能丰富的通信工具,允许用户发送图片、文件,并且可以自定义字体,甚至实现截屏分享。它基于Java编程语言开发,适用于Windows XP操作系统,需要Eclipse IDE以及JDK...
Java简单的聊天程序源码是一个基于Java编程语言实现的交互式通信应用,通常涉及到网络编程、多线程和I/O流等核心概念。这个程序可能是为了教学目的或个人实践而设计的,通过清晰的注释帮助初学者理解相关技术。下面...
Java网络编程是Java开发中的重要领域,主要用于实现不同设备间的通信和数据交换。...以上就是这个Java聊天程序源码中涉及的主要知识点,通过学习和理解这个例子,可以加深对Java网络编程的理解,提升实际项目开发能力。
Java聊天小程序源码是一款基于Java技术实现的即时通讯应用,旨在提供一个轻量级的通信平台,让用户能够进行实时的文字、语音甚至视频交流。这款源码的发布,为开发者提供了学习和研究Java即时通讯技术的一个实例,...
Java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7...
综上所述,这个Java聊天程序源码涵盖了网络编程中的诸多核心概念,包括Socket通信、多线程、流状态监控等,对于理解网络编程和提升Java编程技能具有很高的价值。通过深入学习和分析这个项目,开发者不仅可以掌握网络...