`

用java写的基于Socket的简单即时通讯程序

阅读更多
用java写的基于Socket的简单即时通讯程序,用户可以注册并登录,也可以作为游客身份使用.
/**//*
 *服务端
 */
package edu.jlu.fuliang;

import java.io.*;
import java.net.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class Server extends JFrame implements Runnable {
 private ServerSocket server;
 private Socket connection;
 private OutputStream output;
 private InputStream input;
 private Thread outThread;
 private JTextArea display;
 private JTextField text1;
 private JButton startButton;
 
 public static void main(String args[]) {
  Server s = new Server();
  s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

 public Server() {
  super("Server");
  startButton = new JButton("Start the server");
  text1 = new JTextField(20);
  display = new JTextArea(7, 30);
  display.setEditable(false);
 Container container = getContentPane();
  container.setLayout(new BorderLayout());
  container.add(startButton,BorderLayout.NORTH);
  container.add(new JScrollPane(display),BorderLayout.CENTER);
  container.add(text1,BorderLayout.SOUTH); 

 /**//*
   * 给开始按钮添加监听器。
   */
  startButton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    display.setText("启动服务器 ");
    startButton.setEnabled(false);
    try {
     //端口设为5000,最大连接请求为100个
     server = new ServerSocket(5000, 100);
     connection = server.accept();
     output = connection.getOutputStream();
     input = connection.getInputStream();
     output.write("连接成功! ".getBytes());
     outThread = new Thread(Server.this);
     outThread.start();
     } catch (IOException ee) {
    }
   }
  });
  
  /**//*
  /*给文本域添加键盘监听器,按回车发送信息。
        */
  
  text1.addKeyListener(new KeyAdapter(){
   public void keyPressed(KeyEvent ke) {
    if(ke.getKeyCode() == KeyEvent.VK_ENTER){
     byte writeBytes[] = new byte[50];
     String s = "Server: " + text1.getText() + "";
     text1.setText("");
     writeBytes = s.getBytes();
     display.append(s+" ");
     try {
      output.write(writeBytes);
     } catch (IOException ee) {
     }
     if (s.trim().equals("Server: exit")) {
      outThread.stop();
      quit();
     }
    }
   }
  });
  setSize(300, 400);
  setResizable(false);
  setVisible(true);
 }

 public void run() {
  while (true) {
   byte readBytes[] = new byte[50];
   try {
    input.read(readBytes);//读去对方发送的消息
   } catch (IOException e) {
   }
   String s = new String(readBytes);
   display.append(s+" ");
   if (s.trim().equals("Client: exit"))
    break;
  }
  quit();
 }

 public void quit() {
  try {
   output.close();
   input.close();
   connection.close();
  } catch (IOException e) {
  }
  startButton.setEnabled(true);
 }
}
/**//*
 *客户端
 */
package edu.jlu.fuliang;

import java.io.*;
import java.net.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class Client extends JFrame implements Runnable {
 private Socket client;
 private OutputStream output;
 private InputStream input;
 private Thread outThread;
 private JTextArea display;
 private JTextField text1;
 private JButton startButton;
 private JMenu loginMenu = new JMenu("登录"); 
 private JMenuItem register = new JMenuItem("注册");
 private JMenuItem login = new JMenuItem("登录");
 private JMenuBar bar = new JMenuBar();
 private Register registerDlg ;
 private Login loginDlg;
 private RandomAccessFile file;

 public static void main(String args[]) {
  Client c = new Client();
  c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

 public Client() {
  super("Client");
  startButton = new JButton("Connect to server");
  text1 = new JTextField(20);
  display = new JTextArea(7, 30);
  display.setEditable(false);
   loginMenu.add(register);
  loginMenu.add(login);
  bar.add(loginMenu);
  setJMenuBar(bar);
  Container container = getContentPane();
  container.setLayout(new BorderLayout());
  container.add(startButton,BorderLayout.NORTH);
  container.add(new JScrollPane(display),BorderLayout.CENTER);
  container.add(text1,BorderLayout.SOUTH);

  try {
     file = new RandomAccessFile(new File("E://login.txt"),"rw");
  } catch (IOException e1) {
   e1.printStackTrace();
  }
  registerDlg = new Register(this,file);
  loginDlg = new Login(this,file);
  startButton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    display.setText("连接服务器");
    startButton.setEnabled(false);
    try {
     client = new Socket("127.0.0.1", 5000);
     output = client.getOutputStream();
     input = client.getInputStream();
     outThread = new Thread(Client.this);
     outThread.start();
    } catch (IOException ee) {
    }
   }
  });
  text1.addKeyListener(new KeyAdapter(){
   public void keyPressed(KeyEvent ke) {
   if(ke.getKeyCode() == KeyEvent.VK_ENTER){
    byte writeBytes[] = new byte[50];
    String s = loginDlg.getLoginName()+": " + text1.getText() + "";
    text1.setText("");
    writeBytes = s.getBytes();
    display.append(s+" ");
    try {
     output.write(writeBytes);
    } catch (IOException ee) {
    }
    if (s.trim().equals(loginDlg.getLoginName()+": exit")) {
     outThread.stop();
     quit();
    }
   }
   }
  });
  register.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    registerDlg.setVisible(true);
   }
  });
  login.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    loginDlg.setVisible(true);
   }
  });
  setSize(300, 400);
  setResizable(false);
  setVisible(true);
 }

 public void run() {
  while (true) {
   byte readBytes[] = new byte[1024];
   try {
    input.read(readBytes);
   } catch (IOException e) {
   }
   String s = new String(readBytes);
   display.append(s+" ");
   if (s.trim().equals("Server: exit"))
    break;
  }
  quit();
 }

 public void quit() {
  try {
   output.close();
   input.close();
   client.close();
  } catch (IOException e) {
  }
  startButton.setEnabled(true);
 }
}

package edu.jlu.fuliang;

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


public class Login extends JDialog{
 private JTextField textField;
 private JButton loginButton;
 private RandomAccessFile file;//保存注册信息的文件
 private String loginName = "guest";//保存登录者的名字,为登陆为guest;
 
 public Login(JFrame f,RandomAccessFile file){
  super(f,"登陆",false);
  this.file = file;
  JPanel panel = new JPanel();
  panel.add(new JLabel("昵称:"));
  textField = new JTextField(10);
  panel.add(textField);
  Container container = getContentPane();
  container.setLayout(new BorderLayout());
  container.add(panel,BorderLayout.NORTH);
  loginButton = new JButton("登陆");
  container.add(loginButton,BorderLayout.SOUTH);
  setVisible(false);
  setBounds(100,200,200,200);
  loginButton.addActionListener(new LoginListener());
 }
 
 public String getLoginName(){
  return loginName;
 }
 /**//*
  * 登录监听器,当单击登陆按钮时,触发该事件
  * 从文件中读取并查找是否注册过,如果没有找
  * 到则弹出未注册警告。否则弹出欢迎对话框表
  * 示欢迎
  */
 private class LoginListener implements ActionListener{
 public void actionPerformed(ActionEvent e) {
  boolean flag = false;
  try {
   String name = textField.getText().trim();
   textField.setText("");
   file.seek(0);
   while(file.getFilePointer() < file.length()){
    String nik = file.readUTF();
    if(nik.equals(name)){
     flag = true;
     loginName = name;
     break;
    }
   }
   if(!flag){
    String warning="没有找到你的账号请先注册!";
             JOptionPane.showMessageDialog(Login.this,warning,"警告",JOptionPane.WARNING_MESSAGE);
   }else{
    String welcome="欢迎来聊天!";
             JOptionPane.showMessageDialog(Login.this,welcome,"欢迎",JOptionPane.WARNING_MESSAGE);
   }
   Login.this.setVisible(false);
  } catch (IOException e1) {
   e1.printStackTrace();
  }
 }
 }
}

package edu.jlu.fuliang;

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


public class Register extends JDialog{
 private String nickName;
 private JTextField textField;
 private JButton registerButton;
 private RandomAccessFile file;////保存注册信息的文件
 
 public Register(JFrame f,RandomAccessFile file){
  super(f,"注册",false);
  this.file = file;
  JPanel panel = new JPanel();
  panel.add(new JLabel("昵称:"));
  textField = new JTextField(10);
  panel.add(textField);
  Container container = getContentPane();
  container.setLayout(new BorderLayout());
  container.add(panel,BorderLayout.NORTH);
  registerButton = new JButton("注册");
  container.add(registerButton,BorderLayout.SOUTH);
  setVisible(false);
  setBounds(100,200,200,200);
  registerButton.addActionListener(new RegisterListener());
 }
 /**//*
  * 注册监听器,当单击登注册按钮时,触发该事件
  * 并向文件中写入注册信息。
  */
 private class RegisterListener implements ActionListener{
 public void actionPerformed(ActionEvent e) {
  try {
   file.seek(file.length());
   String  str = textField.getText();
   textField.setText("");
   file.writeUTF(str);
   Register.this.setVisible(false);
  } catch (IOException e1) {
   e1.printStackTrace();
  }
 }
 }
}


分享到:
评论

相关推荐

    基于Socket的即时通讯系统_源代码

    本项目“基于Socket的即时通讯系统”是针对这一领域的一个课程设计,通过源代码的形式提供了实现即时通讯功能的基础框架。Socket作为网络编程的核心组件,是构建此类系统的关键技术。 在即时通讯系统中,Socket扮演...

    java socket开发即时通讯服务器

    即时通讯服务器通常需要定义自己的通信协议,如基于文本的简单协议(如XML、JSON)或二进制协议(如protobuf)。协议设计应考虑以下几点: 1. **消息头**:标识消息的类型、长度等元信息。 2. **消息体**:承载实际...

    JAVA即时通讯+P2P+socket

    本项目利用Java的Socket编程技术,实现了一个简单的类QQ即时通讯程序,旨在提供基本的聊天功能。下面我们将深入探讨相关知识点。 首先,Java Socket编程是Java网络编程的基础,它提供了在网络之间两台计算机进行...

    Java基于socket的进程间通信 聊天小程序

    Java基于Socket的进程间通信(IPC)是一种网络编程技术,常用于实现客户端和服务器之间的通信。在这个场景下,我们讨论的是一个简单的聊天小程序,它利用了Java的Socket库来搭建客户端与服务器之间的桥梁,实现数据...

    java_chat_program.rar_socket java用户_socket即时通讯

    总的来说,这个Java Socket即时通讯程序实例提供了学习和实践网络编程、用户认证和消息传递机制的好机会。通过深入分析和理解源代码,我们可以更好地掌握这些关键技能,并能应用于更复杂的网络应用开发中。

    java Socket即时通讯

    Java Socket即时通讯是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过互联网进行双向数据传输。在Java中,Socket编程是实现客户端-服务器应用通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...

    基于Java语言开发IM即时通讯聊天系统源码.zip

    本项目"基于Java语言开发IM即时通讯聊天系统源码.zip"提供了完整的源代码,帮助开发者深入理解IM系统的实现机制。以下是这个系统的核心知识点及详细解析: 1. **Java编程基础**:作为基础,开发者需要熟悉Java编程...

    java学习 基于JAVA的即时通讯项目

    【Java学习:基于Java的即时通讯项目】 在深入探讨基于Java的即时通讯(Instant Messaging,简称IM)项目之前,我们首先要理解Java语言的基础知识。Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems...

    基于Java的即时通讯系统设计与实现【文献综述】.doc

    【总结】基于Java的即时通讯系统设计与实现结合了Java语言的优势,能够构建稳定、高效的即时通讯平台,满足用户多样化的需求。从娱乐、社交到商务应用,Java的即时通讯系统在现代社会中扮演着日益重要的角色。

    java基于socket通信

    Java基于Socket通信是一种常见的网络编程方式,主要用于实现客户端与服务器之间的数据交互。在这个场景中,我们看到"基于socket、mysql数据库和java组件、线程实现的qq基本通信"描述,这意味着我们将讨论如何利用...

    基于Java的即时通讯软件设计与开发.pdf

    论文中提出了JavaH i系统的设计和实现,JavaH i是一个基于Java虚拟机的跨平台即时通讯工具,具有跨平台、安全性、多线程和网络Socket编程的优点。 以下是该论文中的主要知识点: 1. 即时通讯的定义和分类:即时...

    socket通讯汇总

    基于Socket的Java语言网络通讯机制和程序设计 pdf 基于SOCKET的JAVA网络编程1 pdf 基于SOCKET的JAVA网络编程 pdf "&gt;用Java实现一个UDP通信模型 pdf 用Java实现一个Socket通信模型 pdf 用Java实现网络通讯 pdf ...

    socket通讯资料汇总

    用Java实现一个UDP通信模型.pdf 用Java实现一个Socket通信模型.pdf 用Java实现网络通讯.pdf ...基于Socket的Java语言网络通讯机制和程序设计.pdf 基于SOCKET的JAVA网络编程1.pdf 基于SOCKET的JAVA网络编程.pdf ...

    socket即时通讯.zip

    【标题】"socket即时通讯.zip"的项目是一个基于Spring Boot框架和MySQL数据库的即时通讯系统。这个系统的主要目标是提供实时的在线聊天功能,并且具备查看在线用户数量以及记录聊天历史的能力。 【核心技术与概念】...

    基于java一个简单的即时通讯工具开发

    在本文中,我们将深入探讨如何使用Java开发一个简单的即时通讯工具。即时通讯工具,或IM(Instant Messaging),是人们日常工作中不可或缺的一部分,它允许用户实时发送消息、进行语音或视频通话,甚至分享文件。...

    基于JAVA的即时通讯项目.zip

    【标题】:“基于JAVA的即时通讯项目.zip” 这个标题表明我们正在探讨的是一个使用Java编程语言实现的即时通讯(Instant Messaging, IM)项目。Java是一种广泛使用的、面向对象的编程语言,以其跨平台的特性而闻名...

    基于java的即时通讯的设计与开发--计算机系毕业论文.doc

    "基于Java的即时通讯的设计与开发" 基于 Java 的即时通讯的设计与开发是计算机系毕业论文的主题,这个论文的主要目标是设计和开发一个安全、私有的、本地或本部门化的即时通讯工具。该论文首先介绍了即时通讯的概念...

    精选_基于JAVA和TCP SOCKET实现的P2P的局域网即时通信系统_源码打包

    在本项目中,"精选_基于JAVA和TCP SOCKET实现的P2P的局域网即时通信系统_源码打包" 提供了一个实现P2P(Peer-to-Peer)局域网即时通信系统的完整源码。这个系统利用了TCP/IP协议栈和Java编程语言,为用户提供了一种...

    简单的聊天程序java和socket的应用

    在提供的"MyQQ"文件中,可能包含了实现上述步骤的Java代码,模拟了类似QQ即时通讯的基本功能。通过运行这个程序,你可以看到如何实现客户端与服务器之间的消息传递。 学习这个例子时,要注意以下几点: - **异常...

Global site tag (gtag.js) - Google Analytics