栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java编程实现基于TCP协议的Socket聊天室示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java编程实现基于TCP协议的Socket聊天室示例

本文实例讲述了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;

@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.*;

@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程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/141872.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号