基于Java Socket实现一个简易在线聊天功能(一)
程序员文章站
2024-03-11 15:21:37
最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到萬仟网平台,以此做个记录,方便自己和大家使用。
先给大家说下实现...
最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到平台,以此做个记录,方便自己和大家使用。
先给大家说下实现步骤分这样几大步:
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实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助