要JAVA聊天程序代码,急用

要JAVA聊天程序代码,急用,第1张

import java.io.InputStream

import java.io.DataInputStream

import java.io.InputStreamReader

import java.io.OutputStream

import java.io.DataOutputStream

import java.io.BufferedReader

import java.net.ServerSocket

import java.net.Socket

import java.io.IOException

import java.util.Date

class Server

{

public Server()

{

try

{

ServerSocket s=new ServerSocket(8888)

Socket ss=s.accept()

OutputStream out=ss.getOutputStream()

DataOutputStream dout=new DataOutputStream(out)

InputStream in=ss.getInputStream()

DataInputStream din=new DataInputStream(in)

System.out.print(din.readUTF()+"!")

dout.writeUTF("你已经连接到服务器"+"\t"+"你的地址:"+ss.getInetAddress()+"\t"

+"你的链接端口:"+ss.getLocalPort()+"\n")

new ReadMessage(din).start()

new SendMessage(dout).start()

}

catch (IOException e)

{

e.printStackTrace()

}

}

public static void main(String[] args)

{

new Server()

}

}

//接受客户端信息

class ReadMessage extends Thread

{

private DataInputStream din

public ReadMessage(DataInputStream din)

{

this.din=din

}

public void run()

{

String str

try

{

while (true)

{

str=din.readUTF()

System.out.println(new Date().toLocaleString()+"客户端说:"+str)

if (str.equals("bye"))

{

System.out.println("客户端下线!")

break

}

}

}

catch (IOException e)

{

e.printStackTrace()

}

}

}

// 发出服务器信息

class SendMessage extends Thread

{

private DataOutputStream dout

public SendMessage(DataOutputStream dout)

{

this.dout=dout

}

public void run()

{

InputStreamReader inr=new InputStreamReader(System.in)

BufferedReader buf=new BufferedReader(inr)

String str

try

{

while(true)

{

str=buf.readLine()

dout.writeUTF(str)

if (str.equals("bye"))

{

System.out.println("服务器退出!")

System.exit(1)

}

}

}

catch (IOException e)

{

e.printStackTrace()

}

}

}

import java.io.InputStream

import java.io.DataInputStream

import java.io.InputStreamReader

import java.io.OutputStream

import java.io.DataOutputStream

import java.io.BufferedReader

import java.net.Socket

import java.io.IOException

import java.util.Date

class Client

{

public Client()

{

try

{

Socket s=new Socket("192.168.1.2",8888)

InputStream in=s.getInputStream()

DataInputStream din=new DataInputStream(in)

OutputStream out=s.getOutputStream()

DataOutputStream dout=new DataOutputStream(out)

dout.writeUTF("服务器你好!我是客户端")

System.out.println(din.readUTF())

new Thread(new SenderMessage(dout)).start()

new Thread(new ReaderMessage(din)).start()

}

catch (IOException e)

{

e.printStackTrace()

}

}

public static void main(String[] args)

{

new Client()

}

}

class ReaderMessage implements Runnable

{

private DataInputStream din

public ReaderMessage(DataInputStream din)

{

this.din=din

}

public void run()

{

String str

try

{

while(true)

{

str=din.readUTF()

System.out.println(new Date().toLocaleString()+"服务器说:"+str)

if (str.equals("bye"))

{

System.out.println("服务器已经关闭,此程序自动退出!")

break

}

}

}

catch (IOException e)

{

e.printStackTrace()

}

}

}

class SenderMessage implements Runnable

{

private DataOutputStream dout

public SenderMessage(DataOutputStream dout)

{

this.dout=dout

}

public void run()

{

String str

InputStreamReader inf=new InputStreamReader(System.in)

BufferedReader buf=new BufferedReader(inf)

try

{

while (true)

{

str=buf.readLine()

dout.writeUTF(str)

if (str.equals("bye"))

{

System.out.println("客户端自己退出!")

System.exit(1)

}

}

}

catch (IOException e)

{

e.printStackTrace()

}

}

}

共四个java文件,源代码如下:

import java.awt.*

import java.net.*

import java.awt.event.*

import java.io.*

import java.util.Hashtable

public class ChatArea extends Panel implements ActionListener,Runnable

{

Socket socket=null

DataInputStream in=null

DataOutputStream out=null

Thread threadMessage=null

TextArea 谈话显示区,私聊显示区=null

TextField 送出信息=null

Button 确定,刷新谈话区,刷新私聊区

Label 提示条=null

String name=null

Hashtable listTable

List listComponent=null

Choice privateChatList

int width,height

public ChatArea(String name,Hashtable listTable,int width,int height)

{

setLayout(null)

setBackground(Color.orange)

this.width=width

this.height=height

setSize(width,height)

this.listTable=listTable

this.name=name

threadMessage=new Thread(this)

谈话显示区=new TextArea(10,10)

私聊显示区=new TextArea(10,10)

确定=new Button("送出信息到:")

刷新谈话区=new Button("刷新谈话区")

刷新私聊区=new Button("刷新私聊区")

提示条=new Label("双击聊天者可私聊",Label.CENTER)

送出信息=new TextField(28)

确定.addActionListener(this)

送出信息.addActionListener(this)

刷新谈话区.addActionListener(this)

刷新私聊区.addActionListener(this)

listComponent=new List()

listComponent.addActionListener(this)

privateChatList=new Choice()

privateChatList.add("大家(*)")

privateChatList.select(0)

add(谈话显示区)

谈话显示区.setBounds(10,10,(width-120)/2,(height-120))

add(私聊显示区)

私聊显示区.setBounds(10+(width-120)/2,10,(width-120)/2,(height-120))

add(listComponent)

listComponent.setBounds(10+(width-120),10,100,(height-160))

add(提示条)

提示条.setBounds(10+(width-120),10+(height-160),110,40)

Panel pSouth=new Panel()

pSouth.add(送出信息)

pSouth.add(确定)

pSouth.add(privateChatList)

pSouth.add(刷新谈话区)

pSouth.add(刷新私聊区)

add(pSouth)

pSouth.setBounds(10,20+(height-120),width-20,60)

}

public void setName(String s)

{

name=s

}

public void setSocketConnection(Socket socket,DataInputStream in,DataOutputStream out)

{

this.socket=socket

this.in=in

this.out=out

try

{

threadMessage.start()

}

catch(Exception e)

{

}

}

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==确定||e.getSource()==送出信息)

{

String message=""

String people=privateChatList.getSelectedItem()

people=people.substring(0,people.indexOf("("))

message=送出信息.getText()

if(message.length()>0)

{

try {

if(people.equals("大家"))

{

out.writeUTF("公共聊天内容:"+name+"说:"+message)

}

else

{

out.writeUTF("私人聊天内容:"+name+"悄悄地说:"+message+"#"+people)

}

}

catch(IOException event)

{

}

}

}

else if(e.getSource()==listComponent)

{

privateChatList.insert(listComponent.getSelectedItem(),0)

privateChatList.repaint()

}

else if(e.getSource()==刷新谈话区)

{

谈话显示区.setText(null)

}

else if(e.getSource()==刷新私聊区)

{

私聊显示区.setText(null)

}

}

public void run()

{

while(true)

{

String s=null

try

{

s=in.readUTF()

if(s.startsWith("聊天内容:"))

{

String content=s.substring(s.indexOf(":")+1)

谈话显示区.append("\n"+content)

}

if(s.startsWith("私人聊天内容:"))

{

String content=s.substring(s.indexOf(":")+1)

私聊显示区.append("\n"+content)

}

else if(s.startsWith("聊天者:"))

{

String people=s.substring(s.indexOf(":")+1,s.indexOf("性别"))

String sex=s.substring(s.indexOf("性别")+2)

listTable.put(people,people+"("+sex+")")

listComponent.add((String)listTable.get(people))

listComponent.repaint()

}

else if(s.startsWith("用户离线:"))

{

String awayPeopleName=s.substring(s.indexOf(":")+1)

listComponent.remove((String)listTable.get(awayPeopleName))

listComponent.repaint()

谈话显示区.append("\n"+(String)listTable.get(awayPeopleName)+"离线")

listTable.remove(awayPeopleName)

}

Thread.sleep(5)

}

catch(IOException e)

{

listComponent.removeAll()

listComponent.repaint()

listTable.clear()

谈话显示区.setText("和服务器的连接已中断\n必须刷新浏览器才能再次聊天")

break

}

catch(InterruptedException e)

{

}

}

}

}

ChatServer.java

import java.io.*

import java.net.*

import java.util.*

public class ChatServer

{

public static void main(String args[])

{

ServerSocket server=null

Socket you=null

Hashtable peopleList

peopleList=new Hashtable()

while(true)

{

try

{

server=new ServerSocket(6666)

}

catch(IOException e1)

{

System.out.println("正在监听")

}

try {

you=server.accept()

InetAddress address=you.getInetAddress()

System.out.println("用户的IP:"+address)

}

catch (IOException e)

{

}

if(you!=null)

{

Server_thread peopleThread=new Server_thread(you,peopleList)

peopleThread.start()

}

else {

continue

}

}

}

}

class Server_thread extends Thread

{

String name=null,sex=null

Socket socket=null

File file=null

DataOutputStream out=null

DataInputStream in=null

Hashtable peopleList=null

Server_thread(Socket t,Hashtable list)

{

peopleList=list

socket=t

try {

in=new DataInputStream(socket.getInputStream())

out=new DataOutputStream(socket.getOutputStream())

}

catch (IOException e)

{

}

}

public void run()

{

while(true)

{String s=null

try

{

s=in.readUTF()

if(s.startsWith("姓名:"))

{

name=s.substring(s.indexOf(":")+1,s.indexOf("性别"))

sex=s.substring(s.lastIndexOf(":")+1)

boolean boo=peopleList.containsKey(name)

if(boo==false)

{

peopleList.put(name,this)

out.writeUTF("可以聊天:")

Enumeration enum=peopleList.elements()

while(enum.hasMoreElements())

{

Server_thread th=(Server_thread)enum.nextElement()

th.out.writeUTF("聊天者:"+name+"性别"+sex)

if(th!=this)

{

out.writeUTF("聊天者:"+th.name+"性别"+th.sex)

}

}

}

else

{

out.writeUTF("不可以聊天:")

}

}

else if(s.startsWith("公共聊天内容:"))

{

String message=s.substring(s.indexOf(":")+1)

Enumeration enum=peopleList.elements()

while(enum.hasMoreElements())

{

((Server_thread)enum.nextElement()).out.writeUTF("聊天内容:"+message)

}

}

else if(s.startsWith("用户离开:"))

{

Enumeration enum=peopleList.elements()

while(enum.hasMoreElements())

{ try

{

Server_thread th=(Server_thread)enum.nextElement()

if(th!=this&&th.isAlive())

{

th.out.writeUTF("用户离线:"+name)

}

}

catch(IOException eee)

{

}

}

peopleList.remove(name)

socket.close()

System.out.println(name+"用户离开了")

break

}

else if(s.startsWith("私人聊天内容:"))

{

String 悄悄话=s.substring(s.indexOf(":")+1,s.indexOf("#"))

String toPeople=s.substring(s.indexOf("#")+1)

Server_thread toThread=(Server_thread)peopleList.get(toPeople)

if(toThread!=null)

{

toThread.out.writeUTF("私人聊天内容:"+悄悄话)

}

else

{

out.writeUTF("私人聊天内容:"+toPeople+"已经离线")

}

}

}

catch(IOException ee)

{

Enumeration enum=peopleList.elements()

while(enum.hasMoreElements())

{ try

{

Server_thread th=(Server_thread)enum.nextElement()

if(th!=this&&th.isAlive())

{

th.out.writeUTF("用户离线:"+name)

}

}

catch(IOException eee)

{

}

}

peopleList.remove(name)

try

{

socket.close()

}

catch(IOException eee)

{

}

System.out.println(name+"用户离开了")

break

}

}

}

}

import java.awt.*

import java.io.*

import java.net.*

import java.applet.*

import java.util.Hashtable

ClientChat.java

public class ClientChat extends Applet implements Runnable

{

Socket socket=null

DataInputStream in=null

DataOutputStream out=null

InputNameTextField 用户提交昵称界面=null

ChatArea 用户聊天界面=null

Hashtable listTable

Label 提示条

Panel north, center

Thread thread

public void init()

{

int width=getSize().width

int height=getSize().height

listTable=new Hashtable()

setLayout(new BorderLayout())

用户提交昵称界面=new InputNameTextField(listTable)

int h=用户提交昵称界面.getSize().height

用户聊天界面=new ChatArea("",listTable,width,height-(h+5))

用户聊天界面.setVisible(false)

提示条=new Label("正在连接到服务器,请稍等...",Label.CENTER)

提示条.setForeground(Color.red)

north=new Panel(new FlowLayout(FlowLayout.LEFT))

center=new Panel()

north.add(用户提交昵称界面)

north.add(提示条)

center.add(用户聊天界面)

add(north,BorderLayout.NORTH)

add(center,BorderLayout.CENTER)

validate()

}

public void start()

{

if(socket!=null&&in!=null&&out!=null)

{ try

{

socket.close()

in.close()

out.close()

用户聊天界面.setVisible(false)

}

catch(Exception ee)

{

}

}

try

{

socket = new Socket(this.getCodeBase().getHost(), 6666)

in=new DataInputStream(socket.getInputStream())

out=new DataOutputStream(socket.getOutputStream())

}

catch (IOException ee)

{

提示条.setText("连接失败")

}

if(socket!=null)

{

InetAddress address=socket.getInetAddress()

提示条.setText("连接:"+address+"成功")

用户提交昵称界面.setSocketConnection(socket,in,out)

north.validate()

}

if(thread==null)

{

thread=new Thread(this)

thread.start()

}

}

public void stop()

{

try

{

socket.close()

thread=null

}

catch(IOException e)

{

this.showStatus(e.toString())

}

}

public void run()

{

while(thread!=null)

{

if(用户提交昵称界面.get能否聊天()==true)

{

用户聊天界面.setVisible(true)

用户聊天界面.setName(用户提交昵称界面.getName())

用户聊天界面.setSocketConnection(socket,in,out)

提示条.setText("祝聊天愉快!")

center.validate()

break

}

try

{

Thread.sleep(100)

}

catch(Exception e)

{

}

}

}

}

InputNameTextField。java

import java.awt.*

import java.net.*

import java.awt.event.*

import java.io.*

import java.util.Hashtable

public class InputNameTextField extends Panel implements ActionListener,Runnable

{

TextField nameFile=null

String name=null

Checkbox male=null,female=null

CheckboxGroup group=null

Button 进入聊天室=null,退出聊天室=null

Socket socket=null

DataInputStream in=null

DataOutputStream out=null

Thread thread=null

boolean 能否聊天=false

Hashtable listTable

public InputNameTextField(Hashtable listTable)

{

this.listTable=listTable

nameFile=new TextField(10)

group=new CheckboxGroup()

male=new Checkbox("男",true,group)

female=new Checkbox("女",false,group)

进入聊天室=new Button("进入")

退出聊天室=new Button("退出")

进入聊天室.addActionListener(this)

退出聊天室.addActionListener(this)

thread=new Thread(this)

add(new Label("昵称:"))

add(nameFile)

add(male)

add(female)

add(进入聊天室)

add(退出聊天室)

退出聊天室.setEnabled(false)

}

public void set能否聊天(boolean b)

{

能否聊天=b

}

public boolean get能否聊天()

{

return 能否聊天

}

public String getName()

{

return name

}

public void setName(String s)

{

name=s

}

public void setSocketConnection(Socket socket,DataInputStream in,DataOutputStream out)

{

this.socket=socket

this.in=in

this.out=out

try{

thread.start()

}

catch(Exception e)

{

nameFile.setText(""+e)

}

}

public Socket getSocket()

{

return socket

}

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==进入聊天室)

{

退出聊天室.setEnabled(true)

if(能否聊天==true)

{

nameFile.setText("您正在聊天:"+name)

}

else

{

this.setName(nameFile.getText())

String sex=group.getSelectedCheckbox().getLabel()

if(socket!=null&&name!=null)

{

try{

out.writeUTF("姓名:"+name+"性别:"+sex)

}

catch(IOException ee)

{

nameFile.setText("没有连通服务器"+ee)

}

}

}

}

if(e.getSource()==退出聊天室)

{

try

{

out.writeUTF("用户离开:")

}

catch(IOException ee)

{

}

}

}

public void run()

{

String message=null

while(true)

{

if(in!=null)

{

try

{

message=in.readUTF()

}

catch(IOException e)

{

nameFile.setText("和服务器断开"+e)

}

}

if(message.startsWith("可以聊天:"))

{

能否聊天=true

break

}

else if(message.startsWith("聊天者:"))

{

String people=message.substring(message.indexOf(":")+1)

listTable.put(people,people)

}

else if(message.startsWith("不可以聊天:"))

{

能否聊天=false

nameFile.setText("该昵称已被占用")

}

}

}

}

话说网上真的好多啊...

package client

import java.awt.Color

import java.awt.Container

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.IOException

import java.net.Socket

import java.util.Date

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JOptionPane

import javax.swing.JScrollPane

import javax.swing.JTextArea

import javax.swing.JTextField

public class ClientFrame extends JFrame{

private JTextArea allmsg

private JTextField welcome,copyright,chatmsg

private JButton send

private JScrollPane js

private boolean isConnected = true

public DataOutputStream out

public DataInputStream in

public Socket s = null

String nic /* -- 保存用户昵称 --*/

/**

* 初始化客户端资源

* 1.获取从LoginFrame传递过来的参数

* 2.初始化界面元素

* 3.初始化通信所需要的资源 EG:输入/输出流(DataInputStream/DataOutputStream)

* */

public ClientFrame(String name,Socket socket)

{

this.setSize(310,660)

this.setLocation(290,50)

this.setTitle("聊天室客户端<"+name+">")/* -- 指定窗口的标题 --*/

this.s = socket/* -- 接收从LoginFrame中传递过来的Socket --*/

this.nic = name+" 说: "

welcome = new JTextField(" <"+name+" >欢迎您来到聊天室 ",100)

welcome.setBackground(Color.blue)

welcome.setEnabled(false)

copyright = new JTextField(" ----- all copyright @ TOP-king -----")

copyright.setEnabled(false)

allmsg = new JTextArea()

allmsg.setEditable(false)

allmsg.append(" 系统消息: 欢迎登录在线聊天室 \n")

js = new JScrollPane(allmsg)//为JTextArea添加滚动条

chatmsg = new JTextField("在此输入聊天信息")

chatmsg.addActionListener(new listen())

send = new JButton("发送")

send.addActionListener(new listen())/* -- 添加事件监听器 --*/

try {

out = new DataOutputStream(s.getOutputStream())

in = new DataInputStream(s.getInputStream())

} catch (IOException e) {JOptionPane.showMessageDialog(null, "系统异常","错误",JOptionPane.OK_CANCEL_OPTION)}

addcomponettocontainer()

/* -- 当用户关闭窗口时进行相关的处理 eg:Socket Data(Input/Output)Stream 的关闭--*/

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent we)

{

sendmsg("quit&logout")/* -- 向服务器端发送关闭信息 --*/

isConnected = false

destory()/* -- 销毁窗口资源 --*/

}

})

new Thread(new linread()).start()/* -- 启动读取信息线程 --*/

}

public void addcomponettocontainer()

{

Container c = this.getContentPane()

c.setLayout(null)

welcome.setBounds(75,10,150,20)

js.setBounds(10,50,280,500)

chatmsg.setBounds(10,560,180,30)

send.setBounds(220,560,70,30)

copyright.setBounds(10,600,280,20)

c.add(welcome)

c.add(js)

c.add(chatmsg)

c.add(send)

c.add(copyright)

this.setVisible(true)

this.setResizable(false)

}

class listen implements ActionListener

{

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if(e.getSource()==send||e.getSource()==chatmsg)

{

String msg = chatmsg.getText().trim()

if("".equals(msg))

{

JOptionPane.showMessageDialog(null,"发送信息不能为空!","错误",JOptionPane.OK_OPTION)

}

else

{sendmsg((new Date()).toLocaleString()+"\n"+nic+msg+"\n")chatmsg.setText("")}

}

}

}

/* -- 向服务器端发送信息 --*/

public void sendmsg(String m)

{

if(isConnected)//如果socket的输出流没关闭

{

try {

out.writeUTF(m)

} catch (IOException e) {

JOptionPane.showMessageDialog(null,"发送信息失败!(系统异常)","错误",JOptionPane.OK_OPTION)

}

}

else

{

JOptionPane.showMessageDialog(null,"发送信息失败!(服务器关闭/网络故障)","错误",JOptionPane.OK_OPTION)

}

}

/* -- 读取信息线程 --*/

class linread implements Runnable

{

public void run()

{

read()

}

public void read()

{

while(isConnected)

{

try {

String msg = in.readUTF()

if("SYSTEM_CLOSED".equals(msg))

{

JOptionPane.showMessageDialog(null,"读取消息失败(服务器关闭/网络故障)!","错误",JOptionPane.OK_OPTION)

isConnected = false

}

else

allmsg.append(msg+"\n")

} catch (IOException e) {

}

}//end while

JOptionPane.showMessageDialog(null,"读取消息失败(服务器关闭/网络故障)!","错误",JOptionPane.OK_OPTION)

}//end read()

}

public void destory()

{

try {

this.out.close()

this.in.close()

this.s.close()

} catch (IOException e) {

}

this.dispose()

}

}

======================================================

package client

import java.awt.*

import javax.swing.*

import java.awt.event.*

import java.io.*

import java.net.*

public class LoginFrame extends JFrame{

private JTextField name

private JTextField ip

private JButton ok,cancle

public Socket socket

public LoginFrame()

{

super("登录框")

this.setSize(400,80)

this.setLocation(100,100)

name = new JTextField("昵称")

ip = new JTextField("127.0.0.1")

ok = new JButton("登录")

cancle = new JButton("取消")

ok.addActionListener(new listenEvent())

cancle.addActionListener(new listenEvent())

//建立容器

addcomponettocontainer()

this.setDefaultCloseOperation(EXIT_ON_CLOSE)

}

/**

* 建立容器及控件

*/

public void addcomponettocontainer()

{

Container c = this.getContentPane()

c.setLayout(null)

name.setBounds(10,10,100,30)

ip.setBounds(120,10,100,30)

ok.setBounds(230,10,70,30)

cancle.setBounds(310,10,70,30)

c.add(name)

c.add(ip)

c.add(ok)

c.add(cancle)

this.setVisible(true)

this.setResizable(false)

}

public class listenEvent implements ActionListener

{

public void actionPerformed(ActionEvent event) {

// TODO Auto-generated method stub

if(event.getSource()==ok)

{

String n = name.getText().trim()

String i = ip.getText().trim()

if("".equals(n)||"".equals(i))

{

JOptionPane.showMessageDialog(null,"昵称、IP不能够为空!","错误",JOptionPane.OK_OPTION)

}

else{login(n,i)}

}

if(event.getSource()==cancle)

{

name.setText("")

ip.setText("")

}

}

}

/**

* 进行登录

* @param name

* @param ip

*/

public void login(String name,String ip)

{

try {

socket = new Socket(ip,7777)

DataOutputStream out = new DataOutputStream(socket.getOutputStream())

out.writeUTF(name)

out.flush()//强制输出缓存中的内容

//out.close()

new ClientFrame(name,socket)

destroywindow()

} catch (UnknownHostException e) {

JOptionPane.showMessageDialog(null,"找不到主机地址(IP错误/网络故障)!","错误",JOptionPane.OK_OPTION)

} catch (IOException e) {

}

}

public void destroywindow()

{

this.dispose()

}

public static void main(String[] args)

{

new LoginFrame()

}

}

==================================================

package server

import java.awt.Container

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.IOException

import java.net.ServerSocket

import java.net.Socket

import java.util.ArrayList

import java.util.Date

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JOptionPane

import javax.swing.JScrollPane

import javax.swing.JTextArea

import javax.swing.JTextField

public class ServerFrame extends JFrame{

/**

*

*/

private static final long serialVersionUID = 1L

private JTextArea allmsg

private JTextField currnum,totalnum,copyright,chatmsg

private JButton send

private JScrollPane js

int num1,num2,port/* -- num1:当前在线人数 num2:总上线人数 port:服务端口号 --*/

private ServerSocket ss

ArrayList<user>lists//存放所有在线用户

public ServerFrame()

{

super("聊天室服务器端")

this.setSize(310,660)

this.setLocation(200,50)

lists = new ArrayList<user>()

num1 = num2 =0

port = 7777

currnum = new JTextField(" 当前在线人数: "+num1)

currnum.setEnabled(false)

totalnum = new JTextField(" 上线总人数: "+num2)

totalnum.setEnabled(false)

copyright = new JTextField(" ----- all copyright @ TOP-king -----")

copyright.setEnabled(false)

allmsg = new JTextArea()

allmsg.append(" --------------- 系统消息 --------------\n")

allmsg.setEditable(false)

allmsg.setLineWrap(true)//允许自动换行

js = new JScrollPane(allmsg)//为JTextArea添加滚动条

chatmsg = new JTextField("在此输入系统信息")

chatmsg.addActionListener(new ActionListener(){

@SuppressWarnings("deprecation")

public void actionPerformed(ActionEvent arg0) {

String str = chatmsg.getText().trim()

if(!"".equals(str))

{sendmsg((new Date()).toLocaleString()+" -- 系统消息: "+str)chatmsg.setText("")}

else

JOptionPane.showMessageDialog(null, "消息不能为空","错误",JOptionPane.OK_OPTION)

chatmsg.setText("")/* -- 发送信息后,将输入栏中的信息清空 -- */

}

})

send = new JButton("发送")

send.addActionListener(new ActionListener(){

@SuppressWarnings("deprecation")

public void actionPerformed(ActionEvent arg0) {

String str = chatmsg.getText().trim()

if(!"".equals(str))

{sendmsg((new Date()).toLocaleString()+" -- 系统消息: "+str)chatmsg.setText("")}

else

JOptionPane.showMessageDialog(null, "消息不能为空","错误",JOptionPane.OK_OPTION)

chatmsg.setText("")/* -- 发送信息后,将输入栏中的信息清空 -- */

}

})

//建立容器

addcomponettocontainer()

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent we)

{

sendmsg("SYSTEM_CLOSED")/* -- 向客户端发送服务器关闭信息 -- */

destory()

}

})

start()/* -- 启动连接服务 -- */

}

public void addcomponettocontainer()

{

//Container建立容器

Container c = this.getContentPane()

c.setLayout(null)

currnum.setBounds(20,15,130,20)

totalnum.setBounds(155,15,125,20)

js.setBounds(10,50,280,500)

chatmsg.setBounds(10,560,180,30)

send.setBounds(220,560,70,30)

copyright.setBounds(10,600,280,20)

c.add(currnum)

c.add(totalnum)

c.add(js)

c.add(chatmsg)

c.add(send)

c.add(copyright)

this.setVisible(true)

this.setResizable(false)

}

/**

* start()方法监听客户的连接

* 并且保存客户端的相关信息EG:用户昵称、用户所使用的Socket

* 用户连接到服务器成功之后,将其保存到用户列表中,并为该用户启动一个线程用于通信 */

@SuppressWarnings("deprecation")

public void start()

{

boolean isStarted = false/* -- 用于标记服务器是否已经正常启动 -- */

try {

this.ss = new ServerSocket(port)

isStarted = true

this.allmsg.append((new Date()).toLocaleString()+"服务器启动 @ 端口: "+port+"\n")

while(isStarted)

{

Socket client = this.ss.accept()/* -- 监听客户端的连接 -- */

DataInputStream in = new DataInputStream(client.getInputStream())

String name = in.readUTF()

user u = new user()

u.name = name

u.socket = client

lists.add(u)//将该用户加到列表中去

num1++

num2++

currnum.setText(" 当前在线人数: "+num1)

totalnum.setText(" 上线总人数: "+num2)

this.allmsg.append((new Date()).toLocaleString()+" : "+u.name+" 登录 \n")

new Thread(new ClientThread(u)).start()/* -- 为该用户启动一个通信线程 -- */

}

} catch (IOException e) {

System.out.println("服务器已经启动......")

System.exit(0)

}

}

/**

* 通信线程主要功能包括:

* 1.监听客户端输入的信息

* 2.将接收到的信息转发给其他用户 */

class ClientThread implements Runnable

{

user user = null

boolean isConnected = true

DataInputStream dis = null

DataOutputStream dos = null

public ClientThread(user u)

{

this.user = u

try {

this.dis = new DataInputStream(this.user.socket.getInputStream())

this.dos = new DataOutputStream(this.user.socket.getOutputStream())

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

}

public void run()

{

readmsg()

}

/* -- 读取客户的聊天信息 -- */

@SuppressWarnings("deprecation")

public void readmsg()

{

while(isConnected)

{

try {

String msg = dis.readUTF()

if("quit&logout".equals(msg))//当用户关闭客户端窗口时,发送quit字符串 表示用户已经退出

{

num1--

try{

this.dis.close()

this.dos.close()

this.user.socket.close()

this.isConnected = false

}catch(IOException ioe)

{

ioe.printStackTrace()

}finally{

this.isConnected = false

if(dis!=null) this.dis.close()

if(dos!=null) this.dos.close()

if(this.user.socket!=null) this.user.socket.close()

}

lists.remove(this.user)//从列表中删除该用户

currnum.setText(" 当前在线人数: "+num1)

allmsg.append((new Date()).toLocaleString()+" : "+this.user.name+" 退出\n")

}

else

sendmsg(msg)

} catch (IOException e) {

e.printStackTrace()

}

}

}

}

/* -- 将信息进行转发 -- */

public void sendmsg(String msg)

{

user us = new user()

DataOutputStream os = null

if(lists.size()>0)

{

for(int i=0i<lists.size()i++)

{

us = lists.get(i)

try {

os = new DataOutputStream(us.socket.getOutputStream())

os.writeUTF(msg)

} catch (IOException e) {

e.printStackTrace()

}

}

}

else

JOptionPane.showMessageDialog(null, "当前无用户在线。发送消息失败","失败",JOptionPane.OK_OPTION)

}

public void destory()

{

try {

this.ss.close()

} catch (IOException e) {

e.printStackTrace()

}

this.dispose()

}

public static void main(String[] args)

{

new ServerFrame()

}

}

=================================================

package server

import java.net.*

public class user {

String name

Socket socket

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11184627.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存