亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 開發(fā) > Java > 正文

java局域網(wǎng)聊天小程序

2024-07-14 08:43:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例為大家分享了java局域網(wǎng)聊天程序的具體代碼,供大家參考,具體內(nèi)容如下

有服務(wù)器端 和客戶端兩個(gè)界面,運(yùn)行需要加上自己的ip地址,端口可以隨意,但是客戶端端口,和服務(wù)器端口要一樣,然后就可以幾個(gè)人一塊聊天了

簡(jiǎn)單貼幾個(gè)代碼吧  

Client.java  客戶端代碼

package chat; import java.awt.BorderLayout;//布置容器的邊框布局import java.awt.Color;import java.awt.Container;import java.awt.GridLayout;//布局處理器import java.awt.Toolkit;//抽象超類import java.awt.event.ActionEvent;//指示發(fā)生了組件定義的動(dòng)作的語(yǔ)義事件import java.awt.event.ActionListener;//用于接收操作事件的偵聽器接口import java.awt.event.MouseEvent;//指示組件中發(fā)生鼠標(biāo)動(dòng)作的事件import java.awt.event.MouseListener;//鼠標(biāo)事件的偵聽器接口import java.awt.event.WindowAdapter;//接收窗口事件的抽象適配器類。此類中的方法為空。此類存在的目的是方便創(chuàng)建偵聽器對(duì)象import java.awt.event.WindowEvent;//指示窗口狀態(tài)改變的低級(jí)別事件import java.io.BufferedReader;//提供通用的緩沖方式文本讀取import java.io.IOException;//輸入輸出異常import java.io.InputStreamReader;//字節(jié)流通向字符流的橋梁import java.io.PrintWriter;//向文本輸出流打印對(duì)象的格式化表示形式import java.net.Socket;//套接字,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)交換的通信import java.util.HashMap;// HashMap 是 Map 接口的常用實(shí)現(xiàn)類import java.util.Map;//存數(shù)據(jù),將鍵映射到值的對(duì)象import java.util.StringTokenizer;//允許應(yīng)用程序?qū)⒆址纸鉃闃?biāo)記 import javax.swing.BorderFactory;//創(chuàng)建一個(gè)浮雕式的邊框import javax.swing.DefaultListModel;//列表模型import javax.swing.JButton;//按鈕import javax.swing.JFrame;//窗口import javax.swing.JLabel;//標(biāo)簽import javax.swing.JList;//列表import javax.swing.JOptionPane;//對(duì)話框import javax.swing.JPanel;import javax.swing.JScrollPane;//視圖import javax.swing.JSplitPane;//分隔import javax.swing.JTextArea;//多行文本import javax.swing.JTextField;//文本import javax.swing.border.EmptyBorder;//一個(gè)占用空間但不執(zhí)行繪制的空透明邊框import javax.swing.border.TitledBorder;//該類實(shí)現(xiàn)在指定位置以指定對(duì)齊方式顯示字符串標(biāo)題的任意邊框 import oldchat.ChatFrame;  public class Client{  private JFrame frame; private JList userList; private JTextArea textArea; private JTextField textField; private JTextField txt_port; private JTextField txt_hostIp; private JTextField txt_name; private JButton btn_start; private JButton btn_stop; private JButton btn_send; private JPanel northPanel; private JPanel southPanel; private JScrollPane rightScroll; private JScrollPane leftScroll; private JSplitPane centerSplit;  private DefaultListModel listModel; private boolean isConnected = false;  private Socket socket;//創(chuàng)建套接字 private PrintWriter writer; private BufferedReader reader; private MessageThread messageThread;// 負(fù)責(zé)接收消息的線程 private Map<String, User> onLineUsers = new HashMap<String, User>();// 所有在線用戶  // 主方法,程序入口 public static void main(String[] args)  { new Client(); }  // 執(zhí)行發(fā)送 public void send()  { if (!isConnected)  {  JOptionPane.showMessageDialog(frame, "還沒有連接服務(wù)器,無(wú)法發(fā)送消息!", "錯(cuò)誤",   JOptionPane.ERROR_MESSAGE);  return; } String message = textField.getText().trim(); if (message == null || message.equals(""))  {  JOptionPane.showMessageDialog(frame, "消息不能為空!", "錯(cuò)誤",   JOptionPane.ERROR_MESSAGE);  return; } sendMessage(frame.getTitle() + "@" + "ALL" + "@" + message); textField.setText(null); }  // 構(gòu)造方法 public Client()  { textArea = new JTextArea(); textArea.setEditable(false); textArea.setForeground(Color.blue); textField = new JTextField(); txt_port = new JTextField("6666"); txt_hostIp = new JTextField(); txt_name = new JTextField(); btn_start = new JButton("連接"); btn_stop = new JButton("斷開"); btn_send = new JButton("發(fā)送"); listModel = new DefaultListModel(); userList = new JList(listModel);  northPanel = new JPanel(); northPanel.setLayout(new GridLayout(1, 7)); northPanel.add(new JLabel("端口")); northPanel.add(txt_port); northPanel.add(new JLabel("服務(wù)器IP")); northPanel.add(txt_hostIp); northPanel.add(new JLabel("姓名")); northPanel.add(txt_name); northPanel.add(btn_start); northPanel.add(btn_stop); northPanel.setBorder(new TitledBorder("連接信息"));  rightScroll = new JScrollPane(textArea); rightScroll.setBorder(new TitledBorder("群聊消息顯示區(qū)")); leftScroll = new JScrollPane(userList); leftScroll.setBorder(new TitledBorder("在線用戶(雙擊私聊)")); southPanel = new JPanel(new BorderLayout()); southPanel.add(textField, "Center"); southPanel.add(btn_send, "East"); southPanel.setBorder(new TitledBorder("寫消息"));  centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll,  rightScroll); centerSplit.setDividerLocation(100);  frame = new JFrame("客戶端"); // 更改JFrame的圖標(biāo): //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.jpg"))); frame.setLayout(new BorderLayout()); frame.add(northPanel, "North"); frame.add(centerSplit, "Center"); frame.add(southPanel, "South"); frame.setSize(600, 400); int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height; frame.setLocation((screen_width - frame.getWidth()) / 2,  (screen_height - frame.getHeight()) / 2); frame.setVisible(true);  // 寫消息的文本框中按回車鍵時(shí)事件 textField.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent arg0)   {  send();  } });  // 單擊發(fā)送按鈕時(shí)事件 btn_send.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent e)   {  send();  } });  // 單擊連接按鈕時(shí)事件 btn_start.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent e)   {  int port;  if (isConnected) {   JOptionPane.showMessageDialog(frame, "已處于連接上狀態(tài),不要重復(fù)連接!",    "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);   return;  }  try {   try {   port = Integer.parseInt(txt_port.getText().trim());   } catch (NumberFormatException e2) {   throw new Exception("端口號(hào)不符合要求!端口為整數(shù)!");   }   String hostIp = txt_hostIp.getText().trim();   String name = txt_name.getText().trim();   if (name.equals("") || hostIp.equals("")) {   throw new Exception("姓名、服務(wù)器IP不能為空!");   }   boolean flag = connectServer(port, hostIp, name);   if (flag == false) {   throw new Exception("與服務(wù)器連接失敗!");   }   frame.setTitle(name);   JOptionPane.showMessageDialog(frame, "成功連接!");  } catch (Exception exc) {   JOptionPane.showMessageDialog(frame, exc.getMessage(),    "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);  }  } });//雙擊聊天(私聊)  userList.addMouseListener(new MouseListener()  {    public void mouseReleased(MouseEvent e) {}  public void mousePressed(MouseEvent e) {}  public void mouseExited(MouseEvent e) {}  public void mouseEntered(MouseEvent e) {}  public void mouseClicked(MouseEvent e)   {  if(e.getClickCount()==2)   {   User user=onLineUsers.get(userList.getSelectedValue());    ChatFrame.main(user.getIp());;  }   } });  // 單擊斷開按鈕時(shí)事件 btn_stop.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent e)   {  if (!isConnected) {   JOptionPane.showMessageDialog(frame, "已處于斷開狀態(tài),不要重復(fù)斷開!",    "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);   return;  }  try {   boolean flag = closeConnection();// 斷開連接   if (flag == false) {   throw new Exception("斷開連接發(fā)生異常!");   }   JOptionPane.showMessageDialog(frame, "成功斷開!");  } catch (Exception exc) {   JOptionPane.showMessageDialog(frame, exc.getMessage(),    "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);  }  } });  // 關(guān)閉窗口時(shí)事件 frame.addWindowListener(new WindowAdapter()  {  public void windowClosing(WindowEvent e)   {  if (isConnected) {   closeConnection();// 關(guān)閉連接  }  System.exit(0);// 退出程序  } }); }  /** * 連接服務(wù)器 *  * @param port * @param hostIp * @param name */ public boolean connectServer(int port, String hostIp, String name)  { // 連接服務(wù)器 try {  socket = new Socket(hostIp, port);// 根據(jù)端口號(hào)和服務(wù)器ip建立連接  writer = new PrintWriter(socket.getOutputStream());  reader = new BufferedReader(new InputStreamReader(socket   .getInputStream()));  // 發(fā)送客戶端用戶基本信息(用戶名和ip地址)  sendMessage(name + "@" + socket.getLocalAddress().toString());  // 開啟接收消息的線程  messageThread = new MessageThread(reader, textArea);  messageThread.start();  isConnected = true;// 已經(jīng)連接上了  return true; } catch (Exception e) {  textArea.append("與端口號(hào)為:" + port + "  IP地址為:" + hostIp   + "  的服務(wù)器連接失敗!" + "/r/n");  isConnected = false;// 未連接上  return false; } }  /** * 發(fā)送消息 *  * @param message */ public void sendMessage(String message)  { writer.println(message); writer.flush(); }  /** * 客戶端主動(dòng)關(guān)閉連接 */ @SuppressWarnings("deprecation") public synchronized boolean closeConnection()  { try {  sendMessage("CLOSE");// 發(fā)送斷開連接命令給服務(wù)器  messageThread.stop();// 停止接受消息線程  // 釋放資源  if (reader != null) {  reader.close();  }  if (writer != null) {  writer.close();  }  if (socket != null) {  socket.close();  }  isConnected = false;  return true; } catch (IOException e1) {  e1.printStackTrace();  isConnected = true;  return false; } }  // 不斷接收消息的線程 class MessageThread extends Thread { private BufferedReader reader; private JTextArea textArea;  // 接收消息線程的構(gòu)造方法 public MessageThread(BufferedReader reader, JTextArea textArea)  {  this.reader = reader;  this.textArea = textArea; }  // 被動(dòng)的關(guān)閉連接 public synchronized void closeCon() throws Exception  {  // 清空用戶列表  listModel.removeAllElements();  // 被動(dòng)的關(guān)閉連接釋放資源  if (reader != null) {  reader.close();  }  if (writer != null) {  writer.close();  }  if (socket != null) {  socket.close();  }  isConnected = false;// 修改狀態(tài)為斷開 }  public void run() {  String message = "";  while (true) {  try {   message = reader.readLine();   StringTokenizer stringTokenizer = new StringTokenizer(message, "/@");   String command = stringTokenizer.nextToken();// 命令   if (command.equals("CLOSE"))// 服務(wù)器已關(guān)閉命令   {   textArea.append("服務(wù)器已關(guān)閉!/r/n");   closeCon();// 被動(dòng)的關(guān)閉連接   return;// 結(jié)束線程   } else if (command.equals("ADD")) {// 有用戶上線更新在線列表   String username = "";   String userIp = "";   if ((username = stringTokenizer.nextToken()) != null    && (userIp = stringTokenizer.nextToken()) != null)    {    User user = new User(username, userIp);    onLineUsers.put(username, user);    listModel.addElement(username);   }   } else if (command.equals("DELETE")) {// 有用戶下線更新在線列表   String username = stringTokenizer.nextToken();   User user = (User) onLineUsers.get(username);   onLineUsers.remove(user);   listModel.removeElement(username);   } else if (command.equals("USERLIST")) {// 加載在線用戶列表   int size = Integer    .parseInt(stringTokenizer.nextToken());   String username = null;   String userIp = null;   for (int i = 0; i < size; i++) {    username = stringTokenizer.nextToken();    userIp = stringTokenizer.nextToken();    User user = new User(username, userIp);    onLineUsers.put(username, user);    listModel.addElement(username);   }   } else if (command.equals("MAX")) {// 人數(shù)已達(dá)上限   textArea.append(stringTokenizer.nextToken()    + stringTokenizer.nextToken() + "/r/n");   closeCon();// 被動(dòng)的關(guān)閉連接   JOptionPane.showMessageDialog(frame, "服務(wù)器緩沖區(qū)已滿!", "錯(cuò)誤",    JOptionPane.ERROR_MESSAGE);   return;// 結(jié)束線程   } else {// 普通消息   textArea.append(message + "/r/n");   }  } catch (IOException e) {   e.printStackTrace();  } catch (Exception e) {   e.printStackTrace();  }  } } } }

java,局域網(wǎng)聊天,小程序

Server.java

package chat; import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.BindException;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.StringTokenizer; import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.border.TitledBorder; public class Server {  private JFrame frame; private JTextArea contentArea; private JTextField txt_message; private JTextField txt_max; private JTextField txt_port; private JButton btn_start; private JButton btn_stop; private JButton btn_send; private JPanel northPanel; private JPanel southPanel; private JScrollPane rightPanel; private JScrollPane leftPanel; private JSplitPane centerSplit; private JList userList; private DefaultListModel listModel;  private ServerSocket serverSocket; private ServerThread serverThread; private ArrayList<ClientThread> clients;  private boolean isStart = false;  // 主方法,程序執(zhí)行入口 public static void main(String[] args)  { new Server(); }  // 執(zhí)行消息發(fā)送 public void send()  { if (!isStart)  {  JOptionPane.showMessageDialog(frame, "服務(wù)器還未啟動(dòng),不能發(fā)送消息!", "錯(cuò)誤",   JOptionPane.ERROR_MESSAGE);  return; } if (clients.size() == 0)  {  JOptionPane.showMessageDialog(frame, "沒有用戶在線,不能發(fā)送消息!", "錯(cuò)誤",   JOptionPane.ERROR_MESSAGE);  return; } String message = txt_message.getText().trim(); if (message == null || message.equals(""))  {  JOptionPane.showMessageDialog(frame, "消息不能為空!", "錯(cuò)誤",   JOptionPane.ERROR_MESSAGE);  return; } sendServerMessage(message);// 群發(fā)服務(wù)器消息 contentArea.append("服務(wù)器說(shuō):" + txt_message.getText() + "/r/n"); txt_message.setText(null); }  // 構(gòu)造放法 public Server()  { frame = new JFrame("服務(wù)器"); // 更改JFrame的圖標(biāo): //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png"))); //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Server.class.getResource("qq.jpg"))); contentArea = new JTextArea(); contentArea.setEditable(false); contentArea.setForeground(Color.blue); txt_message = new JTextField(); txt_max = new JTextField("30"); txt_port = new JTextField("6666"); btn_start = new JButton("啟動(dòng)"); btn_stop = new JButton("停止"); btn_send = new JButton("發(fā)送"); btn_stop.setEnabled(false); listModel = new DefaultListModel(); userList = new JList(listModel);  southPanel = new JPanel(new BorderLayout()); southPanel.setBorder(new TitledBorder("寫消息")); southPanel.add(txt_message, "Center"); southPanel.add(btn_send, "East"); leftPanel = new JScrollPane(userList); leftPanel.setBorder(new TitledBorder("在線用戶"));  rightPanel = new JScrollPane(contentArea); rightPanel.setBorder(new TitledBorder("群聊消息顯示區(qū)"));  centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,  rightPanel); centerSplit.setDividerLocation(100); northPanel = new JPanel(); northPanel.setLayout(new GridLayout(1, 6)); northPanel.add(new JLabel("人數(shù)上限")); northPanel.add(txt_max); northPanel.add(new JLabel("端口")); northPanel.add(txt_port); northPanel.add(btn_start); northPanel.add(btn_stop); northPanel.setBorder(new TitledBorder("配置信息"));  frame.setLayout(new BorderLayout()); frame.add(northPanel, "North"); frame.add(centerSplit, "Center"); frame.add(southPanel, "South"); frame.setSize(600, 400); //frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());//設(shè)置全屏 int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height; frame.setLocation((screen_width - frame.getWidth()) / 2,  (screen_height - frame.getHeight()) / 2); frame.setVisible(true);  // 關(guān)閉窗口時(shí)事件 frame.addWindowListener(new WindowAdapter()  {  public void windowClosing(WindowEvent e)   {  if (isStart) {   closeServer();// 關(guān)閉服務(wù)器  }  System.exit(0);// 退出程序  } });  // 文本框按回車鍵時(shí)事件 txt_message.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent e)   {  send();  } });  // 單擊發(fā)送按鈕時(shí)事件 btn_send.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent arg0)   {  send();  } });  // 單擊啟動(dòng)服務(wù)器按鈕時(shí)事件 btn_start.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent e)   {  if (isStart) {   JOptionPane.showMessageDialog(frame, "服務(wù)器已處于啟動(dòng)狀態(tài),不要重復(fù)啟動(dòng)!",    "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);   return;  }  int max;  int port;  try {   try {   max = Integer.parseInt(txt_max.getText());   } catch (Exception e1) {   throw new Exception("人數(shù)上限為正整數(shù)!");   }   if (max <= 0) {   throw new Exception("人數(shù)上限為正整數(shù)!");   }   try {   port = Integer.parseInt(txt_port.getText());   } catch (Exception e1) {   throw new Exception("端口號(hào)為正整數(shù)!");   }   if (port <= 0) {   throw new Exception("端口號(hào) 為正整數(shù)!");   }   serverStart(max, port);   contentArea.append("服務(wù)器已成功啟動(dòng)!人數(shù)上限:" + max + ",端口:" + port    + "/r/n");   JOptionPane.showMessageDialog(frame, "服務(wù)器成功啟動(dòng)!");   btn_start.setEnabled(false);   txt_max.setEnabled(false);   txt_port.setEnabled(false);   btn_stop.setEnabled(true);  } catch (Exception exc) {   JOptionPane.showMessageDialog(frame, exc.getMessage(),    "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);  }  } });  // 單擊停止服務(wù)器按鈕時(shí)事件 btn_stop.addActionListener(new ActionListener()  {  public void actionPerformed(ActionEvent e)   {  if (!isStart) {   JOptionPane.showMessageDialog(frame, "服務(wù)器還未啟動(dòng),無(wú)需停止!", "錯(cuò)誤",    JOptionPane.ERROR_MESSAGE);   return;  }  try {   closeServer();   btn_start.setEnabled(true);   txt_max.setEnabled(true);   txt_port.setEnabled(true);   btn_stop.setEnabled(false);   contentArea.append("服務(wù)器成功停止!/r/n");   JOptionPane.showMessageDialog(frame, "服務(wù)器成功停止!");  } catch (Exception exc) {   JOptionPane.showMessageDialog(frame, "停止服務(wù)器發(fā)生異常!", "錯(cuò)誤",    JOptionPane.ERROR_MESSAGE);  }  } }); }  // 啟動(dòng)服務(wù)器 public void serverStart(int max, int port) throws java.net.BindException  { try {  clients = new ArrayList<ClientThread>();  serverSocket = new ServerSocket(port);  serverThread = new ServerThread(serverSocket, max);  serverThread.start();  isStart = true; } catch (BindException e) {  isStart = false;  throw new BindException("端口號(hào)已被占用,請(qǐng)換一個(gè)!"); } catch (Exception e1) {  e1.printStackTrace();  isStart = false;  throw new BindException("啟動(dòng)服務(wù)器異常!"); } }  // 關(guān)閉服務(wù)器 @SuppressWarnings("deprecation") public void closeServer() { try {  if (serverThread != null)  serverThread.stop();// 停止服務(wù)器線程   for (int i = clients.size() - 1; i >= 0; i--) {  // 給所有在線用戶發(fā)送關(guān)閉命令  clients.get(i).getWriter().println("CLOSE");  clients.get(i).getWriter().flush();  // 釋放資源  clients.get(i).stop();// 停止此條為客戶端服務(wù)的線程  clients.get(i).reader.close();  clients.get(i).writer.close();  clients.get(i).socket.close();  clients.remove(i);  }  if (serverSocket != null) {  serverSocket.close();// 關(guān)閉服務(wù)器端連接  }  listModel.removeAllElements();// 清空用戶列表  isStart = false; } catch (IOException e) {  e.printStackTrace();  isStart = true; } }  // 群發(fā)服務(wù)器消息 public void sendServerMessage(String message) { for (int i = clients.size() - 1; i >= 0; i--) {  clients.get(i).getWriter().println("服務(wù)器:" + message);  clients.get(i).getWriter().flush(); } }  // 服務(wù)器線程 class ServerThread extends Thread { private ServerSocket serverSocket; private int max;// 人數(shù)上限  // 服務(wù)器線程的構(gòu)造方法 public ServerThread(ServerSocket serverSocket, int max) {  this.serverSocket = serverSocket;  this.max = max; }  public void run() {  while (true) {// 不停的等待客戶端的鏈接  try {   Socket socket = serverSocket.accept();   if (clients.size() == max) {// 如果已達(dá)人數(shù)上限   BufferedReader r = new BufferedReader(    new InputStreamReader(socket.getInputStream()));   PrintWriter w = new PrintWriter(socket    .getOutputStream());   // 接收客戶端的基本用戶信息   String inf = r.readLine();   StringTokenizer st = new StringTokenizer(inf, "@");   User user = new User(st.nextToken(), st.nextToken());   // 反饋連接成功信息   w.println("MAX@服務(wù)器:對(duì)不起," + user.getName()    + user.getIp() + ",服務(wù)器在線人數(shù)已達(dá)上限,請(qǐng)稍后嘗試連接!");   w.flush();   // 釋放資源   r.close();   w.close();   socket.close();   continue;   }   ClientThread client = new ClientThread(socket);   client.start();// 開啟對(duì)此客戶端服務(wù)的線程   clients.add(client);   listModel.addElement(client.getUser().getName());// 更新在線列表   contentArea.append(client.getUser().getName()    + client.getUser().getIp() + "上線!/r/n");  } catch (IOException e) {   e.printStackTrace();  }  } } }  // 為一個(gè)客戶端服務(wù)的線程 class ClientThread extends Thread  { private Socket socket; private BufferedReader reader; private PrintWriter writer; private User user;  public BufferedReader getReader()  {  return reader; }  public PrintWriter getWriter()  {  return writer; }  public User getUser()  {  return user; }  // 客戶端線程的構(gòu)造方法 public ClientThread(Socket socket)  {  try {  this.socket = socket;  reader = new BufferedReader(new InputStreamReader(socket   .getInputStream()));  writer = new PrintWriter(socket.getOutputStream());  // 接收客戶端的基本用戶信息  String inf = reader.readLine();  StringTokenizer st = new StringTokenizer(inf, "@");  user = new User(st.nextToken(), st.nextToken());  // 反饋連接成功信息  writer.println(user.getName() + user.getIp() + "與服務(wù)器連接成功!");  writer.flush();  // 反饋當(dāng)前在線用戶信息  if (clients.size() > 0)   {   String temp = "";   for (int i = clients.size() - 1; i >= 0; i--)    {   temp += (clients.get(i).getUser().getName() + "/" + clients    .get(i).getUser().getIp())    + "@";   }   writer.println("USERLIST@" + clients.size() + "@" + temp);   writer.flush();  }  // 向所有在線用戶發(fā)送該用戶上線命令  for (int i = clients.size() - 1; i >= 0; i--)   {   clients.get(i).getWriter().println(    "ADD@" + user.getName() + user.getIp());   clients.get(i).getWriter().flush();  }  } catch (IOException e)   {  e.printStackTrace();  } }  @SuppressWarnings("deprecation") public void run() {// 不斷接收客戶端的消息,進(jìn)行處理。  String message = null;  while (true) {  try {   message = reader.readLine();// 接收客戶端消息   if (message.equals("CLOSE"))// 下線命令   {   contentArea.append(this.getUser().getName()    + this.getUser().getIp() + "下線!/r/n");   // 斷開連接釋放資源   reader.close();   writer.close();   socket.close();    // 向所有在線用戶發(fā)送該用戶的下線命令   for (int i = clients.size() - 1; i >= 0; i--)    {    clients.get(i).getWriter().println(     "DELETE@" + user.getName());    clients.get(i).getWriter().flush();   }    listModel.removeElement(user.getName());// 更新在線列表    // 刪除此條客戶端服務(wù)線程   for (int i = clients.size() - 1; i >= 0; i--)    {    if (clients.get(i).getUser() == user)     {    ClientThread temp = clients.get(i);    clients.remove(i);// 刪除此用戶的服務(wù)線程    temp.stop();// 停止這條服務(wù)線程    return;    }   }   } else {   dispatcherMessage(message);// 轉(zhuǎn)發(fā)消息   }  } catch (IOException e)   {   e.printStackTrace();  }  } }  // 轉(zhuǎn)發(fā)消息 public void dispatcherMessage(String message)  {  StringTokenizer stringTokenizer = new StringTokenizer(message, "@");  String source = stringTokenizer.nextToken();  String owner = stringTokenizer.nextToken();  String content = stringTokenizer.nextToken();  message = source + "說(shuō):" + content;  contentArea.append(message + "/r/n");  if (owner.equals("ALL")) {// 群發(fā)  for (int i = clients.size() - 1; i >= 0; i--) {   clients.get(i).getWriter().println(message);   clients.get(i).getWriter().flush();  }  } } }}

java,局域網(wǎng)聊天,小程序

運(yùn)行截圖

java,局域網(wǎng)聊天,小程序

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中国美女乱淫免费看视频| 精品人妻人人做人人爽| 欧美成人精品一区二区免费看片| 国产一区二区三区不卡在线观看| 国产一区二区在线视频观看| 菠萝蜜视频在线观看一区| 欧美videos中文字幕| 激情久久综合| 欧美日韩一本| 国产一区二区三区免费看| 日本韩国精品在线| 欧美男体视频| 国产aa视频| 影音先锋黄色网址| 五月婷婷在线观看| 亚洲精品少妇一区二区| av电影在线观看网站| 国产成人在线看| 精品国产乱码久久久久软件| 国产精品av免费在线观看| 欧美裸体bbwbbwbbw| 一区二区自拍偷拍| 91小视频在线免费看| 亚洲成人免费在线视频| 91国内在线视频| 涩爱av色老久久精品偷偷鲁| 欧美自拍丝袜亚洲| 欧美日韩一区二区视频在线观看| 国产精品成人va在线观看| 深夜黄色小视频| 五月天婷婷视频| 欧美人与物videos另类| 国产男女爽爽爽| 亚洲精品aⅴ中文字幕乱码| 欧美日韩一区二区三区高清| 国产精品一区二区欧美| 日韩黄色影院| 国产精品久久久久秋霞鲁丝| 成人网站免费观看入口| 久久gogo国模啪啪裸体| 精品国产乱码久久久久久天美| 久久99久久99精品免观看软件| 亚洲男人都懂的| 一区在线影院| 91精品91久久久中77777老牛| 亚洲一区二区三区四区不卡| 一级做a爱片久久毛片| 欧美在线91| 国产欧美日韩在线播放| yw在线观看| 超碰在线影院| 激情文学综合丁香| 国产精品激情| 狠狠色狠狠色综合日日tαg| 国产视频青青| 国产精品久久久久久久久影视| 亚洲h片在线看| 欧美精品一区二区三区在线四季| 一级片aaaa| 色综合久久久久综合体| 亚洲一级Av无码毛片久久精品| 欧美大胆a人体大胆做受| 国产电影一区二区三区| 97人妻精品一区二区三区| 亚洲国产精品三区| 中文字幕亚洲一区在线观看| 国产日产精品一区二区三区的介绍| 黄色av免费观看| 香蕉视频黄在线观看| 30一40一50老女人毛片| 头脑特工队2在线播放| 欧美中文日韩| 91亚洲大成网污www| 91久色国产| 国产97人人超碰caoprom| 国产精品视频播放| 蜜桃在线一区二区三区精品| 日韩精品你懂的| 欧美3p视频在线观看| 特级西西www444人体聚色| 四虎国产精品永久地址998| 一区二区视频免费在线观看| 亚洲wwww| 最新久久zyz资源站| 欧日韩免费视频| 美女被人操视频在线观看| 国产激情久久久久久熟女老人av| 黑人精品一区二区三区| 偷偷看偷偷操| 久久久久中文字幕| 亚洲精品国产精品乱码视色| 欧美精品乱人伦久久久久久| 欧美老熟妇喷水| 国产99精品一区| 亚洲最大色网站| 国产高清大尺度一区二区不卡| 成人黄色网址| 97视频精彩视频在线观看| 欧美肥妇bbwbbw| www.日韩av| 日本视频精品一区| av无码精品一区二区三区| 亚洲人成在线免费观看| 一区二区高清不卡| 天天干天天干天天干天天干天天干| 国产欧美一区二区三区视频在线观看| 在线视频观看亚洲| 国产一区二区99| va天堂va亚洲va影视| www.xxxx日本| 天天色综合久久| 四虎中文字幕| 欧美精品丝袜久久久中文字幕| 波多野结衣影院| 欧美图区在线视频| 天干夜天天夜天干天ww| 麻豆成人在线观看| 精品人妻久久久久一区二区三区| 亚洲一区不卡在线| 日本少妇xxx| 美女扒开腿让男人桶爽久久软| 四虎成人免费电影| 欧美老女人性生活视频| 国产一区日韩一区| 成人性生交大片免费看视频直播| 外国电影一区二区| 国产精品视频一区二区图片| 一二三区免费视频| 99久久久久久中文字幕一区| 国产午夜精品一区二区三区视频| 亚洲欧美日韩精品永久在线| 色偷偷888欧美精品久久久| 久久中文久久字幕| 欧美性猛交99久久久久99按摩| 亚洲国产精品一区| 午夜精品视频在线观看一区二区| 欧美天堂视频| 日本aa大片在线播放免费看| 图片区小说区亚洲| 国产a免费视频| 亚洲一二三区av| 99久久精品免费看国产小宝寻花| 好吊妞视频这里有精品| 国精产品一区二区三区有限公司| 9.1成人看片免费版| 中文字幕第三区| 欧美黄色一区二区| 亚洲中国最大av网站| 激情综合网五月天| 国产一区二区三区不卡av| 国产91对白在线播放| www.久色| 外国成人免费视频| 日韩成人在线观看视频| 正在播放一区| 麻豆精品免费视频| 亚洲欧美日韩久久精品| 精品一区二区三区在线成人| 国产 日韩 欧美一区| se在线视频| 白丝女仆被免费网站| c++连点器| 成人91视频| 99pao成人国产永久免费视频| 国产99久久精品一区二区永久免费| 狼人天天伊人久久| 国产丝袜控视频在线观看| xvideos国产在线视频| 国产精品自在在线| 日本三级韩国三级欧美三级| 欧美色图一区| 午夜精品福利一区二区蜜股av| 国产一区二区三区精品视频| 4hu最新网址| 99精品人妻无码专区在线视频区| 色诱av手机版| 在线亚洲+欧美+日本专区| 日本肉体xxxx裸体784大胆| 在线观看国产91| 亚洲视频日本| 精品福利一区二区三区免费视频| 青草久久伊人| 性欧美疯狂猛交69hd| 欧美深夜视频| 中国jizz妇女jizz妇女| 亚洲欧洲日韩综合二区| 日韩午夜激情免费电影| 91动漫在线| 一二三四在线观看免费高清中文在线观看| 国产欧美精品一区二区色综合朱莉| 国产精品欧美一区二区三区不卡| 国产在线高清| 少妇免费视频| 国产精品v欧美精品v日韩| 久久91超碰青草是什么| 天堂网在线观看国产精品| 久久一二三国产| 亚洲欧洲美洲在线综合| 精品一区欧美| 无码播放一区二区三区| 成人国产在线看| 日韩1区2区日韩1区2区| 91欧美日韩| 欧美亚洲日本一区二区三区| 亚洲无人区一区| 亚洲精品欧美综合四区| 丁香婷婷成人| 中文字幕综合网| 久久精品久久99精品久久| 思思久久99热只有频精品66| 国产成人自拍一区| 日韩欧美在线观看免费| 91精品国产91久久| 成全电影播放在线观看国语| 欧洲猛交xxxx乱大交3| 久久久91精品| 无码人妻一区二区三区精品视频| 黄视频在线播放| 电影天堂爱爱爱爱| 免费亚洲一区| 午夜一区二区三区不卡视频| 激情综合在线| 男女视频在线观看| 欧美裸体男粗大视频在线观看| xxxxx性| 亚洲熟女综合色一区二区三区| 天天操天天射天天色| 嫩草国产精品入口| 亚洲一区国产| 亚洲视频在线播放免费| 中文字幕有码av| 免费福利视频一区| 蜜臀av免费在线观看| 性感美女久久精品| 国产精品三区在线| 99国产精品一区二区三区| 污视频网站在线观看| 日韩欧美国产精品一区| 亚洲成人久久久久| 在线不卡免费欧美| 杨幂毛片午夜性生毛片| 精品日产乱码久久久久久仙踪林| 粉嫩av免费一区二区三区| 九九九九精品九九九九| 国产一区日韩一区| 国产乱淫av片| 亚洲成色最大综合在线| 在线观看日韩| 欧美顶级xxxxbbbb| 国产精品久久毛片av大全日韩| 国产日韩欧美综合一区| a级女人18毛片| 久久国产视频网站| www.xxxx精品| 国产尤物在线视频| 成人a免费在线看| 丁香六月久久综合狠狠色| 色www亚洲国产阿娇yao| 99国产一区二区三精品乱码| 国产精品无码一区二区桃花视频| 精久久久久久| 五月婷婷欧美激情| 国产精品粉嫩| 亚洲一区在线电影| 欧美xxxxbb| 99精品视频免费全部在线| 欧美xxxx做受欧美88bbw| 欧美高清自拍一区| 色播五月激情综合网| 91精品成人| 成人免费在线视频网址| 日韩午夜中文字幕| 美乳美女在线观看香蕉| 欧美日韩亚洲综合一区| 午夜精品久久久久久久无码| 蜜桃精品噜噜噜成人av| 成人av二区| 欧美~级网站不卡| 亚洲免费伊人电影| 日韩av手机版| 亚洲美女色播| 国产深夜男女无套内射| 美女网站色免费| 亚洲麻豆一区二区三区| 国产经典自拍视频在线观看| 国产精品美女主播在线观看纯欲| 96sao精品视频在线观看| 欧美激情精品久久久久久| 性生大片免费观看性| 欧美国产在线电影| 国产精品自拍视频一区| 亚洲黄色av一区| 欧美美女黄色网| 国产免费内射又粗又爽密桃视频| 国产成人精品1024| 欧美一级xxxx| 色多多视频在线观看| 亚洲精品日韩欧美| 亚洲日本中文字幕免费在线不卡| 国产精品国产三级国产专播品爱网| 免费观看黄一级视频| 蜜桃国内精品久久久久软件9| 一级日韩一区在线观看| 日韩另类在线| 精品国产91亚洲一区二区三区www| 国产免费av网站| 91短视频版在线观看www免费| 亚洲午夜三级在线| 色哟哟亚洲精品一区二区| 欧美中文字幕久久| 一本色道a无线码一区v| 四虎成人欧美精品在永久在线| www.久久视频| 久艹在线观看视频| 欧美色视频日本高清在线观看| 欧美日韩黄色一级片| 伊人激情综合| 伊人久久中文字幕| 国产中文欧美日韩在线| 日韩在线一区二区视频| 国产精品88a∨| 久色乳综合思思在线视频| 亚洲福利天堂| 另类亚洲自拍| 国产精品无码一区二区三区免费| 久久久久久9| 久久久久久久久国产一区| 欧美一级高清大全免费观看|