Java编程实现基于TCP协议的Socket聊天室示例
程序员文章站
2023-11-16 21:41:10
本文实例讲述了java编程实现基于tcp协议的socket聊天室。分享给大家供大家参考,具体如下:
这里使用socket套接字进行编程,完成的是基于tcp可靠服务实现服务...
本文实例讲述了java编程实现基于tcp协议的socket聊天室。分享给大家供大家参考,具体如下:
这里使用socket套接字进行编程,完成的是基于tcp可靠服务实现服务器与客户端的双通信。
server服务器端:
package com.han; import java.awt.container; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.windowadapter; import java.awt.event.windowevent; import java.io.*; import java.net.*; import javax.swing.jdialog; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; /** * 本程序实现了一个tcp程序的服务器编程部分。 * 使用socket套接字进行编程,完成的是基于tcp可靠服务实现与客户端的双通信。 * 客户端的编程见本包中的类client * @author han * */ @suppresswarnings("serial") public class server extends jdialog{ private bufferedreader reader; private printwriter writer; private serversocket server; private socket socket; private jtextarea ta=new jtextarea(); private jscrollpane sp=new jscrollpane(ta); private jtextfield tf=new jtextfield(); container cc; public server(string title) { settitle(title); addwindowlistener(new windowadapter() { public void windowclosing (windowevent we) { dispose(); //撤销dialog一切相关资源 system.exit(0); //正常退出程序 } }); cc=getcontentpane(); setlayout(null); ta.setlinewrap(true); ta.seteditable(false); sp.setbounds(0,0,300,342); tf.setbounds(0,342,300,25); cc.add(sp); cc.add(tf); tf.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e){ try { writer=new printwriter(socket.getoutputstream(),true); } catch (ioexception e1) { // todo auto-generated catch block e1.printstacktrace(); } writer.println(tf.gettext()); ta.append("user1:"+tf.gettext()+'\n'); tf.settext(""); } }); } void getserver(){ try{ server=new serversocket(8998); ta.append("服务器套接字已经创建成功\n"); while(true){ ta.append("等待客户机的连接\n"); socket=server.accept(); ta.append("客户机已连接\n"); reader=new bufferedreader(new inputstreamreader(socket.getinputstream())); getclientmessage(); } }catch(exception e){ e.printstacktrace(); } } private void getclientmessage(){ try { while(true){ string news=reader.readline(); if(news!=null){ ta.append("user2:"+news+"\n"); }else{ ta.append("user2(客户端) 已断开链接\n"); break; } } } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } try{ if(reader!=null){ reader.close(); } } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } if(socket!=null){ try { socket.close(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } } public static void main(string[] args) { server user1=new server("user1"); user1.setbounds(0,0,300,400); user1.setresizable(false); user1.setvisible(true); user1.getserver(); } }
client客户端:
package com.han; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; /** * 本程序实现了一个tcp程序的客户端编程部分。 * 使用socket套接字进行编程,完成的是基于tcp可靠服务实现与服务器的双通信。 * 服务器的编程见本包中的类server * 可以在不同的平台与不同的机器上运行,只是要把代码中写的ip地址修改为运行服务器程序server的机器的ip地址。 * @author han * */ @suppresswarnings("serial") public class client extends jdialog{ private bufferedreader reader; private printwriter writer; private socket socket; private jtextarea ta=new jtextarea(); private jscrollpane sp=new jscrollpane(ta); private jtextfield tf=new jtextfield(); container cc; public client(string title) { settitle(title); addwindowlistener(new windowadapter() { public void windowclosing (windowevent we) { dispose(); //撤销dialog一切相关资源 system.exit(0); //正常退出程序 } }); cc=getcontentpane(); setlayout(null); ta.setlinewrap(true); ta.seteditable(false); sp.setbounds(0,0,300,342); tf.setbounds(0,342,300,25); cc.add(sp); cc.add(tf); tf.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e){ writer.println(tf.gettext()); ta.append("user2:"+tf.gettext()+'\n'); tf.settext(""); } }); } private void connect(){ ta.append("尝试连接\n"); try { socket=new socket("192.168.1.3",8998); } catch (unknownhostexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } try { writer=new printwriter(socket.getoutputstream(),true); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } ta.append("完成连接\n"); } private void getclientmessage(){ try { reader=new bufferedreader(new inputstreamreader(socket.getinputstream())); while(true){ string news=reader.readline(); if(news!=null){ ta.append("user1:"+news+"\n"); }else{ ta.append("user1(服务器) 已断开链接,等待服务器重连之时,重启user2(客户端)进行通信\n"); break; } } } catch (ioexception e) { // todo auto-generated catch block ta.append("user1(服务器) 已断开链接,等待服务器重连之时,重启user2(客户端)进行通信\n"); e.printstacktrace(); } try{ if(reader!=null){ reader.close(); } } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } if(socket!=null){ try { socket.close(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } } public static void main(string[] args) { client user2=new client("user2"); user2.setbounds(0,0,300,400); user2.setvisible(true); user2.setresizable(false); user2.connect(); user2.getclientmessage(); } }
更多关于java相关内容感兴趣的读者可查看本站专题:《java socket编程技巧总结》、《java文件与目录操作技巧汇总》、《java数据结构与算法教程》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
推荐阅读
-
Java编程实现基于TCP协议的Socket聊天室示例
-
使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
-
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
-
基于Java的Socket类Tcp网络编程实现实时聊天互动程序:QQ聊天界面的搭建
-
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
-
linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
-
JAVA 基于TCP协议编写的Socket聊天室程序
-
socket套接字、基于TCP的编程模型与实际运用(网络聊天室)
-
使用Java实现基于TCP协议的网络通信
-
基于Java的Socket类Tcp网络编程实现实时聊天互动程序(三):回车实现数据到发送(详细代码完结)