千家信息网

如何用Java创建多线程局域网聊天室

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇"如何用Java创建多线程局域网聊天室"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这
千家信息网最后更新 2024年11月28日如何用Java创建多线程局域网聊天室

这篇"如何用Java创建多线程局域网聊天室"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"如何用Java创建多线程局域网聊天室"文章吧。

1.TCP

要实现局域网连接,就必须知道信息传输的原理。
在局域网里面传输的信息都是以包的形式,我使用的TCP包传输数据,TCP包里面封装了IP报文。
下面这句话就是通过一个静态IPV4协议的类得到一个服务器的IP地址。

address = InetAddress.getByName("192.168.43.86");

2.套接字

在TCP中得到了服务器的IP地址,但是光凭IP地址无法对具体应用进行锁定,所以引入了套接字这个概念。端口号用来锁定主机的进程。端口号一般取1024~49151,因为0 ~ 1023是熟知端口号,一般用于一些HTTP等等常用的端口,49152 ~ 65535是临时端口号,也不能随机占用,一般是程序运行过程中的临时分配。
套接字=IP+端口号
这句话就是定义一个端口号9998和IP为192.168.43.86的套接字。

int port = 9998;socket = new Socket(address,port);

3.C/S架构

从Java类的角度看,服务器和客户端通过套接字连接抽象了一个连接。服务器通过建立自己的套接字端口并监听有无客户在此端口连接,实现信息的读取功能。客户机通过服务器约定好的端口号,来对服务器进行传输数据。在服务器开启后,运行客户机,将与服务器进行三次握手建立TCP连接,然后在此连接的基础上,实现客户机与服务器的通信。

4.多线程

由于服务器可能同时服务多个对象,若是采用传统的方法进行服务器连接,则会出现多个客户机等待一个客户机与服务器交互的现象。为了解决这个问题,采用多线程的方法。
用SuperSocket类继承socket类并实现Runnable接口,实现多线程运行。

class SuperSocket extends Socket implements Runnable
SuperSocket socket_1 = new SuperSocket(9999);SuperSocket socket_2 = new SuperSocket(9998);SuperSocket socket_3 = new SuperSocket(9997);Thread s1 = new Thread(socket_1);Thread s2 = new Thread(socket_2);Thread s3 = new Thread(socket_3);

5.服务器

服务器的架构第三部分所示,代码实现如下

package TCP;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner;public class TCPserver2 {    public static void main(String[] args) {        Scanner scan = new Scanner(System.in);        //实例化具有多线程功能的服务器专用socket类        //需要传递端口号作为初始化变量        SuperSocket socket_1 = new SuperSocket(9996);        SuperSocket socket_2 = new SuperSocket(9998);        SuperSocket socket_3 = new SuperSocket(9997);        //建立三个子线程        Thread s1 = new Thread(socket_1);        Thread s2 = new Thread(socket_2);        Thread s3 = new Thread(socket_3);        try {            while(true) {                    //开启线程                s1.start();                s2.start();                s3.start();                if(scan.next()=="123"){                //结束线程                    break;                }            }        } finally {            try {            //关闭套接字                socket_1.close();                socket_2.close();                socket_3.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}class SuperSocket extends Socket implements Runnable{    InputStream is;    byte[] buffer;    Socket socket=null;    ServerSocket serverSocket=null;    public SuperSocket(int port){        try {        //初始服务器型套接字            serverSocket = new ServerSocket(port);            buffer = new byte[1024];        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void run() {        try {                //等待端口连接            socket = serverSocket.accept();            //连接完成后创建输入流            is = socket.getInputStream();            //读取客户端传送信息            int len = is.read(buffer);            String str = new String(buffer, 0, len);            System.out.println(str);        } catch (IOException e) {            e.printStackTrace();        }    }}

客户端

客户端的架构第三部分所示,代码实现如下

package TCP;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner;public class TCPclient {    public static void main(String[] args) {        InetAddress address=null;        Socket socket=null;        OutputStream os=null;        String message=null;        Scanner sca=null;        try {            //得到本机IP地址            address = InetAddress.getByName("192.168.43.86");            //规定端口号,建立套接字            int port = 9998;            socket = new Socket(address,port);            //绑定套接字的输出流            os = socket.getOutputStream();            sca = new Scanner(System.in);            while(true) {                message = sca.next();                //写入输出流,在局域网中传输                os.write(message.getBytes());            }        } catch (UnknownHostException e) {            e.printStackTrace();        }catch (IOException e) {            e.printStackTrace();        }finally {            try {            //关闭端口号,关闭io流                os.close();                socket.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

以上就是关于"如何用Java创建多线程局域网聊天室"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

服务 服务器 线程 口号 套接字 客户 局域 局域网 内容 客户机 传输 信息 地址 端口 聊天室 客户端 就是 架构 运行 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 原神天空岛数据库11月22日 云服务器宽计费是什么意思 贵州智慧养老管理平台软件开发 手游pubg服务器存在网络问题 幼儿园网络安全检查简报 称重软件数据库 守望先锋断开服务器 黄山凌众网络技术 沛县海航软件开发创造辉煌 机架式服务器装系统好装吗 天津潮流软件开发参考价格 海南工会党性体检软件开发 比亚迪e平台软件开发 为什么有些网址无法连接服务器 国家出台有关网络安全的 上海高校招聘软件开发教师 网络安全自查反思材料 海南计算机网络技术工作难找吗 网络安全介绍会 视易7800服务器怎么授权 魅族16清理应用数据库 光传输网络技术理论 聚水潭服务器连接不上 自用服务器备案管理制度 金肯职业学院网络安全专业 一般网络安全事件是怎么定性的 数据库安全保护方案 分布式数据库数据分配技术 网络锁所在服务器的ip地址 mysql数据库占空间查询
0