




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、服务器代码:WindowServer.javaimport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.IOException;import javax.swing.JButton;import javax.swing
2、.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.border.TitledBorder;public class WindowServer public static JFrame window;public static JTextArea tex
3、tMessage;/聊天记录public static JList<String> user;/用户列表public static int ports;JButton start,send,exit;JTextField portServer,message,name;/主函数入口public static void main(String args) new WindowServer();/初始化窗体public WindowServer() init();/初始化内容public void init()/采用绝对布局window = new JFrame("服务端&q
4、uot;);window.setLayout(null);window.setBounds(200, 200, 500, 400);window.setResizable(false);/不可改变大小JLabel label1 = new JLabel("端口号:");label1.setBounds(10, 8, 50, 30);window.add(label1);portServer = new JTextField();portServer.setBounds(60, 8, 100, 30);portServer.setText("30000")
5、;window.add(portServer);JLabel names = new JLabel("用户名:");names.setBounds(180, 8, 55, 30);window.add(names);name = new JTextField();name.setBounds(230, 8, 60, 30);name.setText("服务端");window.add(name);start = new JButton("启动");start.setBounds(300, 8, 80, 30);window.add(s
6、tart);exit = new JButton("关闭");exit.setBounds(390, 8, 80, 30);window.add(exit);JLabel label2 = new JLabel("用户列表");label2.setBounds(40, 40, 80, 30);window.add(label2);user = new JList<String>();JScrollPane scrollPane = new JScrollPane(user);/添加滚动条scrollPane.setBounds(10, 70,
7、 120, 220);window.add(scrollPane);textMessage = new JTextArea();textMessage.setBounds(135, 70, 340, 220);textMessage.setBorder(new TitledBorder("聊天记录");/设置标题textMessage.setEditable(false);/不可编辑/文本内容换行的两个需要配合着用textMessage.setLineWrap(true);/设置文本内容自动换行,在超出文本区域时,可能会切断单词textMessage.setWrapStyl
8、eWord(true);/设置以自动换行,以单词为整体,保证单词不会被切断JScrollPane scrollPane1 = new JScrollPane(textMessage);/设置滚动条scrollPane1.setBounds(135, 70, 340, 220);window.add(scrollPane1);message = new JTextField();message.setBounds(10, 300, 360, 50);window.add(message);send = new JButton("发送");send.setBounds(380,
9、 305, 70, 40);window.add(send);myEvent();/添加监听事件window.setVisible(true);public void myEvent()window.addWindowListener(new WindowAdapter() /关闭窗体public void windowClosing(WindowEvent e)/如果有客户端存在,发信息给客户端,并退出if(StartServer.userList != null && StartServer.userList.size() != 0)try new SendServer(S
10、tartServer.userList, "" , "4");/4代表服务端退出 catch (IOException e1) e1.printStackTrace();System.exit(0);/退出窗体);exit.addActionListener(new ActionListener() /退出连接public void actionPerformed(ActionEvent e) if(StartServer.ss = null | StartServer.ss.isClosed()/如果已退出,弹窗提醒JOptionPane.showMe
11、ssageDialog(window, "服务器已关闭");else /发信息告诉客户端,要退出if(StartServer.userList != null && StartServer.userList.size() != 0)try new SendServer(StartServer.userList, "" , 4 + ""); catch (IOException e1) e1.printStackTrace();try start.setText("启动");exit.setText(
12、"已关闭");StartServer.ss.close();/关闭服务端StartServer.ss = null;StartServer.userList = null;StartServer.flag = false;/改变服务端循环标记 catch (IOException e1) e1.printStackTrace(););/开启服务端start.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) /如果服务端已经开启,弹窗提醒服务端已开启if(Star
13、tServer.ss != null && !StartServer.ss.isClosed()JOptionPane.showMessageDialog(window, "服务器已经启动");else ports = getPort();/获取端口号if(ports != 0)try StartServer.flag = true;/改变服务端接收循环标记new Thread(new StartServer(ports).start(); /开启服务端接收线程start.setText("已启动");exit.setText("
14、;关闭"); catch (IOException e1) JOptionPane.showMessageDialog(window, "启动失败"););/点击按钮发送消息send.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) sendMsg(););/按回车发送消息message.addKeyListener(new KeyAdapter() public void keyPressed(KeyEvent e) if(e.getKeyCode(
15、) = KeyEvent.VK_ENTER)sendMsg(););/发送消息方法public void sendMsg()String messages = message.getText();/判断内容是否为空if("".equals(messages)JOptionPane.showMessageDialog(window, "内容不能为空!");else if(StartServer.userList = null | StartServer.userList.size() = 0)/判断是否已经连接成功JOptionPane.showMessa
16、geDialog(window, "未连接成功,不能发送消息!");else try /将信息发送给所有客户端new SendServer(StartServer.userList, getName() + ":" + messages, 1 + "");/将信息添加到客户端聊天记录中WindowServer.textMessage.append(getName() + ":" + messages + "rn");message.setText(null);/消息框设置为空 catch (IO
17、Exception e1) JOptionPane.showMessageDialog(window, "发送失败!");/获取端口号public int getPort()String port = portServer.getText();if("".equals(port)/判断端口号是否为空JOptionPane.showMessageDialog(window, "端口号为口");return 0;else return Integer.parseInt(port);/返回整形的端口号/获取服务端名称public Strin
18、g getName()return name.getText();StartServer.javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.util.ArrayList;import java.util.Vector;import javax.swing.JOptionPane;/启动服务端接收客户端的线程pu
19、blic class StartServer implements Runnableprivate int port;public static ArrayList<Socket> userList = null;public static Vector<String> userName = null;public static ServerSocket ss = null;public static boolean flag = true;/传入端口号public StartServer(int port) throws IOExceptionthis.port =
20、port;public void run() Socket s = null;userList = new ArrayList<Socket>();/客户端端口容器userName = new Vector<String>();/用户名称容器/System.out.println("启动服务端");try ss = new ServerSocket(port);/启动服务端 catch (IOException e1) e1.printStackTrace();while (flag) /开启循环,等待接收客户端try s = ss.accept()
21、;/接收客户端userList.add(s);/将客户端的socket添加到容器中/打印客户端信息String id = s.getInetAddress().getHostName();System.out.println(id + "-connected");System.out.println("当前客户端个数为:" + userList.size();/启动与客户端相对应的信息接收线程new Thread(new ReceiveServer(s,userList,userName).start(); catch (IOException e) J
22、OptionPane.showMessageDialog(WindowServer.window, "服务端退出!");/服务端信息接收线程class ReceiveServer implements Runnableprivate Socket socket;private ArrayList<Socket> userList;private Vector<String> userName;public ReceiveServer(Socket s,ArrayList<Socket> userList,Vector<String&
23、gt; userName) this.socket = s;this.userList = userList;this.userName = userName;public void run() try /读取信息流BufferedReader brIn = new BufferedReader(new InputStreamReader(socket.getInputStream();while(true)char info = (char)brIn.read();/先读取信息流的首字符,并判断信息类型String line = brIn.readLine();/读取信息流的信息内容if(i
24、nfo = '1')/1代表收到的是信息WindowServer.textMessage.append(line + "rn");/将信息添加到服务端聊天记录中/设置消息显示最新一行,也就是滚动条出现在末尾,显示最新一条输入的信息WindowServer.textMessage.setCaretPosition(WindowServer.textMessage.getText().length();new SendServer(userList, line, "1");/将信息转发给客户端if(info = '2')/2代
25、表有新客户端建立连接userName.add(line);/将新客户端用户名添加到容器中WindowServer.user.setListData(userName);/更新服务端用户列表new SendServer(userList, userName, "2");/将用户列表以字符串的形式发给客户端if(info = '3')/3代表有用户端退出连接userName.remove(line);/移除容器中已退出的客户端用户名userList.remove(socket);/移除容器中已退出的客户端的socketWindowServer.user.setL
26、istData(userName);/更新服务端用户列表new SendServer(userList, userName, "3");/将用户列表以字符串的形式发给客户端socket.close();/关闭该客户端的socketbreak;/结束该客户端对于的信息接收线程 catch (IOException e) e.printStackTrace();/服务端发送信息class SendServer SendServer(ArrayList<Socket> userList,Object message,String info) throws IOExce
27、ptionString messages = info + message;/添加信息头标记PrintWriter pwOut = null;for(Socket s : userList)/将信息发送给每个客户端pwOut = new PrintWriter(s.getOutputStream(),true);pwOut.println(messages);客户端代码:WindowClient.javaimport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.Key
28、Adapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.IOException;import .Socket;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.s
29、wing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.border.TitledBorder;public class WindowClient JTextField port,name,ip,message;JButton send;public static JFrame window;public static JButton link,exit;public static JTextArea textMessage;public static Sock
30、et socket = null;public static JList<String> user;/主函数入口public static void main(String args) new WindowClient();/初始化窗体public WindowClient() init();/窗体初始化内容public void init()/采用绝对布局window = new JFrame("客户端");window.setLayout(null);window.setBounds(200, 200, 500, 400);window.setResizab
31、le(false);JLabel label = new JLabel("主机IP:");label.setBounds(10, 8, 50, 30);window.add(label);ip = new JTextField();ip.setBounds(55, 8, 60, 30);ip.setText("127.0.0.1");window.add(ip);JLabel label1 = new JLabel("端口号:");label1.setBounds(125, 8, 50, 30);window.add(label1);
32、port = new JTextField();port.setBounds(170, 8, 40, 30);port.setText("30000");window.add(port);JLabel names = new JLabel("用户名:");names.setBounds(220, 8, 55, 30);window.add(names);name = new JTextField();name.setBounds(265, 8, 60, 30);name.setText("客户端1");window.add(name)
33、;link = new JButton("连接");link.setBounds(335, 8, 75, 30);window.add(link);exit = new JButton("退出");exit.setBounds(415, 8, 75, 30);window.add(exit);JLabel label2 = new JLabel("用户列表");label2.setBounds(40, 40, 80, 30);window.add(label2);user = new JList<String>();JSc
34、rollPane scrollPane = new JScrollPane(user);/设置滚动条scrollPane.setBounds(10, 70, 120, 220);window.add(scrollPane);textMessage = new JTextArea();textMessage.setBounds(135, 70, 340, 220);textMessage.setEditable(false);/文本不可编辑textMessage.setBorder(new TitledBorder("聊天记录");/设置标题/文本内容换行的两个需要配合着用t
35、extMessage.setLineWrap(true);/设置文本内容自动换行,在超出文本区域时,可能会切断单词textMessage.setWrapStyleWord(true);/设置以自动换行,以单词为整体,保证单词不会被切断JScrollPane scrollPane1 = new JScrollPane(textMessage);/设置滚动条scrollPane1.setBounds(135, 70, 340, 220);window.add(scrollPane1);message = new JTextField();message.setBounds(10, 300, 360
36、, 50);message.setText(null);window.add(message);send = new JButton("发送");send.setBounds(380, 305, 70, 40);window.add(send);myEvent();/添加监听事件window.setVisible(true);/设置窗体可见public void myEvent()/事件监听window.addWindowListener(new WindowAdapter() /退出窗体public void windowClosing(WindowEvent e)/如果
37、仍在连接,发信息给服务端,并退出if(socket != null && socket.isConnected()try new SendClient(socket, getName(), 3 + ""); catch (IOException e1) e1.printStackTrace();System.exit(0););/关闭连接exit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) /如果仍在连接,将信息发给服务端if(socket
38、 = null)JOptionPane.showMessageDialog(window, "已关闭连接");else if(socket != null && socket.isConnected()try new SendClient(socket, getName(), "3");/发送信息给服务端link.setText("连接");exit.setText("已退出");socket.close();/关闭socketsocket = null; catch (IOException e1
39、) e1.printStackTrace(););/建立连接link.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) /判断是否已经连接成功if(socket != null && socket.isConnected()JOptionPane.showMessageDialog(window, "已经连接成功!");else String ipString = ip.getText(); /获取IP地址String portClinet =
40、port.getText();/获取端口号if("".equals(ipString) | "".equals(portClinet)/判断获取内容是否为空JOptionPane.showMessageDialog(window, "ip或端口号为空!");else try int ports = Integer.parseInt(portClinet);/将端口号转为整形socket = new Socket(ipString,ports);/建立连接link.setText("已连接");/更改button显示
41、信息exit.setText("退出");new SendClient(socket, getName(), 2 + "");/发送该客户端名称至服务器new Thread(new ReceiveClient(socket).start();/启动接收线程 catch (Exception e2) JOptionPane.showMessageDialog(window, "连接未成功!可能是ip或端口号格式不对,或服务器未开启。"););/点击按钮发送信息send.addActionListener(new ActionListen
42、er() public void actionPerformed(ActionEvent e) sendMsg(););/按回车发送信息message.addKeyListener(new KeyAdapter() public void keyPressed(KeyEvent e) if(e.getKeyCode() = KeyEvent.VK_ENTER)sendMsg(););/发送信息的方法public void sendMsg()String messages = message.getText();/获取文本框内容if("".equals(messages)/判
43、断信息是否为空JOptionPane.showMessageDialog(window, "内容不能为空!");else if(socket = null | !socket.isConnected()/判断是否已经连接成功JOptionPane.showMessageDialog(window, "未连接成功,不能发送消息!");else try /发送信息new SendClient(socket,getName() + ":" + messages,"1");message.setText(null);/文本框内容设置为空 catch (IOException e1) JOptionPane.showMessageDialog(window, "信息发送失败!");/获取客户端名称public String getName()return name.getText();StartClient.javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.Pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南通启秀中学2026届中考试题猜想语文试卷含解析
- 消费限制管理办法
- 烟酒规范管理办法
- 病险桥梁管理办法
- 深圳烟囱管理办法
- 砂石堆放管理办法
- 生鲜熟食管理办法
- 电子物证管理办法
- 版权确认管理办法
- 甲方项目管理办法
- 高尿酸血症的护理措施
- 变电站主辅设备监视及一键顺控课件
- 新教材 高中政治必修三《政治与法治》知识归梳理
- 零基预算在公立医院预算管理中的探讨
- 产能规划方案
- 特殊天气安全教育课件
- 病历书写规范培训课件
- DB32/T+4643-2024+超声波岩盐气溶胶治疗呼吸系统疾病技术规范
- GB/T 4437.1-2023铝及铝合金热挤压管第1部分:无缝圆管
- 合同诈骗罪起诉状
- 公路工程勘察设计投标方案(技术方案)
评论
0/150
提交评论