java实现实时通信聊天程序

利用TCP传输数据,编写客户端和服务器的程序,实现两个程序间的实时通信。

在每个程序中实现了实时的发送与接收数据的功能。

客户端的io界面

服务器端的io界面

io演示

程序以两端分别输入close字符串作为结束标识。在一端输入close时,终止发送、一端接收到close时,终止接收。所演示的客户端来自个人电脑IDEA调试运行。服务器端来自阿里云服务器centos系统下的jdk环境。该程序需要用到java的 I/O 流、多线程、网络编程的相关知识。

一、客户端

由于发送和接收数据是并行的,为了使得时刻都能同时进行接受与发送的功能,使用多线程,将接收和发送分别封装为两个Runnable实现类。获取io信息。

ClientDemo类的源码:

public class ClientDemo {
    public static Socket s;
    public static void main(String[] args) throws IOException, InterruptedException {
        s = new Socket("localhost", 10000);        //此处的参数一填写服务器端ip地址
        System.out.println("连接成功");
        Thread send = new Thread(new COUT());
        Thread receive = new Thread(new CIN());
        send.start();
        receive.start();
        send.join();        //发送和接收执行完毕时,关闭套接字
        receive.join();        //因此待这两个线程结束时才回到主线程执行。
        s.close();
    }
}

创建全局变量套接字s,在主进程中给s进行初始化,然后启动发送和接收功能的两个线程。

Socket构造时传递的两个参数,其一填写服务器地址。或者填写localhost即127.0.0.1回送地址,本机即可运行服务器端和客户端进行本地数据传输。

其二是端口数,需要保持客户端和服务器端的套接字绑定的端口数一致。尽可能选用数量大的端口以免被占用,如果运行时报错端口已占用可以尝试更改端口数,范围在65536内。

客户端发送和接收类的源码:

class CIN implements Runnable{
    @Override
    public void run() {        //接收模块
        try {
            InputStream is = ClientDemo.s.getInputStream();//通过全局套接字s获取连接后的流
            in(is);
        }
        catch (IOException o) {
            o.printStackTrace();
        }
    }
    public static void in(InputStream is) throws IOException{
        while(true){
            byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            String line = new String(bytes,0,len);
 
            System.out.println("对方:   "+line);
            if(line.equals("close"))
                break;
        }
    }
}
 
class COUT implements Runnable{
    @Override
    public void run() {        //发送模块
        try {
            OutputStream os = ClientDemo.s.getOutputStream();//套接字获取流
            out(os);
        }
        catch (IOException o){
            o.printStackTrace();
        }
    }
    public static void out(OutputStream os) throws IOException{
        Scanner sc = new Scanner(System.in);
        while(true) {
            String line = sc.nextLine();
            os.write(line.getBytes());
            if(line.equals("close"))
                break;
        }
        sc.close();
    }
}

由于IO流都由socket创建,因此程序结束时需要关闭s即可。

二、服务器

ServerDemo类的源码:

public class ServerDemo {
    public static ServerSocket ss;
    public static Socket s;
 
    public static void main(String[] args) throws IOException, InterruptedException {
        ss = new ServerSocket(10000);        //监听端口10000,对应客户端套接字绑定的端口
        s = ss.accept();        //提取监听套接字中的一个连接
        System.out.println("连接成功");
        Thread send = new Thread(new SOUT());
        Thread receive = new Thread(new SIN());
        send.start();
        receive.start();
        send.join();
        receive.join();
        ss.close();
    }
}

创建服务器套接字对象并监听,并接收连接请求。

此处的代码与客户端大同小异,完成连接后的代码基本一致。

服务器端发送和接收类的源码:

class SIN implements Runnable{
    @Override
    public void run() {
        try {
            InputStream is = ServerDemo.s.getInputStream();
            in(is);
        }
        catch (IOException o) {
            o.printStackTrace();
        }
    }
    public static void in(InputStream is) throws IOException{
        while(true){
            byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            String line = new String(bytes,0,len);
            System.out.println("对方:   "+line);
            if(line.equals("close"))
                break;
        }
    }
}
class SOUT implements Runnable{
    @Override
    public void run() {
        try {
            OutputStream os = ServerDemo.s.getOutputStream();
            out(os);
        }
        catch (IOException o){
            o.printStackTrace();
        }
    }
    public static void out(OutputStream os) throws IOException{
        Scanner sc = new Scanner(System.in);
        while(true) {
            String line = sc.nextLine();
            os.write(line.getBytes());
            if(line.equals("close"))
                break;
        }
        sc.close();
    }
}

两者代码不同的地方在于由于套接字不同,返回的流实例不同。基本逻辑相同。

本地可同时运行客户端和服务器端,客户端套接字绑定本地ip地址,“localhost或127.0.0.1。

先开启服务器端进行监听,然后打开客户端向服务器端发起连接请求。连接成功后即可实时进行聊天。在程序中以一行为信息单元,键入若干字符后换行发送。另一端即可收到信息。

在一端键入“close”发送即可关闭当前程序的发送线程和接收程序的接收线程。待两个程序的所有发送和接收都结束时,关闭程序。

实测记录:将服务器端程序发送至云服务器通过jdk运行,并开启程序监听,将客户端的套接字指向服务器端的地址和监听端口。之后建立连接,可自由在两端传输信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java基于socket实现简易聊天室实例

    本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @throws IOException */ public static void main(S

  • java socket实现聊天室 java实现多人聊天功能

    用java socket做一个聊天室,实现多人聊天的功能.看了极客学院的视频后跟着敲的.(1DAY) 服务端: 1. 先写服务端的类MyServerSocket,里面放一个监听线程,一启动就好 2. 实现服务端监听类ServerListener.java,用accept来监听,一旦有客户端连上,生成新的socket,就新建个线程实例ChatSocket.启动线程后就把线程交给ChatManager管理 3. 在ChatSocket中实现从客户端读取内容,把读取到的内容发给集合内所有的客户端 4.

  • 基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到我们平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • 网页版在线聊天java Socket实现

    本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下 实现步骤: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过a

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • 基于java编写局域网多人聊天室

    由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于C/S结构,即客户端服务器模式. 服务器: 默认ip为本机ip 需要双方确定一个端口号 可设置最大连接人数 可启动与关闭 界面显示在线用户人以及姓名(本机不在此显示) 客户端: 需要手动设置服务器ip地址(局域网) 手动设置端口号 输入姓名 可连

  • java中UDP简单聊天程序实例代码

    学过计算机网络通信的都知道,计算机之间传送数据由两种,即TCP通信和UDP通信.TCP是可靠的面向连接的通信协议,二UDP是不可靠的面向无连接的通信协议. java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠! 基于UDP通信的基本模式: (1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地. (2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容. 客户机 复制代码 代码如下: package com

  • java实现自动回复聊天机器人

    本文实例为大家分享了java实现自动回复聊天机器人的具体代码,供大家参考,具体内容如下 聊天机器人 调用网上现有的接口,然后解析数据 以上是演示图片 源码下载地址 基本工作流程就是,调用API,解析返回的数据 HttpUtil类,调用API,获取返回的数据 package com; import com.sun.org.apache.bcel.internal.generic.INSTANCEOF; import java.io.BufferedReader; import java.io.In

  • java聊天室的实现代码

    本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下 聊天室界面: 源码: public class ClientFrame extends Frame { private TextField textFieldContent = new TextField(); private TextArea textAreaContent = new TextArea(); private Socket socket = null; private OutputStream out

随机推荐