欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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