您的位置:首页 > 理论基础 > 计算机网络

Javase网络通讯(socket编程)群聊系统

2016-05-12 08:26 633 查看
Server:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

/* 实现局域网的群聊系统
* 1.要求能够实现多人在同一个界面上群聊
* 2.写一个登录界面
* 3.按个enter可以发送消息
*
* */
public class Server
{
public static void main(String[] args) throws Exception
{
//用来存储连接的客户端
ArrayList<Socket> al=new ArrayList<Socket>();
ServerSocket server=new ServerSocket(3333);

//死循环,无限监听连接到此服务器端的客户端
while(true)
{
Socket socket=server.accept();
al.add(socket);//有连接的客户端,就将该客户端保存在集合类中

new ServerThread(socket,al).start();
}
}
}

ServerThread服务器端线程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

public class ServerThread extends Thread
{
Socket s;
ArrayList<Socket> al;
public ServerThread(Socket s, ArrayList<Socket> al)
{
this.s = s;
this.al = al;
}

public void run()
{
try
{
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true)
{
String message=br.readLine();//获取从客户端读取的信息
//遍历集合类,将消息转发到集合类中所有的客户端
for(Socket socket:al)
{
//获得集合类中单个客户端的输出流
PrintWriter pw=new PrintWriter(socket.getOutputStream());
pw.println(message);//将消息打印到输出流中
pw.flush();
}
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
Client客户端开始界面:
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;

public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket=new Socket(InetAddress.getByName("192.168.1.240"),3333);
String name=JOptionPane.showInputDialog("请输入用户名:");
new MyFrame(socket,name);
}
}ClientThread 客户端线程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientThread extends Thread
{
Socket socket;
MyFrame mf;
public ClientThread(Socket socket, MyFrame mf)
{
this.socket = socket;
this.mf = mf;
}

public void run()
{
try
{
//获得客户端的输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
//获得从服务器输入的信息
String message=br.readLine();
//将信息输入到文本域中
mf.area.setText(mf.area.getText()+"\n"+message);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}MyFrame前台界面框架:
import java.awt.BorderLayout;
import java.awt.Container;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MyFrame
{
Socket socket;
JTextField field;
JTextArea area;
JFrame frame;
public MyFrame(Socket socket,String name)
{
this.socket=socket;
frame=new JFrame(name);
Container con=frame.getContentPane();
con.setLayout(new BorderLayout());

JPanel p=new JPanel();
area=new JTextArea(20,20);
p.add(area);
con.add(p,BorderLayout.CENTER);

JPanel pan=new JPanel();
field=new JTextField(15);
JButton btn=new JButton("发送");
pan.add(field);
pan.add(btn);

MyListener ml=new MyListener(socket, this);

new ClientThread(socket, this).start();

btn.addActionListener(ml);

con.add(pan, BorderLayout.SOUTH);

frame.setSize(250, 250);
frame.setVisible(true);
}

}

MyListener 监听:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class MyListener implements ActionListener
{
Socket s;
MyFrame mf;

public MyListener(Socket s, MyFrame mf)
{
this.s = s;
this.mf = mf;
}

@Override
public void actionPerformed(ActionEvent e)
{
String str=e.getActionCommand();
System.out.println(str);
if(str.equals("发送"))
{
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

}

————————————————————————————————

额外:
1 如果自己写窗口实现登陆,然后跳转第二个窗口。前一个窗口貌似只能隐藏,不能关闭,可以用jframe.dispose()来隐藏窗口释放资源;System.exit(0),全部退出

2 按回车键实现发送,添加监听:

if(e.getKeyCode() == KeyEvent.VK_ENTER) //判断按下的键是否是回车键
{
String str=mf.field.getText();
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
e1.printStackTrace();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: