javasocket多人聊天程序(java websocket聊天)

今天给各位分享javasocket多人聊天程序的知识,其中也会对java websocket聊天进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、java socket 如何实现多用户通信?2、用Java实现一个人和几个不同的人私聊,用Socket实现3、java socket 多人单对单聊天 客户端的接受问题4、使用java socket如何建立多个多人的聊天室呢5、想求一个java聊天小程序,使用图形用户界面和socket通讯 功能:可以实现两个人私聊功能和多人聊天功能。

java socket 如何实现多用户通信?

你说的我明白。如果真正使用alohal协议的时候,所有的机器都可以检测网络电平变化的是吧?但是使用Java编写模拟程序的话,我们并不能可能检测电平的变换,只能通过一定的手段来模拟这个过程。如果你将一个包裹群发,这样所有的机器都可以接受这个包,这样就可以做到所有机器模拟检测电平变化的这个要求。我认为这个是最有说服力的模拟方法了。

线程需要使用Thread类型,重写里面的run函数,调用start()启动线程,具体可以搜索一把Thread,例子遍地都是。

UDP协议使用Socket类型,初始化的时候参数里面绑定(或者初始化好以后直接调用bind绑定端口,一般输出不用绑定,监听的时候需要绑定)。调用里面的getOutputStream得到输入流。调用getInputStream得到输入流。

OutputStream:输出流,用于向网络中输出数据。调用其中的write函数进行输出,函数的参数就是输出的byte数组。

InputStream: 输入流,用于接受网络里面的数据。调用其中的read可以得到输入的包。

String:你要输出的字符串,调用里面的getBytes可以得到String的byte数组。

其它的应该用不到什么了吧。

**********************************

1.发送字符串的话用byte[]就可以啊。用Socket类里面的getOutputStream可以获得一个发送数据的OutputStream类对象。这个类对象有一个函数write(byte[] b) 可以向网络写byte[]。一个字符串可以通过String类中的getBytes() 转化成byte[]。这样总该明白了吧

2.说一下我的思路:开一个端口A发送UDP包(广播给端口B),用于模拟发送,用一个线程(线程1)来跑。开端口B接受局域网内的包,用另外一个线程(线程2)来跑。在发送UDP包的时候,将变量mark置1,发送完置0。线程2如果接受到一个不是从本机发送的包,而且此时mark是1(说明本机和另外一个机器同时在发包),发生了冲突,表示线程1这次发送的包失败。

用Java实现一个人和几个不同的人私聊,用Socket实现

package API_Day09;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;

/**

* 控制台聊天程序

* 客户端应用程序

* @author Jacob

*

*/

public class chatClient

{

//客户端用于与服务端连接的Socket

private Socket clientSocket;

/**

* 构造方法,客户端初始化

*/

public chatClient()

{

try

{

/*

* socket(String host, int port)

* 地址: IP地址,用来定位网络上的计算机

* 端口: 用来找到远端计算机上用来连接的服务端应用程序

*/

clientSocket = new Socket(“www.easyaq.com”,12580);

}

catch (Exception e)

{

e.printStackTrace();

}

}

/**

* 客户端昵称验证方法

* @param 为Scanner

*/

private void inputNickName(Scanner scan) throws Exception

{

String nickName = null;

//创建输出流

PrintWriter pw = new PrintWriter(

new OutputStreamWriter(clientSocket.getOutputStream(),

“UTF-8”),true);

//创建输入流

BufferedReader br = new BufferedReader(

new InputStreamReader(

clientSocket.getInputStream(),”UTF-8″));

while(true)

{

System.out.println(“请创建您的昵称:”);

nickName = scan.nextLine();

if (nickName.trim().equals(“”))

{

System.out.println(“昵称不得为空”);

}

else

{

pw.println(nickName);

String pass = br.readLine();

if(pass!=null!pass.equals(“OK”))

{

System.out.println(“昵称已经被占用,请更换!”);

}

else

{

System.out.println(“你好!”+nickName+”可以开始聊天了”);

break;

}

}

}

}

/*

* 客户端启动的方法

*/

public void start()

{

try

{

/*

* 创建Scanner,读取用户输入内容

* 目的是设置客户端的昵称

*/

Scanner scanner = new Scanner(System.in);

inputNickName(scanner);

/*

* 将用于接收服务器端发送过来的信息的线程启动

*/

Runnable run = new GetServerMsgHandler();

Thread t = new Thread(run);

t.start();

/*

* 建立输出流,给服务端发信息

*/

OutputStream os = clientSocket.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os,”UTF-8″);

PrintWriter pw = new PrintWriter(osw,true);

while(true)

{

pw.println(scanner.nextLine());

}

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(clientSocket !=null)

{

try

{

clientSocket.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

/**

* 该线程体用来循环读取服务端发送过来的信息

* 并输出到客户端的控制台

* @param args

*/

class GetServerMsgHandler implements Runnable

{

@Override

public void run()

{

try

{

InputStream is = clientSocket.getInputStream();

InputStreamReader isr = new InputStreamReader(is,”UTF-8″);

BufferedReader br = new BufferedReader(isr);

String msgString = null;

while((msgString = br.readLine())!= null)

{

System.out.println(“服务端提示:”+ msgString);

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

public static void main(String[] args)

{

chatClient client = new chatClient();

client.start();

}

}

package API_Day09;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* 控制台聊天程序

* 服务端应用程序

* @author Jacob

*

*/

public class chatServer

{

/**

* ServerSocket 是运行在服务端的Socket

* 用来监听端口,等待客户端的连接,

* 一旦连接成功就会返回与该客户端通信的Socket

*/

private ServerSocket serverSocket;

/**

* 创建线程池来管理客户端的连接线程

* 避免系统资源过度浪费

*/

private ExecutorService threadPool;

/**

* 该属性用来存放客户端之间私聊的信息

*/

private MapString,PrintWriter allOut;

/**

* 构造方法,服务端初始化

*/

public chatServer()

{

try

{

/*

* 创建ServerSocket,并申请服务端口

* 将来客户端就是通过该端口连接服务端程序的

*/

serverSocket = new ServerSocket(12580);

/*

* 初始化Map集合,存放客户端信息

*/

allOut = new HashMapString, PrintWriter();

/*

* 初始化线程池,设置线程的数量

*/

threadPool = Executors.newFixedThreadPool(10);

/*

* 初始化用来存放客户端输出流的集合,

* 每当一个客户端连接,就会将该客户端的输出流存入该集合;

* 每当一个客户端断开连接,就会将集合中该客户端的输出流删除;

* 每当转发一条信息,就要遍历集合中的所有输出流(元素)

* 因此转发的频率高于客户端登入登出的频率,

* 还是应该使用ArrayList来存储元素,仅限群聊,私聊不行

* allOut = new ArrayListPrintWriter();

*/

}

catch (Exception e)

{

e.printStackTrace();

}

}

/*

* 将客户端的信息以Map形式存入集合中

*/

private void addOut(String key,PrintWriter value)

{

synchronized(this)

{

allOut.put(key, value);

}

}

/*

* 将给定的输出流从共享集合中删除

* 参数为客户端nickName,作为Map的key键

*/

private synchronized void removeOut(String key)

{

allOut.remove(key);

System.out.println(“当前在线人数为:”+ allOut.size());

}

/*

* 将给定的消息转发给所有客户端

*/

private synchronized void sendMsgToAll(String message)

{

for(PrintWriter out: allOut.values())

{

out.println(message);

System.out.println(“当前在线人数为:”+ allOut.size());

}

}

/*

* 将给定的消息转发给私聊的客户端

*/

private synchronized void sendMsgToPrivate(String nickname,String message)

{

PrintWriter pw = allOut.get(nickname); //将对应客户端的聊天信息取出作为私聊内容发送出去

if(pw!=null)

{

pw.println(message);

System.out.println(“当前在线私聊人数为:”+ allOut.size());

}

}

/**

* 服务端启动的方法

*/

public void start()

{

try

{

while(true)

{

/*

* 监听10086端口

*/

System.out.println(“等待客户端连接… … “);

/*

* Socket accept() 这是一个阻塞方法,会一直在10086端口进行监听

* 直到一个客户端连接上,此时该方法会将与这个客户端进行通信的Socket返回

*/

Socket socket = serverSocket.accept();

System.out.println(“客户端连接成功! “);

/*

* 启动一个线程,由线程来处理客户端的请求,这样可以再次监听

* 下一个客户端的连接了

*/

Runnable run = new GetClientMsgHandler(socket);

threadPool.execute(run); //通过线程池来分配线程

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

/**

* 该线程体用来处理给定的某一个客户端的消息,循环接收客户端发送

* 的每一个字符串,并输出到控制台

* @author Jacob

*

*/

class GetClientMsgHandler implements Runnable

{

/*

* 该属性是当前线程处理的具体的客户端的Socket

* @see java.lang.Runnable#run()

*/

private Socket socket;

/*

* 获取客户端的地址信息

* private String hostIP;

*/

/*

* 获取客户端的昵称

*/

private String nickName;

/*

* 创建构造方法

*/

public GetClientMsgHandler(Socket socket)

{

this.socket = socket;

/*

* 获取远端客户的Ip地址信息

* 保存客户端的IP地址字符串

* InetAddress address = socket.getInetAddress();

* hostIP = address.getHostAddress();

*/

}

/*

* 创建内部类来获取昵称

*/

private String getNickName() throws Exception

{

try

{

//服务端的输入流读取客户端发送来的昵称输出流

InputStream iin = socket.getInputStream();

InputStreamReader isr =

new InputStreamReader(iin,”UTF-8″);

BufferedReader bReader = new BufferedReader(isr);

//服务端将昵称验证结果通过自身的输出流发送给客户端

OutputStream out = socket.getOutputStream();

OutputStreamWriter iosw =

new OutputStreamWriter(out,”UTF-8″);

PrintWriter ipw = new PrintWriter(iosw,true);

//读取客户端发来的昵称

String nameString = bReader.readLine();

while(true)

{

if(nameString.trim().length()==0)

{

ipw.println(“FAIL”);

}

if(allOut.containsKey(nameString))

{

ipw.println(“FAIL”);

}

else

{

ipw.println(“OK”);

return nameString;

}

nameString = bReader.readLine();

}

}

catch(Exception e)

{

throw e;

}

}

@Override

public void run()

{

PrintWriter pw = null;

try

{

/*

* 通过客户端的Socket获取客户端的输出流

* 用来将消息发送给客户端

*/

OutputStream os = socket.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os,”UTF-8″);

pw = new PrintWriter(osw,true);

/*

* 将客户昵称和其所说的话作为元素存入共享集合HashMap中

*/

nickName = getNickName();

addOut(nickName, pw);

Thread.sleep(100);

/*

* 服务端通知所有客户端,某用户登录

*/

sendMsgToAll(“[系统通知]:欢迎**”+nickName+”**登陆聊天室!”);

/*

* 通过客户端的Socket获取输入流

* 读取客户端发送来的信息

*/

InputStream is = socket.getInputStream();

InputStreamReader isr = new InputStreamReader(is,”UTF-8″);

BufferedReader br = new BufferedReader(isr);

String msgString = null;

while((msgString = br.readLine())!=null)

{

//验证是否是私聊

if(msgString.startsWith(“@”))

{

/*

* 私聊格式:@昵称:内容

*/

int index = msgString.indexOf(“:”);

if(index =0)

{

//获取昵称

String name = msgString.substring(1,index);

String info = msgString.substring(index+1,msgString.length());

info = nickName + “对你说:”+ info;

//将私聊信息发送出去

sendMsgToPrivate(name, info);

//服务端不在广播私聊的信息

continue;

}

}

/*

* 遍历所有输出流,将该客户端发送的信息转发给所有客户端

*/

System.out.println(nickName+”说:”+ msgString);

sendMsgToAll(nickName+”说:”+ msgString);

}

}

catch (Exception e)

{

/*

* 因为Win系统用户的客户端断开连接后,br.readLine()方法读取

* 不到信息就会抛出异常,而Linux系统会持续发送null;

* 因此这里就不在将捕获的异常抛出了。

*/

}

finally

{

/*

* 当执行到此处时,说明客户端已经与服务端断开连接

* 则将该客户端存在共享集合中的输出流删除

*/

removeOut(nickName);

/*

* 通知所有客户端,某某客户已经下线

*/

sendMsgToAll(“[系统通知]:”+nickName + “已经下线了。”);

/*

* 关闭socket,则通过Socket获取的输入输出流也一同关闭了

*/

if(socket!=null)

{

try

{

socket.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

}

public static void main(String[] args)

{

chatServer server = new chatServer();

server.start();

}

}

我的作业,供你参考

java socket 多人单对单聊天 客户端的接受问题

我也写过这样的程序,你的意思是只用一个socket然后让他接受信息吧,这样当然不行,既然有单对单的聊天,那么当客户A同时跟客户B客户C聊天的时候会使用到多个socket的.

我当时用的方法是用一个线程来监听来自其他客户的聊天请求的连接,当他接收到聊天请求的时候将socket直接传递给客户聊天线程ServerHold类来处理聊天事件,自己继续等待客户的连接.在程序中用一个Clent类来管理其他用户的信息 比如Clent有一个属性就是ServerHold类的实例

class Clent{

……

public ServerHold sh;

……

}

然后用一个ClentHost类

class ClentHost{

static Clent[] cs = new Clent[10];

public add(Clent clent){}

public del(Clent clent){}

public get(String name){}

}的实例来管理所有的Clent客户类

大体实例是:

class ServerWating extends Thread{

ServerSocket server;

Socket socket;

public ServerWating(){

try{

//监听端口

server = new ServerSocket(12345);

}catch(Exception e){

e.printStackTrace(System.out);

System.out.println(“对不起,监听线程出错”);

System.exit(0);

}

}

public void run(){

while(true){

try{

//等待用户连接

socket = server.accept();

//连接上后 将所得的socket 传递给ServerHold线程类并实例化 具体ServerHold类的参数你可以自己根据需求来写

ServerHold sh = new ServerHold(socket);

//启动该ServerHold线程

sh.start();

}catch(Exception e){

e.printStackTrace(System.out);

System.out.println(“对不起,监听线程出错”);

}

}

}

}

然后是与用户交互的类 ServerHold

class ServerHold extends Thread{

Socket socket;

public ServerHold(Socket socket){

this.socket = socket;

}

//用线程不停的读取对方发来的信息,避免信息的阻塞

public void run(){

try{

//根据socket新建输入流

while(true){

//读取对方发送的信息并从中获取对方的姓名,根据情况,或新建Clent然后将this(ServerHold类的本对象)添加到Clent或直接添加到已有的Clent

//读取对方发送的信息并反馈到程序

}

}catch(Exception e){

//当对方下线会出现错误时保证线程安全退出

}

}

//发送信息到对方,可以根据实际情况来确定方法的参数等内容,然后根据程序的需要直接调用

//在连接建立的时候,要发送一次自己的客户端信息,比如name什么的到对方以便其保存.

public void set(){

//根据socket取得输出流

}

}

当然,上面都是被动连接的,主动连接差不多,也是要根据连接后的socket来新建一个ServerHold类然后进行交互.

大体思想就是这样子的,当然 实现的时候会有好多困难,449775695我的QQ,有什么问题可以来问我.

javasocket多人聊天程序(java websocket聊天)

使用java socket如何建立多个多人的聊天室呢

socket使用spring,就是一般应用使用Spring。

服务器端,使用多线程。

想求一个java聊天小程序,使用图形用户界面和socket通讯 功能:可以实现两个人私聊功能和多人聊天功能。

我只介绍思路:

使用websocket创建ws服务器,nat123解析一个地址,分配一个端口给他用,发布到外网。

客户端拨通地址 登陆 接入websocket服务,心跳机制要做好,上下线掉线更新列表,注册存储用户信息,更新用户列表。

客户端可以发起群聊、私聊、收发文件、分享,甚至发送服务器消息,然后反馈消息,响应远程服务事件。

这就是一个聊天软件所做的事情,我介绍websocket可以响应多平台,多端通信。

javasocket多人聊天程序的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java websocket聊天、javasocket多人聊天程序的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月2日 19:26:58
下一篇 2024年4月2日 19:34:10

相关推荐

  • 在dos中运行java程序运行,如何在dos下运行java

    怎样用DOS命令运行C盘下的Java文件 1、首先,安装jdk并配置环境变量。打开cmd窗口运行java -version检查环境变量是否配置正确。然后,编译java文件。可以把cmd的路径转换到源文件目录下,也可以直接在命令中加入绝对路径。 2、首先,在开始菜单中或者直接以快捷键win+R调出运行窗口,然后在运行窗口中输入“cmd”命令。按回车键确定,命令…

    2024年5月23日
    4300
  • java人工智能编程实战,人工智能程序编写

    JAVA设计一个人工智能的机器人 java机器人游戏最经典的是Robocode项目,里面有详细的文档以及源码,可以自己学习修改。(不要说自己参加这个项目,自己不认真学些东西,那可以面壁了)。 Java语言适合人工智能开发吗?在《机智过人》这档节目中,人工智能开发出的机器人,不仅可以创造出对联,歌曲,还可以打篮球,进行人脸识别和声音识别等等,可谓是人工智能的风…

    2024年5月23日
    4700
  • 计算三次方程根的c语言程序,计算三次方程根的c语言程序怎么写

    C/C++一元三次方程求根程序 1、用弦截法求方程F(x)=X^3-5X^2+16X-80=0的根。方法如下:(1)取两个不同的点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。 2、一元三次方程aX^3+bX^2+cX+d=0,(a,b,c,d∈R,且a≠0)。重根判别式:A=b^2-3ac;B=bc-9ad;C=c^2-…

    2024年5月23日
    5200
  • c语言mustreturnint,C语言程序

    求助,c语言简单代码运行出错 在system(pause);后添加return 0;另外在main函数内连续使用两个以上scanf的时候会导致输入值错误。 代码没有问题,问题是运行方式:打开command命令窗口(对于win7,点击《开始》,在最底侧的输入框中键入cmd,并ENTER)利用操作系统键盘命令 x: (x为盘符,如C,D,E等)来到你编译程序默认…

    2024年5月23日
    4700
  • c语言判断m是否为素数,判断m是否为素数c语言程序

    用C语言编写判断输入的某个数m是否为素数 将m除以2到m-1之间的所有整数,如果能够整除其中任意一个数,则该数不是素数。 如果m不能被2到m-1之间的任何整数整除,则它是素数。按照题目要求,每组输入三个数。 判断一个整数m是否是素数,只需把m被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。 思路1):因此判断一个整数m是否是素…

    2024年5月23日
    5400
  • c语言程序是由组成部分组成部分组成,c程序是由语句组成的

    c语言程序是由()组成 c语言程序由头文件、main函数、子函数和结构体组成的。头文件:头文件包含程序中要调用的库函数,程序中调用了某个库函数,程序开始时必须写上“#include头文件名或#include“头文件名”。 C语言源程序是由:数据类型、常量与变量、数组、指针、字符串、文件输入/输出构成。 【答案】:C C语言程序由函数构成,main函数是主函数…

    2024年5月23日
    5000
  • javasocket释放,java里socket

    Java程序为什么需要数据库连接池麻烦告诉我 数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接数据库连接池的基本思想就是为数据库连接建立一个缓冲池。 基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个很著名的设计模式:资源池 (Resource Pool)。该模式正是为了解决资源的频繁…

    2024年5月23日
    3600
  • 用c语言设计一个大程序设计,用c语言设计一个小程序

    C语言程序设计,帮忙设计一个程序,很急。 1、实现文件写入功能,一次写入一个职工信息。实现查询功能(包含4种条件查询)。实现信息删除和修改并写入文件。根据题意,数据用结构数组存储,且职工编号唯一性,因此单独两个函数计算信息长度和编号。 2、你看HI消息啊 我给你发了 功能:统计出若干个学生的平均成绩,最高分以及得最高 分的人数。 3、委员会由硬件厂商,编译器…

    2024年5月23日
    7600
  • 心形c语言程序,心形c语言程序代码

    如何用C语言画一个“心形” 可以通过循环语句和预先定义的图形模板来实现自定义的图形。 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 简单的代码 ,每个用print来打印。复杂的用循环控制。 include conio.hinclude s…

    2024年5月23日
    5600
  • c语言闪烁的红心,c语言程序

    C语言编写闪烁的红心的程序 一个说明或一个语句占一行。用{} 括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。 进入CodeBlocks,可以创建一个C语言程序,在C文件中写入循环输出心形图案的代码,编译并运行程序即可,带love图案的C语言爱心代码…

    2024年5月23日
    4600

发表回复

登录后才能评论



关注微信