Java基于Tcp/ip连接的多人交互聊天室

本文实例为大家分享了Java  Socket编程实现多人交互聊天室的具体代码,供大家参考,具体内容如下

本项目由三个.java文件(Client.java、Server.java、UI.java)和一个.jpg图片文件组成UI.java是负责界面的构成文件。本聊天室的界面极其简单。主要分为两个界面:第一个是启动时需要登陆的界面如下:

输入名字进去以后就可以直接聊天

 
 

这个聊天室相当于群聊,每一个登陆进去的人发的信息,其他人都会收到。
使用指南:

1.运行Server.java文件,保证服务端的开启
2.运行UI.java文件,界面登陆。每运行一个UI文件并登陆进去,就代表一个客户进了群聊中,可进行对话。

程序简单易懂,非常适合初学者练习网络编程的知识。

Client.java

import java.net.*;
import java.io.*;
import java.util.*;

public class Client{

  String name;
  Socket s;
  UI ui;
  //构造方法 ,把UI对象传过来
  public Client(UI ui){
    this.ui = ui;
  }

  //从登陆界面获得名字并传去服务端
  public void getName(String name){
    try{
    s = new Socket("127.0.0.1",3000);
    Cli1 d = new Cli1(s,ui);
    d.start();
    this.name = name;
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    dos.writeUTF(name);
    }catch(Exception e){
      e.printStackTrace();
    }
  }
  //从聊天界面获得要发送的内容并经服务器转发给各个客户端
  public void say(String content){
    try{
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    dos.writeUTF(content);
    }catch(Exception e){
      e.printStackTrace();
    }
  }

}

//输入和输出
class Cli1 extends Thread {
  UI ui;
  Socket s ;
  public Cli1(Socket s,UI ui){
    this.s = s;
    this.ui=ui;
  }
  public void run(){
    try{
    while(true){

      DataInputStream dis = new DataInputStream(s.getInputStream());
      String content = dis.readUTF();
      if(!content.equals("")&&content!=null){
        System.out.println(content);
        ui.say(content);
      }

    }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

Server.java

import java.net.*;
import java.io.*;
import java.util.*;

public class Server{
  static Socket s;
  static Socket[] soc;
  static String[] name;
  static int k = 5,i =0,j;
  public static void main(String[] args){

    Server ser = new Server();
    try{
      ServerSocket ss = new ServerSocket(3000);

      soc = new Socket[k];
      name = new String[k];
      while(true){
        s = ss.accept();
        soc[i]= s;
        j=i;
        i++;
        DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 

        DataInputStream dis = new DataInputStream(s.getInputStream());
        name[j] = dis.readUTF();
        System.out.println(name[j]+"已进入群聊!");
        dos.writeUTF("欢迎你,"+name[j]);
        new Ser1().start();

      }
    }catch(ConnectException e){
      System.out.println("连接异常!!");

    }catch(IOException e){
      e.printStackTrace();
    }

  }

}

class Ser1 extends Thread{

  public int j;

  public void run(){
    try{
    DataInputStream read = new DataInputStream((Server.soc[Server.j]).getInputStream());
    j=Server.j;
    while(true){
      String con = read.readUTF();

      if(con!=null){

        System.out.println("该线程j为"+j);
        for(int i = 0;i<Server.soc.length;i++){
          if((i!=j)&&(Server.soc[i]!=null)){
            DataOutputStream dos = new DataOutputStream((Server.soc[i]).getOutputStream());
            dos.writeUTF(Server.name[Server.j]+"发送于 "+(new Date()));
            dos.writeUTF(con);
          }
        }

      }else{break;}
    }

  }catch(Exception e){
    e.printStackTrace();
  }
  }

}

UI.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class UI{

  //主方法
  public static void main(String[] args){

    UI ui = new UI();
    ui.cli = new Client(ui);
    ui.initFrame();
    ui.showLogin();
  }

  Ser1 ser1 = new Ser1();

  //初始化业务对象
  public Client cli = null;
  public void initCli(){

  }

  //初始化主窗口
  public int width = 720;
  public int height = 550;
  public JFrame jFrame = null; //界面窗口
  public JLayeredPane layeredPane = null; //层叠容器
  public JPanel backLayer = null; //背景层
  public JPanel frontLayer = null; //前景层
  public CardLayout cardLayout = null; //前景层布局器

  public void initFrame(){
    jFrame = new JFrame("老友聚乐部");
    layeredPane = new JLayeredPane();
    layeredPane.setPreferredSize(new Dimension(width, height));
    jFrame.add(layeredPane);
    jFrame.setResizable(false);
    jFrame.pack();
     jFrame.setVisible(true);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    backLayer = new JPanel();
    ((FlowLayout)backLayer.getLayout()).setHgap(0);
    ((FlowLayout)backLayer.getLayout()).setVgap(0);
    backLayer.setSize(width,height);
    backLayer.setLocation(0,0);
    JLabel bg = new JLabel(new ImageIcon("12.jpg"));
    backLayer.add(bg);

    layeredPane.add(backLayer,new Integer(0));

    frontLayer = new JPanel();
    cardLayout = new CardLayout(0,0);
    frontLayer.setLayout(cardLayout);
    frontLayer.setOpaque(false);
    frontLayer.setSize(width,height);
    frontLayer.setLocation(0,0);

    layeredPane.add(frontLayer,new Integer(1));

  }

  //登录界面
  public JPanel loginPane = null;
  public JTextField loginCodeInput = null;

  public JLabel loginTipsLabel = null;
  public void showLogin(){
    if(loginPane == null){
      loginPane = new JPanel();
      loginPane.setOpaque(false);

      Box loginBox = Box.createVerticalBox();
      loginBox.add(Box.createVerticalStrut(180));

      JPanel welcome_panel = new JPanel();
      welcome_panel.setOpaque(false);
      JLabel welcome_label = new JLabel("老友俱乐部");

      welcome_label.setForeground(Color.WHITE);
      welcome_label.setFont(new Font("微软雅黑",Font.PLAIN,30));
      welcome_panel.add(welcome_label);
      loginBox.add(welcome_panel);

      loginBox.add(Box.createVerticalStrut(50));
      JPanel code_panel = new JPanel();
      code_panel.setOpaque(false);
      JLabel code_label = new JLabel("姓名:");
      code_label.setForeground(Color.WHITE);
      code_label.setFont(new Font("微软雅黑",Font.PLAIN,25));
      code_panel.add(code_label);
      loginCodeInput = new JTextField(10);
      loginCodeInput.setFont(new Font("微软雅黑", Font.PLAIN,25));
      code_panel.add(loginCodeInput);
      loginBox.add(code_panel);

      loginBox.add(Box.createVerticalStrut(30));

      JPanel btn_panel = new JPanel();
      btn_panel.setOpaque(false);
      JButton login_btn = new JButton("登 录");
      login_btn.setFont(new Font("微软雅黑",Font.PLAIN,15));
      btn_panel.add(login_btn);

      JButton reset_btn = new JButton("重 置");
      reset_btn.setFont(new Font("微软雅黑",Font.PLAIN,15));
      btn_panel.add(reset_btn);
      loginBox.add(btn_panel);

      loginBox.add(Box.createVerticalStrut(10));

      JPanel tips_panel = new JPanel();
      tips_panel.setOpaque(false);
      loginTipsLabel = new JLabel("");
      loginTipsLabel.setForeground(new Color(238,32,32));
      loginTipsLabel.setFont(new Font("微软雅黑",Font.PLAIN,20));
      tips_panel.add(loginTipsLabel);
      loginBox.add(tips_panel);

      loginPane.add(loginBox);

      frontLayer.add("loginPane",loginPane);
      cardLayout.show(frontLayer,"loginPane");
      frontLayer.validate();
      loginCodeInput.requestFocus();

      reset_btn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
          loginCodeInput.setText("");
          loginTipsLabel.setText("");
          loginCodeInput.requestFocus();
        }
      });

      login_btn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
          String code_str = loginCodeInput.getText();

          if("".equals(code_str)){
            loginTipsLabel.setText("姓名不能为空!");
            loginCodeInput.requestFocus();

          }else{

            cli.getName(code_str);

            showTalk();

          }
        }
      });
    }else{
      cardLayout.show(frontLayer,"loginPane");
      loginCodeInput.setText("");

      loginTipsLabel.setText("");
      loginCodeInput.requestFocus();
    }
  }

  //聊天主界面
  public JPanel menuPane = null;
  public JTextArea input = null;
  public JTextArea talk = new JTextArea(25,70);
  public void showTalk(){

      menuPane = new JPanel();
      menuPane.setOpaque(false);
      menuPane.setLayout(new BorderLayout());

      JPanel up = new JPanel();
      Box tipsBox = Box.createVerticalBox();
      menuPane.add(up,BorderLayout.NORTH); //北边顶上
      up.add(tipsBox);

      JLabel tips_label = new JLabel("在线朋友");
      tips_label.setForeground(Color.WHITE);
      tips_label.setFont(new Font("微软雅黑",Font.PLAIN,20));
      tips_label.setAlignmentX(Component.LEFT_ALIGNMENT);
      tipsBox.add(tips_label);
      tipsBox.add(Box.createVerticalStrut(10));
      JLabel upTxt = new JLabel(""); //接收在线朋友(需完善)

      tipsBox.add(upTxt);

      JPanel talk_panel = new JPanel();//中间聊天对话框
      talk_panel.setOpaque(false);

      menuPane.add(talk_panel,BorderLayout.WEST);

      JScrollPane sp = new JScrollPane(talk);
      talk_panel.add(talk);

      Box inputBox = Box.createHorizontalBox(); //下边输入框
      menuPane.add(inputBox,BorderLayout.SOUTH);

      JPanel input_panel = new JPanel();
      input_panel.setOpaque(false); //放置输入框
      input = new JTextArea(4,30);
      input.setFont(new Font("微软雅黑",Font.PLAIN,20));
      input.setAlignmentX(Component.LEFT_ALIGNMENT);
      input_panel.add(input);
      inputBox.add(input_panel);
      inputBox.add(Box.createHorizontalStrut(0));
      JButton send_btn = new JButton("发送");
      send_btn.setFont(new Font("微软雅黑",Font.PLAIN,15));
      inputBox.add(send_btn);

      frontLayer.add("menuPane",menuPane);
      cardLayout.show(frontLayer,"menuPane");
      frontLayer.validate();

      send_btn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
          String append = talk.getText();
          String content = input.getText();
          talk.setText(append+'\n'+content);
          input.setText("");
          cli.say(content);

        }
      });

  }
  public void say(String content){
    if(talk!=null){
      String append = talk.getText();

      talk.setText(append+'\n'+content);
    }

  } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • TCP/IP协议中三次握手四次挥手的原理及流程分析

    当初学的是通信专业,毕业以后,同学们各奔东西,去追逐自己的梦想,奔波于大大小小的工地之间.哈哈,开个玩笑,也有厉害的,进了某某研究所,嗯?他爸不是所长,内心不要太阴暗.记得有一门十分高大上的课程,名字叫做计算机网络(大概是这个名字吧).里面有一个关于握手的概念,现在温习一下. 先来看看原理图: TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列

  • Java基于Socket实现网络编程实例详解

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

  • 详解Java的TCP/IP编程学习--基于定界符的成帧

    一.定界符成帧 Framer接口 package framer; import java.io.IOException; import java.io.OutputStream; public interface Framer { /** * 添加成帧信息并将指定消息输出到指定流 * @param message * @param out * @throws IOException */ void frameMsg(byte[] message, OutputStream out) throws

  • Java实现Socket的TCP传输实例

    本文实例讲述了Java实现Socket的TCP传输.分享给大家供大家参考.具体分析如下: 客户端发数据到服务端 * Tcp传输,客户端建立的过程. * 1,创建tcp客户端socket服务.使用的是Socket对象. * 建议该对象一创建就明确目的地.要连接的主机. * 2,如果连接建立成功,说明数据传输通道已建立. * 该通道就是socket流 ,是底层建立好的. 既然是流,说明这里既有输入,又有输出. * 想要输入或者输出流对象,可以找Socket来获取. * 可以通过getOutputSt

  • Java基于Tcp/ip连接的多人交互聊天室

    本文实例为大家分享了Java  Socket编程实现多人交互聊天室的具体代码,供大家参考,具体内容如下 本项目由三个.java文件(Client.java.Server.java.UI.java)和一个.jpg图片文件组成UI.java是负责界面的构成文件.本聊天室的界面极其简单.主要分为两个界面:第一个是启动时需要登陆的界面如下: 输入名字进去以后就可以直接聊天     这个聊天室相当于群聊,每一个登陆进去的人发的信息,其他人都会收到. 使用指南: 1.运行Server.java文件,保证服务

  • 基于vue和websocket的多人在线聊天室

    最近看到一些关于websocket的东西,就决定写一个在线聊天室尝试一下.最终决定配合vue来写,采用了官方的vue脚手架vue-cli和官方的router,在本例中呢,我是用了CHAT这个对象来存储app的数据的,但后来一想,虽然项目很小,但如果用官方的vuex会更好,方便以后扩展,比如可以加上私信功能,可以在对方不在线的时候缓存发送的消息,这些都是可以的.(现在比较尴尬的就是,我把聊天室写好放到公众号号redream里,但是很少有人会同时在线,所以你会经常发现你进去的时候只有你一个人,就导致

  • Java基于TCP协议socket网络编程的文件传送的实现

    先了解一下socket基本概念 socket也叫套接字: 是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象. 简单理解就是: 两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合: 就可以理解为一个端点,即为套接字 双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线) 简单理解了套接字的概念后,来看看如何通过java socket编程来实现 两台主机文件的接收与发送: 代码如下: 发送方: import java.io.*; impor

  • Java基于TCP协议的Socket通信

    目录 简介 TCP简介 JAVA Socket简介 SocketImpl介绍 TCP 编程 构造ServerSocket 1.1 绑定端口 1.2 设定客户连接请求队列的长度 1.3 设定绑定的IP 地址 1.4 默认构造方法的作用 多线程示例 简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户

  • 通过端口1433连接到主机127.0.0.1的 TCP/IP 连接失败,错误:“connect timed out”的解决方法

    我们在连接数据库时总会出现一些问题,今天给大家分享遇到通过端口1433连接到主机127.0.0.1的 TCP/IP 连接失败.错误:"connect timed out的解决办法. 环境:SQLServer 2008 R2 + MyEclipse 6.5 + JDK 1.6.24   问题: Java通过JDBC连接SQLServer 2008,出现如下问题:通过端口1433 连接到主机127.0.0.1 的TCP/IP 连接失败.错误:"connect timed out.请验证连接

  • Java实现TCP/IP协议的收发数据(服务端)代码实例

    这篇文章主要介绍了Java实现TCP/IP协议的收发数据(服务端)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 功能如下: 注: 只有服务端,没有客户端,测试时采用第三方软件作为客户端的. 收发数据目前能正常收发数据,只是中文的会变成乱码显示. 采用Thread类实现一个收发数据的线程. 服务端代码: import java.io.IOException; import java.io.InputStream; import java

  • Java 基于tcp协议实现文件上传

    服务端 package lesson02; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 服务端接收文件 */ public class TcpServerDemo2 { public static void main(String[] args) throws IOException { //1.创建服务 ServerSocket serverSocket = new ServerSo

  • Java基于Tcp协议的socket编程实例

    本文实例讲述了Java基于Tcp协议的socket编程方法,分享给大家供大家参考.具体分析如下: 以下是一对一的通信编程实现,后续会继续学习一个服务器监听多个客户端的实现. 这里用到的主要步骤如下: 第一步:以特定端口(如4800)新建socket对象 第二步:以系统输入设备构造BufferedReader对象,该对象用于接收系统键盘输入的字符 第三步:以socket对象 得到输出流来构造PrintWriter 第四步:以socket对象得到输入流来构造相应的BufferedReader对象,该

  • Java基于中介者模式实现多人聊天室功能示例

    本文实例讲述了Java基于中介者模式实现多人聊天室功能.分享给大家供大家参考,具体如下: 一 模式定义 中介者模式,用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显示地引用其他对象实例,从而降低各个对象之间的耦合度,并且可以独立地改变对象间的交互关系. 二 模式举例 1 模式分析 我们借用多人聊天室来说明这一模式 2 中介模式静态类图 3 代码示例 3.1中介者接口--IMediator package com.demo.mediator; import com.demo.coll

随机推荐