发布于 2016-07-28 23:28:53 | 189 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的Java设计模式,程序狗速度看过来!

Java程序设计语言

java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。


这篇文章主要给大家介绍基于Java Socket实现一个简易在线聊天功能(一),分为客户端和服务端两段代码,非常具有参考价值,感兴趣的朋友一起学习吧

最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到phperz平台,以此做个记录,方便自己和大家使用。

先给大家说下实现步骤分这样几大步:

1、使用awt组件和socket实现简单的单客户端向服务端持续发送消息;

2、结合线程,实现多客户端连接服务端发送消息;

3、实现服务端转发客户端消息至所有客户端,同时在客户端显示;

4、把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现。

这里首先实现第一步的简单功能,难点在于:

1、没有用过awt组件,没有用过java相关的监听事件;

2、长时间没有使用socket进行客户端和服务端的交互,并且没有真正进行过cs结构的开发。

实现功能的代码如下:

客户端:


package chat.chat; 
import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.awt.TextArea; 
import java.awt.TextField; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 
/** 
 * 在线聊天客户端 1、生成图形窗口界面轮廓 2、为轮廓添加关闭事件 3、在轮廓中加入输入区域和内容展示区域 4、为输入区域添加回车事件 
 * 5、建立服务端连接并发送数据 
 * 
 * @author tuzongxun123 
 * 
 */ 
public class ChatClient extends Frame { 
  // 用户输入区域 
  private TextField tfTxt = new TextField(); 
  // 内容展示区域 
  private TextArea tarea = new TextArea(); 
  private Socket socket = null; 
  // 数据输出流 
  private DataOutputStream dataOutputStream = null; 
  public static void main(String[] args) { 
    new ChatClient().launcFrame(); 
  } 
  /** 
   * 建立一个简单的图形化窗口 
   * 
   * @author:tuzongxun 
   * @Title: launcFrame 
   * @param 
   * @return void 
   * @date May 18, 2016 9:57:00 AM 
   * @throws 
   */ 
  public void launcFrame() { 
    setLocation(300, 200); 
    this.setSize(200, 400); 
    add(tfTxt, BorderLayout.SOUTH); 
    add(tarea, BorderLayout.NORTH); 
    pack(); 
    // 监听图形界面窗口的关闭事件 
    this.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
        System.exit(0); 
        disConnect(); 
      } 
    }); 
    tfTxt.addActionListener(new TFLister()); 
    setVisible(true); 
    connect(); 
  } 
  /** 
   * 连接服务器 
   * 
   * @author:tuzongxun 
   * @Title: connect 
   * @param 
   * @return void 
   * @date May 18, 2016 9:56:49 AM 
   * @throws 
   */ 
  public void connect() { 
    try { 
      // 新建服务端连接 
      socket = new Socket("127.0.0.1", 8888); 
      // 获取客户端输出流 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
      System.out.println("连上服务端"); 
    } catch (UnknownHostException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * 关闭客户端资源 
   * 
   * @author:tuzongxun 
   * @Title: disConnect 
   * @param 
   * @return void 
   * @date May 18, 2016 9:57:46 AM 
   * @throws 
   */ 
  public void disConnect() { 
    try { 
      dataOutputStream.close(); 
      socket.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * 向服务端发送消息 
   * 
   * @author:tuzongxun 
   * @Title: sendMessage 
   * @param @param text 
   * @return void 
   * @date May 18, 2016 9:57:56 AM 
   * @throws 
   */ 
  private void sendMessage(String text) { 
    try { 
      dataOutputStream.writeUTF(text); 
      dataOutputStream.flush(); 
    } catch (IOException e1) { 
      e1.printStackTrace(); 
    } 
  } 
  /** 
   * 图形窗口输入区域监听回车事件 
   * 
   * @author tuzongxun123 
   * 
   */ 
  private class TFLister implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
      String text = tfTxt.getText().trim(); 
      tarea.setText(text); 
      tfTxt.setText(""); 
      // 回车后发送数据到服务器 
      sendMessage(text); 
    } 
  } 
} 

服务端:


package chat.chat; 
import java.io.DataInputStream; 
import java.io.EOFException; 
import java.io.IOException; 
import java.net.BindException; 
import java.net.ServerSocket; 
import java.net.Socket; 
/** 
 * java使用socket和awt组件简单实现在线聊天功能服务端 可以实现一个客户端连接后不断向服务端发送消息 
 * 但不支持多个客户端同时连接,原因在于代码中获得客户端连接后会一直循环监听客户端输入,造成阻塞 
 * 以至于服务端无法二次监听另外的客户端,如要实现,需要使用异步或者多线程 
 * 
 * @author tuzongxun123 
 * 
 */ 
public class ChatServer { 
  public static void main(String[] args) { 
    // 是否成功启动服务端 
    boolean isStart = false; 
    // 服务端socket 
    ServerSocket ss = null; 
    // 客户端socket 
    Socket socket = null; 
    // 服务端读取客户端数据输入流 
    DataInputStream dataInputStream = null; 
    try { 
      // 启动服务器 
      ss = new ServerSocket(8888); 
    } catch (BindException e) { 
      System.out.println("端口已在使用中"); 
      // 关闭程序 
      System.exit(0); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    try { 
      isStart = true; 
      while (isStart) { 
        boolean isConnect = false; 
        // 启动监听 
        socket = ss.accept(); 
        System.out.println("one client connect"); 
        isConnect = true; 
        while (isConnect) { 
          // 获取客户端输入流 
          dataInputStream = new DataInputStream( 
              socket.getInputStream()); 
          // 读取客户端传递的数据 
          String message = dataInputStream.readUTF(); 
          System.out.println("客户端说:" + message); 
        } 
      } 
    } catch (EOFException e) { 
      System.out.println("client closed!"); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } finally { 
      // 关闭相关资源 
      try { 
        dataInputStream.close(); 
        socket.close(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

以上所述是小编给大家介绍的Java Socket实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对phperz网站的支持!



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务