Java编程实现基于TCP协议的Socket聊天室示例
本文实例讲述了Java编程实现基于TCP协议的Socket聊天室。分享给大家供大家参考,具体如下:
这里使用Socket套接字进行编程,完成的是基于TCP可靠服务实现服务器与客户端的双通信。
Server服务器端:
packagecom.han; importjava.awt.Container; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.awt.event.WindowAdapter; importjava.awt.event.WindowEvent; importjava.io.*; importjava.net.*; importjavax.swing.JDialog; importjavax.swing.JScrollPane; importjavax.swing.JTextArea; importjavax.swing.JTextField; /** *本程序实现了一个TCP程序的服务器编程部分。 *使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与客户端的双通信。 *客户端的编程见本包中的类Client *@authorHAN * */ @SuppressWarnings("serial") publicclassServerextendsJDialog{ privateBufferedReaderreader; privatePrintWriterwriter; privateServerSocketserver; privateSocketsocket; privateJTextAreata=newJTextArea(); privateJScrollPanesp=newJScrollPane(ta); privateJTextFieldtf=newJTextField(); Containercc; publicServer(Stringtitle){ setTitle(title); addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEventwe){ 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(newActionListener(){ publicvoidactionPerformed(ActionEvente){ try{ writer=newPrintWriter(socket.getOutputStream(),true); }catch(IOExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } writer.println(tf.getText()); ta.append("User1:"+tf.getText()+'\n'); tf.setText(""); } }); } voidgetserver(){ try{ server=newServerSocket(8998); ta.append("服务器套接字已经创建成功\n"); while(true){ ta.append("等待客户机的连接\n"); socket=server.accept(); ta.append("客户机已连接\n"); reader=newBufferedReader(newInputStreamReader(socket.getInputStream())); getClientMessage(); } }catch(Exceptione){ e.printStackTrace(); } } privatevoidgetClientMessage(){ try{ while(true){ Stringnews=reader.readLine(); if(news!=null){ ta.append("User2:"+news+"\n"); }else{ ta.append("User2(客户端)已断开链接\n"); break; } } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } try{ if(reader!=null){ reader.close(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } if(socket!=null){ try{ socket.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ Serveruser1=newServer("User1"); user1.setBounds(0,0,300,400); user1.setResizable(false); user1.setVisible(true); user1.getserver(); } }
Client客户端:
packagecom.han; importjava.awt.*; importjava.awt.event.*; importjava.io.*; importjava.net.*; importjavax.swing.*; /** *本程序实现了一个TCP程序的客户端编程部分。 *使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与服务器的双通信。 *服务器的编程见本包中的类Server *可以在不同的平台与不同的机器上运行,只是要把代码中写的IP地址修改为运行服务器程序Server的机器的IP地址。 *@authorHAN * */ @SuppressWarnings("serial") publicclassClientextendsJDialog{ privateBufferedReaderreader; privatePrintWriterwriter; privateSocketsocket; privateJTextAreata=newJTextArea(); privateJScrollPanesp=newJScrollPane(ta); privateJTextFieldtf=newJTextField(); Containercc; publicClient(Stringtitle){ setTitle(title); addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEventwe){ 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(newActionListener(){ publicvoidactionPerformed(ActionEvente){ writer.println(tf.getText()); ta.append("User2:"+tf.getText()+'\n'); tf.setText(""); } }); } privatevoidconnect(){ ta.append("尝试连接\n"); try{ socket=newSocket("192.168.1.3",8998); }catch(UnknownHostExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } try{ writer=newPrintWriter(socket.getOutputStream(),true); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } ta.append("完成连接\n"); } privatevoidgetClientMessage(){ try{ reader=newBufferedReader(newInputStreamReader(socket.getInputStream())); while(true){ Stringnews=reader.readLine(); if(news!=null){ ta.append("User1:"+news+"\n"); }else{ ta.append("User1(服务器)已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n"); break; } } }catch(IOExceptione){ //TODOAuto-generatedcatchblock ta.append("User1(服务器)已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n"); e.printStackTrace(); } try{ if(reader!=null){ reader.close(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } if(socket!=null){ try{ socket.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ Clientuser2=newClient("User2"); user2.setBounds(0,0,300,400); user2.setVisible(true); user2.setResizable(false); user2.connect(); user2.getClientMessage(); } }
更多关于java相关内容感兴趣的读者可查看本站专题:《JavaSocket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。