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

来源:互联网 发布:网络词萌萌是什么意思 编辑:程序博客网 时间:2024/06/05 11:07

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 blocke.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 blocke.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;}@Overridepublic 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 blocke1.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();}     }









0 0