这篇文章给大家介绍怎么在Java中利用TCP协议实现一个Socket聊天室,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
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中利用TCP协议实现一个Socket聊天室就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。