简单的java聊天室,出了点问题,欢迎帮忙,哈哈
2008-03-28 09:55
375 查看
package muyizhou.chat;
import java.io.*;
import java.net.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Event;
import java.util.*;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.*;
public class CServer extends JFrame{
//保存当前处理客户端请求的处理器线程
static Vector clientProcessors=new Vector(10);
//当前的连接数
static int activeConnects=0;
//构造方法
public CServer(){
}
//主方法
public static void main(String args[]){
CServer chatServer1=new CServer();
chatServer1.setVisible(true);
System.out.println("server starting........");
Socket socket=null;
ServerSocket server=null;
try{
//服务器端开始侦听
server=new ServerSocket(5000);
}catch(IOException e){
System.out.println("Error"+e);
System.exit(1);
}
while(true){
try{
socket=server.accept();
if(socket!=null)
{
System.out.println(socket+"连接");
}
}catch(IOException e){
System.out.println("Error"+e);
}
ClientProcessor c=new ClientProcessor(socket);
c.start();
//sendMsgToClients(msg);
}
}
//关闭所有连接
public static void closeAll(){
while(clientProcessors.size()>0){
ClientProcessor c=(ClientProcessor) clientProcessors.firstElement();
try{
//关闭socket连接和处理线程
c.socket.close();
c.toStop();
}catch(IOException e){
System.out.println("Error:"+e);
}finally{
clientProcessors.removeElement(c);
}
}
}
//向所有用户群发消息
public static synchronized void sendMsgToClients(String msg){
//msg=null;
for(int i=0;i<clientProcessors.size();i++){
ClientProcessor c=(ClientProcessor) clientProcessors.elementAt(i);
System.out.println("send msg"+msg);
c.send(msg);
}
}
public static void disConnect(ClientProcessor client){
disConnect(client,true);
}
public static synchronized void disConnect(ClientProcessor client,
boolean toRemoveFromList){
try{
client.socket.close();
}catch(IOException e){
System.out.println("Error"+e);
}
}
}
//处理客户端发送的请求的线程
class ClientProcessor extends Thread{
Socket socket;
BufferedReader br;
PrintWriter pw;
boolean running=true;
String usr=null;
public void send(String msg){
usr=msg;
try{
usr=br.readLine();
}catch(IOException e){
System.out.println("Error:"+e);
CServer.disConnect(this);
}
pw.println(msg);
}
//构造方法
public ClientProcessor(Socket s){
socket=s;
try{
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw=new PrintWriter(socket.getOutputStream());
//usr=br.readLine();
}catch(IOException e){
System.out.println("Error:"+e);
}
}
public void run(){
while(running){
String line=null;
try{
line=br.readLine();
System.out.println(line);
}catch(IOException e){
System.out.println("Error:"+e);
CServer.disConnect(this);
}
CServer.sendMsgToClients(line);
}
}
public void toStop(){
running=false;
}
}
客户端
package book.net.chat;
import java.io.*;
import java.net.Socket;
import java.net.InetAddress;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.StringTokenizer;
import javax.swing.border.TitledBorder;
public class CClient extends JFrame implements ActionListener{
JLabel nameLabel=new JLabel();
JLabel ipLabel=new JLabel();
JTextField nameTextField=new JTextField(15);
JTextField ipTextField=new JTextField(15);
JTextField msgTextField=new JTextField(30);
JButton connectButton=new JButton();
JButton disconnectButton=new JButton();
JTextArea chatContentTextArea=new JTextArea(15,40);
JButton sendMsgButton=new JButton();
JLabel msgLabel=new JLabel();
java.awt.List peopleList=new java.awt.List(15);
Socket socket=null;
PrintStream ps=null;
ClientListener listener=null;
//构造函数
public CClient(){
init();
}
//图形界面
public void init(){
this.setTitle("聊天室客户端");
//初始化按钮和标签
nameLabel.setText("姓名");
ipLabel.setText("IP");
connectButton.setText("连接");
connectButton.addActionListener(this);
disconnectButton.setText("断开");
disconnectButton.addActionListener(this);
//设置聊天内容不可编辑
chatContentTextArea.setEditable(false);
sendMsgButton.setText("发送");
sendMsgButton.addActionListener(this);
msgTextField.setText("请输入聊天信息");
//pane1放置输入姓名和连接两个按钮
JPanel panel1=new JPanel();
panel1.setLayout(new FlowLayout());
panel1.add(nameLabel);
panel1.add(nameTextField);
panel1.add(ipLabel);
panel1.add(ipTextField);
panel1.add(connectButton);
panel1.add(disconnectButton);
//用于放置聊天信息显示和聊天人员列表
JPanel panel2=new JPanel();
panel2.setLayout(new FlowLayout());
JScrollPane pane1=new JScrollPane(chatContentTextArea);
pane1.setBorder(new TitledBorder(BorderFactory.createEtchedBorder
(Color.white,new Color(134,134,134)),"聊天内容"));
panel2.add(pane1);
JScrollPane pane2=new JScrollPane(peopleList);
pane2.setBorder(new TitledBorder(BorderFactory.createEtchedBorder
(Color.white,new Color(134,134,134)),"用户列表"));
panel2.add(pane2);
//用于放置发送信息区域
JPanel panel3=new JPanel();
panel3.setLayout(new FlowLayout());
panel3.add(msgLabel);
panel3.add(msgTextField);
panel3.add(sendMsgButton);
//将组件添加到界面
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(panel1,BorderLayout.NORTH);
this.getContentPane().add(panel2, BorderLayout.CENTER);
this.getContentPane().add(panel3, BorderLayout.SOUTH);
this.pack();
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception e){
e.printStackTrace();
}
}
//处理按钮事件
public void actionPerformed(ActionEvent event){
Object source=event.getSource();
if(source==connectButton){
//如果点击连接按钮
if(socket==null){
try{
socket=new Socket(ipTextField.getText(),5000);
System.out.println(socket);
ps=new PrintStream(socket.getOutputStream());
//pw=new PrintWriter(socket.getOutputStream());
listener=new ClientListener(this,nameTextField.getText(),socket);
listener.start();
}catch(IOException e){
System.out.println("Error:"+e);
disconnect();
}
}
}else if(source==disconnectButton){
disconnect();
}else if(source==sendMsgButton){
String msg=msgTextField.getText();//nameTextField.getText()+InetAddress.getLocalHost().getHostAddress();+msgTextField.getText();
ps.println(msg);
ps.flush();
//StringBuffer msg=new StringBuffer(nameTextField.getText()
//).append("InetAddress.getLocalHost().getHostAddress()");
//pw.println(msg);//.append(msgTextField.getText()));
}
}
public void disconnect(){
if(socket!=null){
try{
socket.close();
listener.toStop();
socket=null;
}catch(IOException e){
System.out.println("Error:"+e);
}
}
}
public static void main(String args[]){
CClient client=new CClient();
client.setVisible(true);
}
//客户端线程用来监听服务器传来的 信息
class ClientListener extends Thread{
String name=null;
BufferedReader br=null;
PrintStream ps=null;
Socket socket=null;
CClient parent=null;
boolean running=true;
//构造方法
public ClientListener(CClient p,String n,Socket s){
//接受参数
parent=p;
name=n;
socket=s;
try{
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
ps=new PrintStream(s.getOutputStream());
}catch(IOException e){
System.out.println("ERROR:"+e);
parent.disconnect();
}
}
//停止监听
public void toStop(){
this.running=false;
}
//线程运行方法
public void run(){
String msg=null;
while(running){
msg=null;
try{
//读取从服务器传来的信息
msg=br.readLine();
System.out.println("receive msg:"+msg);
parent.chatContentTextArea.append(msg);
}catch(IOException e){
System.out.println("ERROR:"+e);
parent.disconnect();
}
}
}
}
}
import java.io.*;
import java.net.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Event;
import java.util.*;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.*;
public class CServer extends JFrame{
//保存当前处理客户端请求的处理器线程
static Vector clientProcessors=new Vector(10);
//当前的连接数
static int activeConnects=0;
//构造方法
public CServer(){
}
//主方法
public static void main(String args[]){
CServer chatServer1=new CServer();
chatServer1.setVisible(true);
System.out.println("server starting........");
Socket socket=null;
ServerSocket server=null;
try{
//服务器端开始侦听
server=new ServerSocket(5000);
}catch(IOException e){
System.out.println("Error"+e);
System.exit(1);
}
while(true){
try{
socket=server.accept();
if(socket!=null)
{
System.out.println(socket+"连接");
}
}catch(IOException e){
System.out.println("Error"+e);
}
ClientProcessor c=new ClientProcessor(socket);
c.start();
//sendMsgToClients(msg);
}
}
//关闭所有连接
public static void closeAll(){
while(clientProcessors.size()>0){
ClientProcessor c=(ClientProcessor) clientProcessors.firstElement();
try{
//关闭socket连接和处理线程
c.socket.close();
c.toStop();
}catch(IOException e){
System.out.println("Error:"+e);
}finally{
clientProcessors.removeElement(c);
}
}
}
//向所有用户群发消息
public static synchronized void sendMsgToClients(String msg){
//msg=null;
for(int i=0;i<clientProcessors.size();i++){
ClientProcessor c=(ClientProcessor) clientProcessors.elementAt(i);
System.out.println("send msg"+msg);
c.send(msg);
}
}
public static void disConnect(ClientProcessor client){
disConnect(client,true);
}
public static synchronized void disConnect(ClientProcessor client,
boolean toRemoveFromList){
try{
client.socket.close();
}catch(IOException e){
System.out.println("Error"+e);
}
}
}
//处理客户端发送的请求的线程
class ClientProcessor extends Thread{
Socket socket;
BufferedReader br;
PrintWriter pw;
boolean running=true;
String usr=null;
public void send(String msg){
usr=msg;
try{
usr=br.readLine();
}catch(IOException e){
System.out.println("Error:"+e);
CServer.disConnect(this);
}
pw.println(msg);
}
//构造方法
public ClientProcessor(Socket s){
socket=s;
try{
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw=new PrintWriter(socket.getOutputStream());
//usr=br.readLine();
}catch(IOException e){
System.out.println("Error:"+e);
}
}
public void run(){
while(running){
String line=null;
try{
line=br.readLine();
System.out.println(line);
}catch(IOException e){
System.out.println("Error:"+e);
CServer.disConnect(this);
}
CServer.sendMsgToClients(line);
}
}
public void toStop(){
running=false;
}
}
客户端
package book.net.chat;
import java.io.*;
import java.net.Socket;
import java.net.InetAddress;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.StringTokenizer;
import javax.swing.border.TitledBorder;
public class CClient extends JFrame implements ActionListener{
JLabel nameLabel=new JLabel();
JLabel ipLabel=new JLabel();
JTextField nameTextField=new JTextField(15);
JTextField ipTextField=new JTextField(15);
JTextField msgTextField=new JTextField(30);
JButton connectButton=new JButton();
JButton disconnectButton=new JButton();
JTextArea chatContentTextArea=new JTextArea(15,40);
JButton sendMsgButton=new JButton();
JLabel msgLabel=new JLabel();
java.awt.List peopleList=new java.awt.List(15);
Socket socket=null;
PrintStream ps=null;
ClientListener listener=null;
//构造函数
public CClient(){
init();
}
//图形界面
public void init(){
this.setTitle("聊天室客户端");
//初始化按钮和标签
nameLabel.setText("姓名");
ipLabel.setText("IP");
connectButton.setText("连接");
connectButton.addActionListener(this);
disconnectButton.setText("断开");
disconnectButton.addActionListener(this);
//设置聊天内容不可编辑
chatContentTextArea.setEditable(false);
sendMsgButton.setText("发送");
sendMsgButton.addActionListener(this);
msgTextField.setText("请输入聊天信息");
//pane1放置输入姓名和连接两个按钮
JPanel panel1=new JPanel();
panel1.setLayout(new FlowLayout());
panel1.add(nameLabel);
panel1.add(nameTextField);
panel1.add(ipLabel);
panel1.add(ipTextField);
panel1.add(connectButton);
panel1.add(disconnectButton);
//用于放置聊天信息显示和聊天人员列表
JPanel panel2=new JPanel();
panel2.setLayout(new FlowLayout());
JScrollPane pane1=new JScrollPane(chatContentTextArea);
pane1.setBorder(new TitledBorder(BorderFactory.createEtchedBorder
(Color.white,new Color(134,134,134)),"聊天内容"));
panel2.add(pane1);
JScrollPane pane2=new JScrollPane(peopleList);
pane2.setBorder(new TitledBorder(BorderFactory.createEtchedBorder
(Color.white,new Color(134,134,134)),"用户列表"));
panel2.add(pane2);
//用于放置发送信息区域
JPanel panel3=new JPanel();
panel3.setLayout(new FlowLayout());
panel3.add(msgLabel);
panel3.add(msgTextField);
panel3.add(sendMsgButton);
//将组件添加到界面
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(panel1,BorderLayout.NORTH);
this.getContentPane().add(panel2, BorderLayout.CENTER);
this.getContentPane().add(panel3, BorderLayout.SOUTH);
this.pack();
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception e){
e.printStackTrace();
}
}
//处理按钮事件
public void actionPerformed(ActionEvent event){
Object source=event.getSource();
if(source==connectButton){
//如果点击连接按钮
if(socket==null){
try{
socket=new Socket(ipTextField.getText(),5000);
System.out.println(socket);
ps=new PrintStream(socket.getOutputStream());
//pw=new PrintWriter(socket.getOutputStream());
listener=new ClientListener(this,nameTextField.getText(),socket);
listener.start();
}catch(IOException e){
System.out.println("Error:"+e);
disconnect();
}
}
}else if(source==disconnectButton){
disconnect();
}else if(source==sendMsgButton){
String msg=msgTextField.getText();//nameTextField.getText()+InetAddress.getLocalHost().getHostAddress();+msgTextField.getText();
ps.println(msg);
ps.flush();
//StringBuffer msg=new StringBuffer(nameTextField.getText()
//).append("InetAddress.getLocalHost().getHostAddress()");
//pw.println(msg);//.append(msgTextField.getText()));
}
}
public void disconnect(){
if(socket!=null){
try{
socket.close();
listener.toStop();
socket=null;
}catch(IOException e){
System.out.println("Error:"+e);
}
}
}
public static void main(String args[]){
CClient client=new CClient();
client.setVisible(true);
}
//客户端线程用来监听服务器传来的 信息
class ClientListener extends Thread{
String name=null;
BufferedReader br=null;
PrintStream ps=null;
Socket socket=null;
CClient parent=null;
boolean running=true;
//构造方法
public ClientListener(CClient p,String n,Socket s){
//接受参数
parent=p;
name=n;
socket=s;
try{
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
ps=new PrintStream(s.getOutputStream());
}catch(IOException e){
System.out.println("ERROR:"+e);
parent.disconnect();
}
}
//停止监听
public void toStop(){
this.running=false;
}
//线程运行方法
public void run(){
String msg=null;
while(running){
msg=null;
try{
//读取从服务器传来的信息
msg=br.readLine();
System.out.println("receive msg:"+msg);
parent.chatContentTextArea.append(msg);
}catch(IOException e){
System.out.println("ERROR:"+e);
parent.disconnect();
}
}
}
}
}
相关文章推荐
- 记一个简单的小问题 win10 java环境搭建问题
- 简单java问题
- java 接口实现简单并能说明问题的例子
- 我来请教一个简单java问题,求解答
- java面试,简单问题
- Java简单操作mysql数据库代码存档+处理中文乱码问题
- 一些简单的java编程题(3) ————小球落地问题
- jsp实现简单的Java web聊天室程序源码
- java网络编程——Socket和ServerSocket,套接字编程——简单聊天室
- java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
- 关于javaweb中简单的跨域问题
- 我的第一篇博客,java面向对象来解决简单的问题--杭电2001
- 遗传规划方面的高手帮忙!几个java编程遇到的问题!
- 利用JAVA线程安全队列简单实现读者写者问题。
- Java简单剪刀石头布问题
- Java静态属性、静态方法、非静态属性、非静态方法的继承问题简单了解
- 一些简单的java编程题(2) ————古典问题(兔子问题)
- java面试常问的问题,欢迎补充
- java简单实现Http服务器,及遇到的问题
- Android开发过程中遇到的问题和自己的解决办法,简单总结,欢迎借鉴