Java项目——模仿QQ群聊和私聊!!!(网络编程+多线程) A8站源码交易平台

摘要://这儿是完成了获取信息 private String receive() { String msg = ""; try { msg = dis.readUTF(); } catch (IOException e) { release(); } return msg; } //这是重写了run办法,完成多线程,也便是多个客户端都能与服务器打交道

链接:https://pan.baidu.com/s/1dCwV_CI7maTwktePtaCtQw

提取码:qwka


一、聊天演示
这个是我自己模仿的截图,因为只要一台电脑,故只能运转多个窗口进行演示,这儿的服务器端是Server,客户端有三个分别是111、222和333,当咱们正常聊天是群聊状况,想要进行私聊能够进行@XXX:即可,该体系能够完结多台电脑的联机,已实验。A8站源码交易平台


9121738bc80896c7379c2890ea5ffaa.png




二、服务器端
下面给我们详细的解说一下关于QQ群聊和私聊的详细思维,首要这个程序用了TCP协议,也叫做三次握手协议,为什么这样讲呢,是因为在这个TCP协议平分客户端和服务器端,客户端要想向服务器端发送音讯,首先要先给服务器打个招呼,看看服务器是否能正常作业,假如能够,服务器会给一个回复,当客户端接到这个必定的回复后才干向服务器发送音讯,所以需求先发动服务器端,期间,服务器端和客户端之间的信息传输都是以流的办法进行的,怎么发动服务器端呢,这个是我写的代码,里边都有注释:A8站源码交易平台

package com.TCP;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 该类完成的是服务器端,也只要发动了服务器,客户端才干进行信息的沟通
 * @author 11852
 *
 */
 
public class Server {

//这个list调集是用来存储各个客户端的,每逢有一个客户端树立了衔接,这儿就会存储起来
private static Listlist = new ArrayList();
 
public static void main(String[] args) throws IOException {
System.out.println("---Server---");
// 指定端口,运用ServerSocket创立服务器,此刻创立了一个姓名为server端口号为12345的服务器
ServerSocket server = new ServerSocket(12345);
 
boolean flag = true;
while (flag) {
// 阻塞式等候衔接accept,服务器调用accept办法,便是取得一个客户端的衔接
//假如没有客户端衔接,则该程序处于阻塞状况
Socket client = server.accept();
System.out.println("一个客户端树立了衔接");

//客户端与服务器树立了衔接之后,获取该客户端的输入流和输出流目标
Channel channel = new Channel(client);
list.add(channel);// 用list容器管理所有的人员
//这儿是完成多线程,即每个客户端都能够进行与服务器端的沟通
new Thread(channel).start();
}
server.close();
}
 
// 一个客户端代表一个Channel
static class Channel implements Runnable {
private DataInputStream dis;
private DataOutputStream dos;
private Socket client;
private boolean isRunning;
private String name;
 
//这是结构办法
public Channel(Socket client) {
this.client = client;
try {
dis = new DataInputStream(client.getInputStream());
isRunning = true;
name = receive();
} catch (IOException e) {
relese();
}
try {
dos = new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
relese();
}
}
 
// 接纳音讯
private String receive() {
String msg = "";
try {
msg = dis.readUTF();
} catch (IOException e) {
relese();
}
return msg;
}
 
// 发送音讯
private void send(String msg) {
try {
dos.writeUTF(msg);
} catch (IOException e) {
relese();
}
}
 
// 群聊,发给他人
private void sendOthers(String msg) {
 
// 私聊格局@XXX:这儿是找到以@最初的信息
if (msg.startsWith("@")) {
int idx = msg.indexOf(":");
String targetName = msg.substring(1, idx);
msg = msg.substring(idx + 1);
for (Channel other : list) {
if (other.name.equals(targetName)) {
other.send(this.name + ":" + msg);
}
}
} else {
for (Channel other : list) {
if (other == this) {
continue;
} else {
other.send(this.name + ":" + msg);
}
 
}
}
}
 
// 开释资源
private void relese() {
this.isRunning = false;
//这儿的Util是自定义的一个类
Util.close(dis, dos, client);
}
 
@Override
public void run() {
while (isRunning) {
String msg = receive();
if (!msg.equals("")) {
sendOthers(msg);
}
}
}
}
}
三、客户端
客户端顶用到了接纳信息、发送信息以及开释资源  A8站源码交易平台

package com.TCP;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("---Client---");
 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名");
String name = br.readLine();
// 树立衔接,运用Socket创立衔接,括号内是服务器的地址和端口
Socket client = new Socket("localhost", 12345);
 
// 客户端发送音讯
new Thread(new Send(client, name)).start();
new Thread(new Receive(client)).start();
}
}
在完成客户端的时分,我这里是在控制台输入的信息,也能够进行跨级谈天,但条件是要在同一个局域网内,关于客户端来说,需求客服端进行发送信息和接纳信息,首先看看接纳信息吧


package com.TCP;
 
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
 
public class Receive implements Runnable {
private DataInputStream dis;
private Socket client;
private boolean isRunning;
 
//这儿是传过来了一个客户端目标,并取得了输入流目标
public Receive(Socket client) {
this.client = client;
try {
dis = new DataInputStream(client.getInputStream());
isRunning = true;
} catch (IOException e) {
release();
}
}
 
//这儿是完成了获取信息
private String receive() {
String msg = "";
try {
msg = dis.readUTF();
} catch (IOException e) {
release();
}
return msg;
}

//这是重写了run办法,完成多线程,也便是多个客户端都能与服务器打交道
@Override
public void run() {
while (isRunning) {
String msg = receive();
if (!msg.equals("")) {
System.out.println(msg);
}
}
}
 
// 开释资源
private void release() {
this.isRunning = false;
Util.close(dis, client);
}
}
然后便是发送类了,发送跟接纳差不多,基本思路是相同的

package com.TCP;
 
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Send implements Runnable {
private BufferedReader console;
private DataOutputStream dos;
private Socket client;
private boolean isRunning;
 
// 这儿用到了姓名,便是知道是谁谁发的信息
public Send(Socket client, String name) {
console = new BufferedReader(new InputStreamReader(System.in));
this.client = client;
try {
dos = new DataOutputStream(client.getOutputStream());
this.isRunning = true;
send(name);
 
} catch (IOException e) {
release();
}
}
 
// 这儿是重写了run办法
@Override
public void run() {
while (isRunning) {
String msg = getStrFromConsole();
if (!msg.equals("")) {
send(msg);
}
 
}
 
}
 
// 这儿是发送音讯
private void send(String msg) {
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
release();
}
}
 
// 这儿是获取控制台输入的信息
private String getStrFromConsole() {
String msg = "";
try {
msg = console.readLine();
} catch (IOException e) {
release();
}
return msg;
}
 
// 开释资源
private void release() {
this.isRunning = false;
Util.close(dos, client);
}
}
四、Util东西类
这个便是Util类了,这个类便是完成了开释资源

package com.TCP;
 
import java.io.Closeable;
 
/**
 * 东西类
 * 
 * @author 11852
 *
 */
public class Util {
 
// 开释资源
public static void close(Closeable... targets) {
for (Closeable target : targets) {
try {
if (target != null) {
target.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}


A8站源码交易平台


  • 全部评论(0)
最新发布的资讯信息
【A8站-免费源码分享|直播源码】直播系统源码开发:关于安卓开发工具和obs直播推流(2020-10-30 09:41)
【计算机/互联网|】【独家修复】用户定制版短视频点赞系统,支持抖音+快手+刷宝+微视等所有主流短视频评论系统源码(2020-10-26 16:34)
【技术宅-为技术而疯|网站架设教程】【独家首发】最新更新已对接短信2020全新抖音快手点赞任务系统霸屏天下小红书头条威客兼职完整搭建架设视频教程(2020-10-25 13:56)
【技术宅-为技术而疯|网站架设教程】最新可用个人发卡网系统源码完整搭建架设视频教程(2020-10-25 10:53)
【技术宅-为技术而疯|网站架设教程】独家更新全新V10抢单系统唯品会京东淘宝自动抢单区块系统源码全开源抢单收单接单返利+搭建架设完整视频教程(2020-10-25 10:52)
【计算机/互联网|】柔丫纸尿裤云仓系统源码部署(2020-10-15 18:13)
【计算机/互联网|】侏罗纪软件模式定制开发(2020-10-14 15:33)
【计算机/互联网|】S2b2C供应商系统 营销闭环(2020-10-10 17:46)
【计算机/互联网|程序设计开发】盛都汇系统奖励机制(2020-10-10 17:20)
【A8站-免费源码分享|网站源码】积分商城系统APP开发(2020-09-23 14:56)
联系我们
Q Q:3101359898 点击直接对话
电话:18580901894
邮箱:admin#a8zhan.com
时间:09:00 - 24:00
手机二维码 访问手机版
返回顶部