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

Java基于socket实现的客户端和服务端通信功能完整实例

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

Java基于socket实现的客户端和服务端通信功能完整实例

本文实例讲述了Java基于socket实现的客户端和服务端通信功能。分享给大家供大家参考,具体如下:

以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行ChatClient.java

客户端实例

ChatClient.java

package socketDemo;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatClient extends frame {
  Socket s = null;
  DataOutputStream dos = null;
  DataInputStream dis = null;
  private boolean bConnected = false;
  TextField tfTxt = new TextField();
  textarea taContent = new textarea();
  Thread tRecv = new Thread(new RecvThread());
  public static void main(String[] args) {
    new ChatClient().launchframe();
  }
  public void launchframe() {
    setLocation(400, 300);
    this.setSize(300, 300);
    add(tfTxt, BorderLayout.SOUTH);
    add(taContent, BorderLayout.NORTH);
    pack();
    this.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent arg0) {
 disconnect();
 System.exit(0);
      }
    });
    tfTxt.addActionListener(new TFListener());
    setVisible(true);
    connect();
    tRecv.start();
  }
  public void connect() {
    try {
      s = new Socket("localhost", 8888);
      dos = new DataOutputStream(s.getOutputStream());
      dis = new DataInputStream(s.getInputStream());
      System.out.println("connected!");
      bConnected = true;
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public void disconnect() {
    try {
      dos.close();
      dis.close();
      s.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    
  }
  private class TFListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String str = tfTxt.getText().trim();
      // taContent.setText(str);
      tfTxt.setText("");
      try {
 // System.out.println(s);
 dos.writeUTF(str);
 dos.flush();
 // dos.close();
      } catch (IOException e1) {
 e1.printStackTrace();
      }
    }
  }
  private class RecvThread implements Runnable {
    public void run() {
      try {
 while (bConnected) {
   String str = dis.readUTF();
   // System.out.println(str);
   taContent.setText(taContent.getText() + str + 'n');
 }
      } catch (SocketException e) {
 System.out.println("退出了,bye!");
      } catch (EOFException e) {
 System.out.println("推出了,bye - bye!");
      } catch (IOException e) {
 e.printStackTrace();
      }
    }
  }
}

socket服务端代码

ChatServer.java

package socketDemo;
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
  boolean started = false;
  ServerSocket ss = null;
  List clients = new ArrayList();
  public static void main(String[] args) {
    new ChatServer().start();
  }
  public void start() {
    try {
      ss = new ServerSocket(8888);
      started = true;
    } catch (BindException e) {
      System.out.println("端口使用中....");
      System.out.println("请关掉相关程序并重新运行服务器!");
      System.exit(0);
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      while (started) {
 Socket s = ss.accept();
 Client c = new Client(s);
 System.out.println("a client connected!");
 new Thread(c).start();
 clients.add(c);
 // dis.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
 ss.close();
      } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
      }
    }
  }
  class Client implements Runnable {
    private Socket s;
    private DataInputStream dis = null;
    private DataOutputStream dos = null;
    private boolean bConnected = false;
    public Client(Socket s) {
      this.s = s;
      try {
 dis = new DataInputStream(s.getInputStream());
 dos = new DataOutputStream(s.getOutputStream());
 bConnected = true;
      } catch (IOException e) {
 e.printStackTrace();
      }
    }
    public void send(String str) {
      try {
 dos.writeUTF(str);
      } catch (IOException e) {
 clients.remove(this);
 System.out.println("对方退出了!我从List里面去掉了!");
 // e.printStackTrace();
      }
    }
    public void run() {
      try {
 while (bConnected) {
   String str = dis.readUTF();
   System.out.println(str);
   for (int i = 0; i < clients.size(); i++) {
     Client c = clients.get(i);
     c.send(str);
     // System.out.println(" a string send !");
   }
   
   
 }
      } catch (EOFException e) {
 System.out.println("Client closed!");
      } catch (IOException e) {
 e.printStackTrace();
      } finally {
 try {
   if (dis != null)
     dis.close();
   if (dos != null)
     dos.close();
   if (s != null) {
     s.close();
     // s = null;
   }
 } catch (IOException e1) {
   e1.printStackTrace();
 }
      }
    }
  }
}

本机测试运行结果:

关闭客户端窗口后,提示信息如下:

更多关于java相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

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

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

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