当前位置: 首页 > 编程笔记 >

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

焦同
2023-03-14
本文向大家介绍Java基于socket实现的客户端和服务端通信功能完整实例,包括了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();
    }
    /*
     * try { bConnected = false; tRecv.join(); } catch(InterruptedException
     * e) { e.printStackTrace(); } finally { 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<Client> clients = new ArrayList<Client>();
  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 !");
          }
          /*
           * for(Iterator<Client> it = clients.iterator();
           * it.hasNext(); ) { Client c = it.next(); c.send(str); }
           */
          /*
           * Iterator<Client> it = clients.iterator();
           * while(it.hasNext()) { Client c = it.next(); c.send(str);
           * }
           */
        }
      } 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程序设计有所帮助。

 类似资料:
  • 本文向大家介绍PHP基于socket实现客户端和服务端通讯功能,包括了PHP基于socket实现客户端和服务端通讯功能的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍了PHP基于socket实现的简单客户端和服务端通讯功能,可实现服务端接收客户端发送的字符串进行翻转操作后返回客户端的功能,需要的朋友可以参考下 服务端: 客户端: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多

  • 本文向大家介绍Go语言基于Socket编写服务器端与客户端通信的实例,包括了Go语言基于Socket编写服务器端与客户端通信的实例的使用技巧和注意事项,需要的朋友参考一下 在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可

  • 本文向大家介绍Java--Socket通信(客户端服务端双向),包括了Java--Socket通信(客户端服务端双向)的使用技巧和注意事项,需要的朋友参考一下 新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端 两个工程的读写操作线程类基本上完全相同 服务端: 客户端:  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍python服务器与android客户端socket通信实例,包括了python服务器与android客户端socket通信实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python服务器与android客户端socket通信的方法。分享给大家供大家参考。具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: 下面是Android代码: 安卓代

  • 问题内容: 我尝试使用以下代码从服务器到客户端发送文件和目录列表。服务器正在从客户端接收消息,但我不知道服务器是否没有发送回结果或客户端是否不接受结果。 服务器端: 问题答案: 据我所见,您在客户端上做的同时在服务器上做。从服务器发送的字符串中没有行尾字符,因此客户端将永远无法完成。执行outqw.println()或添加到要发送的内容的末尾。话虽这么说,很难用一堆注释掉的东西来浏览未格式化的代码

  • 本文向大家介绍基于Java语言实现Socket通信的实例,包括了基于Java语言实现Socket通信的实例的使用技巧和注意事项,需要的朋友参考一下 基于Java语言实现Socket通信 由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重新对Java的网络编程进行了复习,根据项目的实际情况做了简化的编程,实现了简单的通信过程。 1. Socket