您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Java基于TCP如何实现简单聊天程序

2024/5/5 10:57:26发布30次查看
一、如何实现tcp通信要实现tcp通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,然后在编写客户端程序。
在本机运行服务器端程序,在远程机运行客户端程序
本机的ip地址:192.168.129.222
远程机的ip地址:192.168.214.213
二、编写c/s架构聊天程序1.编写服务器端程序 - server.java在net.hw.network包里创建server类
package net.hw.network;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.datainputstream;import java.io.dataoutputstream;import java.io.ioexception;import java.net.serversocket;import java.net.socket;/** * 功能:服务器端 * 作者:华卫 * 日期:2022年03月18日 */public class server extends jframe { static final int port = 8136; static final string host_ip = "192.168.129.222"; private jpanel panel1, panel2; private jtextarea txtcontent, txtinput, txtinputip; private jscrollpane pancontent, paninput; private jbutton btnclose, btnsend; private serversocket serversocket; private socket socket; private datainputstream netin; private dataoutputstream netout; public static void main(string[] args) { new server(); } public server() { super("服务器"); //创建组件 panel1 = new jpanel(); panel2 = new jpanel(); txtcontent = new jtextarea(15, 60); txtinput = new jtextarea(3, 60); pancontent = new jscrollpane(txtcontent, scrollpaneconstants.vertical_scrollbar_as_needed, scrollpaneconstants.horizontal_scrollbar_never); paninput = new jscrollpane(txtinput, scrollpaneconstants.vertical_scrollbar_as_needed, scrollpaneconstants.horizontal_scrollbar_never); btnclose = new jbutton("关闭"); btnsend = new jbutton("发送"); //添加组件 getcontentpane().add(pancontent, "center"); getcontentpane().add(panel1, "south"); panel1.setlayout(new gridlayout(0, 1)); panel1.add(paninput); panel1.add(panel2); panel2.add(btnsend); panel2.add(btnclose); //设置组件属性 txtcontent.seteditable(false); txtcontent.setfont(new font("宋体", font.plain, 13)); txtinput.setfont(new font("宋体", font.plain, 15)); txtcontent.setlinewrap(true); txtinput.setlinewrap(true); txtinput.requestfocus(); setsize(450, 350); setlocation(50, 200); setresizable(false); setvisible(true); //等候客户请求 try { txtcontent.append("服务器已启动...\n"); serversocket = new serversocket(port); txtcontent.append("等待客户请求...\n"); socket = serversocket.accept(); txtcontent.append("连接一个客户。\n" + socket + "\n"); netin = new datainputstream(socket.getinputstream()); netout = new dataoutputstream(socket.getoutputstream()); } catch (ioexception e1) { e1.printstacktrace(); } / //注册监听器,编写事件代码 txtcontent.addmousemotionlistener(new mousemotionadapter() { public void mousemoved(mouseevent e) { displayclientmsg(); } }); txtinput.addmousemotionlistener(new mousemotionadapter() { public void mousemoved(mouseevent e) { displayclientmsg(); } }); panel2.addmousemotionlistener(new mousemotionadapter() { public void mousemoved(mouseevent e) { displayclientmsg(); } }); txtinput.addkeylistener(new keyadapter() { public void keytyped(keyevent e) { displayclientmsg(); } }); txtinput.addfocuslistener(new focusadapter() { public void focusgained(focusevent e) { displayclientmsg(); } }); btnsend.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { try { string servermsg = txtinput.gettext(); if (!servermsg.trim().equals("")) { txtcontent.append("服务器>" + servermsg + "\n"); netout.writeutf(servermsg); } else { joptionpane.showmessagedialog(null, "不能发送空信息!", "服务器", joptionpane.warning_message); } txtinput.settext(""); txtinput.requestfocus(); } catch (ioexception ie) { ie.printstacktrace(); } } }); btnclose.addactionlistener(new actionlistener() { public void actionperformed(actionevent arg0) { try { netin.close(); netout.close(); socket.close(); serversocket.close(); } catch (ioexception e) { e.printstacktrace(); } system.exit(0); } }); addwindowlistener(new windowadapter() { public void windowclosing(windowevent e) { try { netin.close(); netout.close(); socket.close(); serversocket.close(); } catch (ioexception ie) { ie.printstacktrace(); } system.exit(0); } public void windowactivated(windowevent e) { txtinput.requestfocus(); } }); } //显示客户端信息 void displayclientmsg() { try { if (netin.available() > 0) { string clientmsg = netin.readutf(); txtcontent.append("客户端>" + clientmsg + "\n"); } } catch (ioexception e1) { e1.printstacktrace(); } }}
2.编写客户端程序 - client.java在net.hw.network包里创建client类
package net.hw.network;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.datainputstream;import java.io.dataoutputstream;import java.io.ioexception;import java.net.inetaddress;import java.net.socket;/** * 功能:客户端 * 作者:华卫 * 日期:2022年03月18日 */public class client extends jframe { private jpanel panel1, panel2; private jtextarea txtcontent, txtinput; private jscrollpane pancontent, paninput; private jbutton btnclose, btnsend; private socket socket; private datainputstream netin; private dataoutputstream netout; public static void main(string[] args) { new client(); } public client() { super("客户端"); //创建组件 panel1 = new jpanel(); panel2 = new jpanel(); txtcontent = new jtextarea(15, 60); txtinput = new jtextarea(3, 60); pancontent = new jscrollpane(txtcontent, scrollpaneconstants.vertical_scrollbar_as_needed, scrollpaneconstants.horizontal_scrollbar_never); paninput = new jscrollpane(txtinput, scrollpaneconstants.vertical_scrollbar_as_needed, scrollpaneconstants.horizontal_scrollbar_never); btnclose = new jbutton("关闭"); btnsend = new jbutton("发送"); //添加组件 getcontentpane().add(pancontent, "center"); getcontentpane().add(panel1, "south"); panel1.setlayout(new gridlayout(0, 1)); panel1.add(paninput); panel1.add(panel2); panel2.add(btnsend); panel2.add(btnclose); //设置组件属性 txtcontent.seteditable(false); txtcontent.setfont(new font("宋体", font.plain, 13)); txtinput.setfont(new font("宋体", font.plain, 15)); txtcontent.setlinewrap(true); txtinput.setlinewrap(true); txtinput.requestfocus(); setsize(450, 350); setlocation(550, 200); setresizable(false); setvisible(true); //连接服务器 try { txtcontent.append("连接服务器...\n"); socket = new socket(server.host_ip, server.port); txtcontent.append("连接服务器成功。\n" + socket + "\n"); netin = new datainputstream(socket.getinputstream()); netout = new dataoutputstream(socket.getoutputstream()); } catch (ioexception e1) { joptionpane.showmessagedialog(null, "服务器连接失败!\n请先启动服务器程序!", "客户端", joptionpane.error_message); system.exit(1); } / //注册监听器,编写事件代码 txtcontent.addmousemotionlistener(new mousemotionadapter() { public void mousemoved(mouseevent e) { displayservermsg(); } }); txtinput.addmousemotionlistener(new mousemotionadapter() { public void mousemoved(mouseevent e) { displayservermsg(); } }); panel2.addmousemotionlistener(new mousemotionadapter() { public void mousemoved(mouseevent e) { displayservermsg(); } }); txtinput.addkeylistener(new keyadapter() { public void keytyped(keyevent e) { displayservermsg(); } }); txtinput.addfocuslistener(new focusadapter() { public void focusgained(focusevent e) { displayservermsg(); } }); btnsend.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { try { string clientmsg = txtinput.gettext(); if (!clientmsg.trim().equals("")) { netout.writeutf(clientmsg); txtcontent.append("客户端>" + clientmsg + "\n"); } else { joptionpane.showmessagedialog(null, "不能发送空信息!", "客户端", joptionpane.warning_message); } txtinput.settext(""); txtinput.requestfocus(); } catch (ioexception ie) { ie.printstacktrace(); } } }); btnclose.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { try { netin.close(); netout.close(); socket.close(); } catch (ioexception ie) { ie.printstacktrace(); } system.exit(0); } }); addwindowlistener(new windowadapter() { public void windowclosing(windowevent e) { try { netin.close(); netout.close(); socket.close(); } catch (ioexception ie) { ie.printstacktrace(); } system.exit(0); } public void windowactivated(windowevent e) { txtinput.requestfocus(); } }); } //显示服务端信息 void displayservermsg() { try { if (netin.available() > 0) { string servermsg = netin.readutf(); txtcontent.append("服务器>" + servermsg + "\n"); } } catch (ioexception e1) { e1.printstacktrace(); } }}
3.测试服务器端与客户端能否通信在本机[192.168.129.222]上启动服务器端
在远程机[192.168.214.213]上启动客户端
显示连接服务器[192.168.129.222]成功,切换到服务器端查看,显示连接了一个客户[192.168.214.213]
此时,服务器端和客户端就可以相互通信了
4.程序优化思路 - 服务器端采用多线程其实,很多服务器端程序都是允许被多个应用程序访问的,例如门户网站可以被多个用户同时访问,因此服务器端都是多线程的。
以上就是java基于tcp如何实现简单聊天程序的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product