2013-11-27
展开全部
。。。这个我以前也遇到过、不过我是用C#写的、不过后来也有java的、你可以、使用Swing做的简单界面,及使用Socket套接字实现简单聊天 。。。。。。但是、我不知道你问的是C/S模式还是B/S 模式?
其中、B/S模式可以用Servlet来实现,思路是通过Context上下文绑定参数实现
而C/S模式的,是通过RMI远程调用的方法实现的。。。先给你个C/S模式的核心代码。。。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;public class Server extends JFrame
{
public static void main(String [] args)
{
Server server=new Server();
//设定框架的关闭方式
server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示框架
server.setVisible(true);
server.pack();
CreateServer cs=new CreateServer(server);
}
// 设定框架的宽度和高度
private static final int WIDTH=450;
private static final int HEIGHT=450;
// 聊天信息框
JTextArea mainArea=new JTextArea(12,35);
// 发送信息的填写框
JTextArea sendArea=new JTextArea(5,30);
// 构造函数
public Server()
{
//定位框架
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();//获取电脑当前分辨率
int width=screenSize.width;
int height=screenSize.height;
int x=(width-WIDTH)/2;
int y=(height-HEIGHT)/2;
//设置窗口显示位置
setLocation(x,y);
//设置框架大小
setSize(WIDTH,HEIGHT);
//设置标题
setTitle("小新新聊天服务器");
//设置窗口的自定义大小
setResizable(false);
//在内容表格上创建3个面板并加入到内容表格
Container con=this.getContentPane();
JPanel labelPanel=new LabelPanel();
con.add(labelPanel,BorderLayout.NORTH);
JPanel contentPanel=new ContentPanel();
con.add(contentPanel,BorderLayout.CENTER);
JPanel sendPanel=new SendPanel();
con.add(sendPanel,BorderLayout.SOUTH);
}
//聊天窗口的标题面板
class LabelPanel extends JPanel
{
public LabelPanel()
{
Font font=new Font("Dialog",Font.BOLD,18);
JLabel label=new JLabel("欢迎使用小新新聊天服务器");
label.setFont(font);
this.add(label);
}
}
// 聊天信息查看面板
//该面板内的区域为不可编辑区域
class ContentPanel extends JPanel
{
public ContentPanel()
{
FlowLayout fl=new FlowLayout(FlowLayout.CENTER);
this.setLayout(fl);
mainArea.setLineWrap(true);
mainArea.setEditable(false);
JScrollPane scrollPanel=new JScrollPane(mainArea);
this.add(scrollPanel);
}
}
// 填写发送信息的面板
class SendPanel extends JPanel
{
public SendPanel()
{
//面板的组件之间水平分隔15像素,垂直间距10像素
FlowLayout layout=new FlowLayout(FlowLayout.LEFT,15,10);
this.setLayout(layout);
sendArea.setLineWrap(true);
JScrollPane scrollPanel=new JScrollPane(sendArea);
this.add(scrollPanel);
JButton send=new JButton("发送");
this.add(send);
//对发送按钮注册动作监听器
send.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String msg=sendArea.getText();
if(!msg.equals(""))
{
mainArea.append("【服务器】:"+msg+"\n");
sendArea.setText("");
CreateServer.sendMsg(msg);
}
else
{
return;
}
}
});
}
}
}
//创建服务器ServerSocket的类
class CreateServer extends Thread
{
private Server server;
private static BufferedReader in=null;//存储客户端发送到服务器的数据
private static PrintWriter out=null;//存储服务器发送到客户端的数据
private Socket socket=null;//等待客户端连接socket
private ServerSocket ss=null;//开启服务器socket连接
//构造函数
public CreateServer(Server s)
{
this.server=s;
try
{
ss=new ServerSocket(2345);
System.out.println("服务器成功启动...!");
socket=ss.accept();//等待客户端请求
//获取输入到服务器的数据
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取输出到客户端的数据
out=new PrintWriter(socket.getOutputStream(),true);
out.println("你好!");
}
catch(Exception r)
{
r.printStackTrace();
}
this.start();//启动线程
}
//实现信息发送到客户端的发送方法
public static void sendMsg(String s)
{
try
{
out.println("【服务器】:"+s+"\n");
}
catch(Exception e)
{
System.out.println("发送信息失败...!!");
e.printStackTrace();
}
}
// 线程Thread类的run方法实现对客户端发送来的数据监听
//线程启动后开始该方法,执行线程体
public void run()
{
String msg="";
while(true)
{
try
{
msg=in.readLine();
//Thread.sleep(500);//线程睡眠
}
catch (SocketException ex)
{
ex.printStackTrace();
break;
}
catch(IOException r)
{
r.printStackTrace();
break;
}
//若从客户端获取的信息不为空对象也不为空串
//则把信息显示在聊天信息文本域
if(msg!=null && msg.trim()!="")
{
server.mainArea.append(msg+"\n");
}
}
}
}
其中、B/S模式可以用Servlet来实现,思路是通过Context上下文绑定参数实现
而C/S模式的,是通过RMI远程调用的方法实现的。。。先给你个C/S模式的核心代码。。。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;public class Server extends JFrame
{
public static void main(String [] args)
{
Server server=new Server();
//设定框架的关闭方式
server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示框架
server.setVisible(true);
server.pack();
CreateServer cs=new CreateServer(server);
}
// 设定框架的宽度和高度
private static final int WIDTH=450;
private static final int HEIGHT=450;
// 聊天信息框
JTextArea mainArea=new JTextArea(12,35);
// 发送信息的填写框
JTextArea sendArea=new JTextArea(5,30);
// 构造函数
public Server()
{
//定位框架
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();//获取电脑当前分辨率
int width=screenSize.width;
int height=screenSize.height;
int x=(width-WIDTH)/2;
int y=(height-HEIGHT)/2;
//设置窗口显示位置
setLocation(x,y);
//设置框架大小
setSize(WIDTH,HEIGHT);
//设置标题
setTitle("小新新聊天服务器");
//设置窗口的自定义大小
setResizable(false);
//在内容表格上创建3个面板并加入到内容表格
Container con=this.getContentPane();
JPanel labelPanel=new LabelPanel();
con.add(labelPanel,BorderLayout.NORTH);
JPanel contentPanel=new ContentPanel();
con.add(contentPanel,BorderLayout.CENTER);
JPanel sendPanel=new SendPanel();
con.add(sendPanel,BorderLayout.SOUTH);
}
//聊天窗口的标题面板
class LabelPanel extends JPanel
{
public LabelPanel()
{
Font font=new Font("Dialog",Font.BOLD,18);
JLabel label=new JLabel("欢迎使用小新新聊天服务器");
label.setFont(font);
this.add(label);
}
}
// 聊天信息查看面板
//该面板内的区域为不可编辑区域
class ContentPanel extends JPanel
{
public ContentPanel()
{
FlowLayout fl=new FlowLayout(FlowLayout.CENTER);
this.setLayout(fl);
mainArea.setLineWrap(true);
mainArea.setEditable(false);
JScrollPane scrollPanel=new JScrollPane(mainArea);
this.add(scrollPanel);
}
}
// 填写发送信息的面板
class SendPanel extends JPanel
{
public SendPanel()
{
//面板的组件之间水平分隔15像素,垂直间距10像素
FlowLayout layout=new FlowLayout(FlowLayout.LEFT,15,10);
this.setLayout(layout);
sendArea.setLineWrap(true);
JScrollPane scrollPanel=new JScrollPane(sendArea);
this.add(scrollPanel);
JButton send=new JButton("发送");
this.add(send);
//对发送按钮注册动作监听器
send.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String msg=sendArea.getText();
if(!msg.equals(""))
{
mainArea.append("【服务器】:"+msg+"\n");
sendArea.setText("");
CreateServer.sendMsg(msg);
}
else
{
return;
}
}
});
}
}
}
//创建服务器ServerSocket的类
class CreateServer extends Thread
{
private Server server;
private static BufferedReader in=null;//存储客户端发送到服务器的数据
private static PrintWriter out=null;//存储服务器发送到客户端的数据
private Socket socket=null;//等待客户端连接socket
private ServerSocket ss=null;//开启服务器socket连接
//构造函数
public CreateServer(Server s)
{
this.server=s;
try
{
ss=new ServerSocket(2345);
System.out.println("服务器成功启动...!");
socket=ss.accept();//等待客户端请求
//获取输入到服务器的数据
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取输出到客户端的数据
out=new PrintWriter(socket.getOutputStream(),true);
out.println("你好!");
}
catch(Exception r)
{
r.printStackTrace();
}
this.start();//启动线程
}
//实现信息发送到客户端的发送方法
public static void sendMsg(String s)
{
try
{
out.println("【服务器】:"+s+"\n");
}
catch(Exception e)
{
System.out.println("发送信息失败...!!");
e.printStackTrace();
}
}
// 线程Thread类的run方法实现对客户端发送来的数据监听
//线程启动后开始该方法,执行线程体
public void run()
{
String msg="";
while(true)
{
try
{
msg=in.readLine();
//Thread.sleep(500);//线程睡眠
}
catch (SocketException ex)
{
ex.printStackTrace();
break;
}
catch(IOException r)
{
r.printStackTrace();
break;
}
//若从客户端获取的信息不为空对象也不为空串
//则把信息显示在聊天信息文本域
if(msg!=null && msg.trim()!="")
{
server.mainArea.append(msg+"\n");
}
}
}
}
2013-11-27
展开全部
只给你讲理论的,线程知道不?客户端有一个线程,用于与服务器发送消息告诉服务器自己还在线;还有一个线程用于接收别人发来的消息;当你要发送消息的时候,还要有一个线程用于发送消息。服务器有一个线程用于接收客户端发来的消息;还要有一个线程,用于更新客户端们的好友列表;还有有一个线程,用于检查客户端们是否掉线。总之很复杂很复杂。Socket很简单,直接用就行,但是线程的问题是个麻烦的事情。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-27
展开全部
package Lesson3;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class TestServer { ArrayList<Client1> client = new ArrayList<Client1>();
boolean isStart = false;
ServerSocket server =null;
public void ConnectServer(){
try{
server = new ServerSocket(4444);
System.out.println("服务器已运行.......");
isStart = true;
while(isStart){
Socket s1 = server.accept();
System.out.println("一个客户端已连接");
Client1 th1 =new Client1(s1);
new Thread(th1).start();
client.add(th1);
}
}catch(Exception d){
}
}
public static void main(String[] args) {
new TestServer().ConnectServer();
}
class Client1 implements Runnable{
Socket c1;
DataOutputStream dout = null;
DataInputStream din = null;
boolean isConnect = false;
public Client1(Socket c1){
this.c1 = c1;
try {
dout = new DataOutputStream(c1.getOutputStream());
din = new DataInputStream(c1.getInputStream());
isConnect = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void send(String str){
try {
dout.writeUTF(str);
} catch (IOException e) {
client.remove(this);//移除该客户端
System.out.println("对方下线");
}
}
public void run() {
try{
while(isConnect){
String str = din.readUTF();
for(int i=0;i<client.size();i++){
Client1 c1 = client.get(i);
c1.send(str);
}
}
}catch(Exception d){
}finally{
try{
if(din!=null){
din .close();
din = null;
}
if(dout!=null){
dout.close();
dout = null;
}
if(c1!=null){
c1.close();
c1 = null;
}}catch(Exception d){
}
}
}
}
}以上是服务器的书写形式 package Lesson3;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;import com.util.Setjframe; public class TestClient extends JFrame implements ActionListener{
JTextField input;
JTextArea showContent;
Socket s1 = null;
DataOutputStream dout;
DataInputStream din;
boolean isConn = false;
public TestClient(){
Setjframe sf = new Setjframe("聊天系统",400,300);
input = new JTextField();
showContent = new JTextArea();
this.add(showContent,BorderLayout.CENTER);
this.add(input,BorderLayout.SOUTH);
input.addActionListener(this);
sf.setjframe(this);
connect();
new Thread(new R1()).start();
}
public static void main(String[] args) {
new TestClient(); }
public void actionPerformed(ActionEvent e) {
if(e.getSource()==input){
// showContent.setText(input.getText());
String str = input.getText().trim();
try {
dout.writeUTF(str);
dout.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
input.setText("");
}
}
//连接
public void connect(){
try {
s1 = new Socket(InetAddress.getByName("127.0.0.1"),4444);
dout = new DataOutputStream(s1.getOutputStream());
din = new DataInputStream(s1.getInputStream());
System.out.println("connected!");
isConn = true;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//断开
public void disConnect(){
try{
if(din!=null){
din .close();
din = null;
}
if(dout!=null){
dout.close();
dout = null;
}
if(s1!=null){
s1.close();
s1 = null;
}
}catch(Exception d){
}
}
class R1 implements Runnable{
public void run() {
while(isConn){
try {
String str = din.readUTF();
showContent.setText(showContent.getText() + "\n" + str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
以上是客户端的书写形式 程序运行时,显运行服务器,在客户端,可以几个客户端一起运行!
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class TestServer { ArrayList<Client1> client = new ArrayList<Client1>();
boolean isStart = false;
ServerSocket server =null;
public void ConnectServer(){
try{
server = new ServerSocket(4444);
System.out.println("服务器已运行.......");
isStart = true;
while(isStart){
Socket s1 = server.accept();
System.out.println("一个客户端已连接");
Client1 th1 =new Client1(s1);
new Thread(th1).start();
client.add(th1);
}
}catch(Exception d){
}
}
public static void main(String[] args) {
new TestServer().ConnectServer();
}
class Client1 implements Runnable{
Socket c1;
DataOutputStream dout = null;
DataInputStream din = null;
boolean isConnect = false;
public Client1(Socket c1){
this.c1 = c1;
try {
dout = new DataOutputStream(c1.getOutputStream());
din = new DataInputStream(c1.getInputStream());
isConnect = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void send(String str){
try {
dout.writeUTF(str);
} catch (IOException e) {
client.remove(this);//移除该客户端
System.out.println("对方下线");
}
}
public void run() {
try{
while(isConnect){
String str = din.readUTF();
for(int i=0;i<client.size();i++){
Client1 c1 = client.get(i);
c1.send(str);
}
}
}catch(Exception d){
}finally{
try{
if(din!=null){
din .close();
din = null;
}
if(dout!=null){
dout.close();
dout = null;
}
if(c1!=null){
c1.close();
c1 = null;
}}catch(Exception d){
}
}
}
}
}以上是服务器的书写形式 package Lesson3;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;import com.util.Setjframe; public class TestClient extends JFrame implements ActionListener{
JTextField input;
JTextArea showContent;
Socket s1 = null;
DataOutputStream dout;
DataInputStream din;
boolean isConn = false;
public TestClient(){
Setjframe sf = new Setjframe("聊天系统",400,300);
input = new JTextField();
showContent = new JTextArea();
this.add(showContent,BorderLayout.CENTER);
this.add(input,BorderLayout.SOUTH);
input.addActionListener(this);
sf.setjframe(this);
connect();
new Thread(new R1()).start();
}
public static void main(String[] args) {
new TestClient(); }
public void actionPerformed(ActionEvent e) {
if(e.getSource()==input){
// showContent.setText(input.getText());
String str = input.getText().trim();
try {
dout.writeUTF(str);
dout.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
input.setText("");
}
}
//连接
public void connect(){
try {
s1 = new Socket(InetAddress.getByName("127.0.0.1"),4444);
dout = new DataOutputStream(s1.getOutputStream());
din = new DataInputStream(s1.getInputStream());
System.out.println("connected!");
isConn = true;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//断开
public void disConnect(){
try{
if(din!=null){
din .close();
din = null;
}
if(dout!=null){
dout.close();
dout = null;
}
if(s1!=null){
s1.close();
s1 = null;
}
}catch(Exception d){
}
}
class R1 implements Runnable{
public void run() {
while(isConn){
try {
String str = din.readUTF();
showContent.setText(showContent.getText() + "\n" + str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
以上是客户端的书写形式 程序运行时,显运行服务器,在客户端,可以几个客户端一起运行!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询