Java实现多线程局域网聊天室

news/2024/11/17 3:49:07/

Java多线程局域网聊天室

    • 局域网聊天室
      • 1.TCP
      • 2.套接字
      • 3.C/S架构
      • 4.多线程
      • 5.服务器
      • 客户端

局域网聊天室

在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c++而轻视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();}}@Overridepublic 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();}}}
}

搞定,虽然特别简陋,但是也能实现局域网类的通信。如果需要复制代码的,记得改一下服务器的IP地址,IP地址可以在cmd下用ipconfig命令查看。打算期末考试完了以后再加上GUI并把这个功能加到具有alpha剪枝算法的AI六子棋对战中去。


http://www.ppmy.cn/news/933709.html

相关文章

局域网内互发消息

主机相互发送消息 背景 本学期的计算机网络课非常有意思,它与我们的生活息息相关,曾经我也为电脑发生的网络问题而困惑,总是没有根据的瞎尝试来试图解决问题。但是在老师的一些简单指导之后,有了一个基本的ip之间通信以及局域网…

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

基于java编写局域网多人聊天室 由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文…

Java实战_局域网多人聊天室

由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于…

JAVA实现聊天室(局域网)

JAVA用局域网实现聊天室 类和接口 Server类(服务器端) package Test;import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket;public class Server {private static final int SERVER_PORT30…

基础聊天室的实现,实现同局域网的聊天,有详细代码

** 聊天室的实现,基本步骤解析 ** 总体思想结构 1.建立服务器端,服务器端不需要界面 建立一个包为服务器包 serve 包内应该有服务器的主方法用来启动服务器,和一个用来接收客户端消息并且转发给所有的客户端的线程类 服务器给所有客户端发消…

web网络聊天室

花了四天时间做了一个简单的web聊天室 前端页面效果大概是下面这个样子 1.登陆界面 2.注册界面 这里首先会检查用户名是否重复, 如果重复,会提示你用户名已存在 反正显示可用 3.聊天室界面 登陆成功会在左边显示登陆人的名称以及当前在线人数。 然后…

局域网通信 | 基于广播实现简易聊天室

前言 事情是这个样子的,实验室的那个横向项目有一个需求:同一个 WIFI 下的设备之间可以实现实时的语音聊天。 于是这两天抽空闲时间捣鼓了一下局域网通信。现在基本实现语音通信了,是基于 UDP 广播实现的,但是不知道是 UDP 丢包…

局域网聊天工具

按企业部门进行划分用户组; 可实现单人、多人之间的文本对话; 方便高效的自动应答系统; 可在任何形式局域网及企业专线网中使用; 谈话窗口中可插入各种心情图标; 强大完备的企业电脑信息查询功能&#xff1b…