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
- Javase网络通讯(socket编程)群聊系统
- C#.Net Socket网络通讯编程
- C#.Net Socket网络通讯编程
- JAVASE之socket编程
- 网络通讯---socket
- 网络通讯,socket
- Socket 网络通讯
- socket网络通讯
- JavaSE 套接字Socket编程
- 基于Socket编程实现平行主机之间网络通讯
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 网络编程:Socket与JavaSE线程高级
- VC+Socket 网络通讯示例
- php网络通讯socket
- socket网络通讯基础笔记
- Java网络通讯---Socket通讯
- javaSE socket群聊基础无swing技术事例
- javaee的EL表达式
- Windows 常用消息大全
- 如何在网页上弹出一个对话框显示一些内容javascript
- 欢迎使用CSDN-markdown编辑器
- ANDROID内存优化(大汇总——全)
- Javase网络通讯(socket编程)群聊系统
- php微信开发中各种小技巧收集
- Caffe 深度学习框架上手教程
- 孔淼:大数据分析处理与用户画像实践
- MAVEN 部署编译问题(There is an error in invoking javac. A full JDK (not just JRE) is required)
- 123123
- swift下载文件并且保存到沙盒
- 菜鸟更要独立思考之一 从思路到实现,菜鸟也能掌握递归算法
- PHP学习心路历程