package Chat;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.ArrayList;
public class ChatServer {
public static void main(String[] args){
try {
ServerSocket server=new ServerSocket(8088);
Socket socket=null;
List<Socket> sockets=new ArrayList<Socket>();
TongJiNum tj=new TongJiNum();
tj.start();
System.out.println("聊天室启动.....");
while(true){
socket=server.accept();
String come=socket.getRemoteSocketAddress().toString();
String comeStr[]=come.split("/");
System.out.println(comeStr[1]+"进来了");
ServerThread st=new ServerThread(socket,sockets,comeStr[1]);
st.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread extends Thread{
private Socket socket;
private static List<Socket> sockets;
private BufferedReader br;
private PrintWriter pw;
private String message;
public static byte[] o=new byte[0];
protected static int online;
public ServerThread(Socket socket,List<Socket> sockets,String come){
synchronized(o){
try{
System.out.println(come+"进来了");
for(int i=0;i<sockets.size();i++){
PrintWriter pw=MyUtil.getPrintWriter(sockets.get(i));
pw.println(come+"进来了");
pw.flush();
}
sockets.add(socket);
}catch(Exception e){
}
}
online++;
this.socket=socket;
this.sockets=sockets;
try{
this. br=MyUtil.getNetStream(this.socket);
this.pw=MyUtil.getPrintWriter(this.socket);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static void chatToOne(Socket socket,Socket socketto){
new ChatToOne(socket,socketto).start();
}
public static void chatToMul(Socket socket,List<Socket> sockets){
new ChatToMul(socket,sockets).start();
}
public static List<Socket> findSockets(String ss,Socket socket){
String addsource[]=ss.split("#");
String tempMessage="";
List<Socket> finds=new ArrayList<Socket>();
for(int j=0;j<addsource.length;j++){
for(int i=0;i<sockets.size();i++){
String add[]=sockets.get(i).getRemoteSocketAddress().toString().split("/");
if(addsource[j].equals(add[1])){
finds.add(sockets.get(i));
tempMessage=sockets.get(i).toString();
PrintWriter pw;
try {
pw = MyUtil.getPrintWriter(socket);
pw.println("已连接的socket:"+tempMessage);
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return finds;
}
public static Socket findSocket(String ss,Socket socket){
String tempMessage="";
for(int i=0;i<sockets.size();i++){
String add[]=sockets.get(i).getRemoteSocketAddress().toString().split("/");
if(add[1].equals(ss)){
tempMessage=sockets.get(i).toString();
PrintWriter pw;
try {
pw = MyUtil.getPrintWriter(socket);
pw.println("已连接的socket"+tempMessage);
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
return sockets.get(i);
}
}
return new Socket();
}
public void run(){
try{//处理的每一个部分都需要加锁,synchronized(this.o)
//对用户发送过来的消息进行处理,循环处理,也就是监听
while(true){
message=br.readLine();
if(message==null){
synchronized(o){
continue;
}
}else if(message.trim().equals("close")){
synchronized(o){
break;
}
}else if(message.trim().equals("chatmy")){
PrintWriter pw=MyUtil.getPrintWriter(socket);
synchronized(o){
String who=socket.getRemoteSocketAddress().toString();
String ss[]=who.split("/");
pw.println(ss[1]);
pw.flush();
}
}else if(message.trim().equals("chatlist")){
PrintWriter pw=MyUtil.getPrintWriter(socket);
for(int i=0;i<sockets.size();i++){
synchronized(o){//刚才把锁放在循环外部
String who=sockets.get(i).getRemoteSocketAddress().toString();
String ss[]=who.split("/");
pw.println(ss[1]);
pw.flush();
}
}
}else if(message.matches("chatto@\\w+([-:.@#$|]\\w+)*")){
//chatto@m@127.0.0.1:6789#127.0.0.1:6677#127.0.0.1:8888
//chatto@s@127.0.0.1:6789
String ss[]=message.split("@");
if(ss[1].equals("s")){
if(ss[2].matches("\\w+([-+.:]\\w+)*:\\w*")){
//进入1对1聊天,必须输入quit才能退出
chatToOne(this.socket,findSocket(ss[2],this.socket));
}
}else if(ss[1].equals("m")){
//进入1对n聊天,必须输入quit才能退出
chatToMul(this.socket,findSockets(ss[2],this.socket));
}else{
System.out.println("命令格式出错");
}
}else{
for(int i=0;i<sockets.size();i++){
synchronized(o){
PrintWriter pw=MyUtil.getPrintWriter(sockets.get(i));
String who=socket.getRemoteSocketAddress().toString();
String ss[]=who.split("/");
pw.println(ss[1]+"说:"+message);
pw.flush();
}
}
}
}
}catch(Exception e){
}finally{
//处理离开的用户,并对online减1,和通知每一个在线用户
//先在服务器中打印谁离开,再通知所有人,谁离开了
synchronized(o){
String who=socket.getRemoteSocketAddress().toString();
String ss[]=who.split("/");
System.out.println(ss[1]+"离开了");
//通知所有人,谁离开了
try{
for(int i=0;i<sockets.size();i++){
PrintWriter pw=MyUtil.getPrintWriter(sockets.get(i));
pw.println(ss[1]+"离开了");
pw.flush();
}
online--;
socket.close();
}catch(Exception e){
e.printStackTrace();
}finally{
sockets.remove(socket);
}
}
}
}
}
class TongJiNum extends Thread{
public void run(){
while(true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前聊天室"+ServerThread.online+"人在线");
}
}
}
package Chat;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class ChatClient {
//public static Object o=new Object();
public static byte[] o=new byte[0];
public final static BufferedReader jianpan=MyUtil.getInputStream();
private static WriteMessage wm;
private static ReceiveMessage rm;
private static Socket socket;
public static void main(String[] args) {
System.out.println("请输入ip地址和端口号");
System.out.println("例如:127.0.0.1=8088");
System.out.println("输入chathelp命令,获取聊天室的帮助");
try{
String message=jianpan.readLine();
while(message==null||message.trim().length()==0){
System.out.println("请输入ip地址和端口号");
System.out.println("例如:127.0.0.1=8088");
message=jianpan.readLine();
}
String ss[]=message.split("=");
socket=connect(ss);//在内部定义了socket,没有关联
wm=new WriteMessage(socket,jianpan);
wm.start();
rm=new ReceiveMessage(socket);
rm.start();
System.out.println("启动了");
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static Socket connect(String[] ss)throws Exception{
try {
Socket socket=new Socket(ss[0],Integer.parseInt(ss[1]));
return socket;
} catch (NumberFormatException e) {
System.out.println("请输入正确的端口号");
throw new Exception("聊天室异常……");
} catch (UnknownHostException e) {
System.out.println("找不到主机地址");
throw new Exception("聊天室异常……");
} catch (IOException e) {
System.out.println("连接出错");
throw new Exception("聊天室异常……");
}
}
}
class MyUtil{
//输入流
public static BufferedReader getInputStream(){
return new BufferedReader(new InputStreamReader(System.in));
}
//获取网络流
public static BufferedReader getNetStream(Socket socket)throws Exception{
return new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
//发送消息
public static PrintWriter getPrintWriter(Socket socket) throws Exception{
return new PrintWriter(socket.getOutputStream());
}
}
class ReceiveMessage extends Thread{
private BufferedReader br;
public ReceiveMessage(Socket socket){
try {
this.br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public void run(){
String message="";
try{
while(true){
message=this.br.readLine();
if(message==null){
break;
}
System.out.println(message);
}
}catch(Exception e){
}finally{
synchronized(ChatClient.o){
System.out.println("客户端在5秒后关闭");
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("客户端关闭");
System.exit(1);
}
}
}
}
class WriteMessage extends Thread{
private PrintWriter pw;
private BufferedReader jianpan;
public WriteMessage(Socket socket,BufferedReader jianpan){
super();
this.jianpan=jianpan;
try {
this.pw=MyUtil.getPrintWriter(socket);
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(){
String message=null;
System.out.println("-----请发言-----");
try{
while(true){
message=this.jianpan.readLine();
if(message==null){
continue;
}else if(message.length()==0){
System.out.println("请不要发送空消息,静止发言5秒");
Thread.sleep(5000);
System.out.println("可以发言了");
continue;
}else if(message.equals("chathelp")){
System.out.println("退出聊天室:close");
System.out.println("查看全部人ip:chatlist");
System.out.println("查看自己的ip:chatmy");
System.out.println("指定的多人聊:");
System.out.println("chatto@m@127.0.0.1:6789#127.0.0.1:6677#127.0.0.1:8888");
System.out.println("私聊");
System.out.println("chatto@s@127.0.0.1:6789");
System.out.println("退出私聊:quit");
continue;
}else if(message.equals("close")){
this.pw.println(message);
this.pw.flush();
break;
}else if(message.matches("chatto@\\w+([-:.@#$|]\\w+)*")){
System.out.println("单人私聊(按s):请输入要私聊的ip地址:端口号");
System.out.println("多人私聊(按m):请输入要私聊的\"ip1地址:端口号|ip2地址:端口号|...\"");
this.pw.println(message);
this.pw.flush();
}else{
pw.println(message);
pw.flush();
}
}
}catch(Exception e){
}finally{
synchronized(ChatClient.o){
System.out.println("客户端在3秒后离开");
try{
Thread.sleep(3000);
}catch(Exception e){
}
System.out.println("客户端已经关闭");
System.exit(1);
}
}
}
}
package Chat;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
public class ChatToOne {
private Socket socket;
private Socket socketto;
public ChatToOne(Socket socket,Socket socketto){
this.socket=socket;
this.socketto=socketto;
}
public void start(){
while(true){
try {
if(!socket.isConnected()){
System.out.println("该socket已经关闭");
socket.close();
return;
}
String message=MyUtil.getNetStream(socket).readLine();
if(message.equals("quit")){
Thread.yield();
break;
}
PrintWriter pw=MyUtil.getPrintWriter(socket);
PrintWriter pwto=MyUtil.getPrintWriter(socketto);
pw.println(socket.getRemoteSocketAddress().toString()+"对"+
socketto.getRemoteSocketAddress().toString()+"说:"+message);
pw.flush();
pwto.println(socket.getRemoteSocketAddress().toString()+"对"+
socketto.getRemoteSocketAddress().toString()+"说:"+message);
pwto.flush();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch(Exception e){
}
}
}
}
//把线程类改为普通类,就不会出现那种交替发送,一次发给私聊的用户,一次发给群聊的
class ChatToMul{
private Socket socket;
private List<Socket> sockets;
public ChatToMul(Socket socket,List<Socket> sockets){
this.socket=socket;
this.sockets=sockets;
}
public void start(){
while(true){
try {
String message=MyUtil.getNetStream(socket).readLine();
if(message.equals("quit")){
Thread.yield();
break;
}
for(Socket socketto:sockets){
PrintWriter pw=MyUtil.getPrintWriter(socket);
PrintWriter pwto=MyUtil.getPrintWriter(socketto);
pw.println(socket.getRemoteSocketAddress().toString()+"对"+
socketto.getRemoteSocketAddress().toString()+"说:"+message);
pw.flush();
pwto.println(socket.getRemoteSocketAddress().toString()+"对"+
socketto.getRemoteSocketAddress().toString()+"说:"+message);
pwto.flush();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch(Exception e){
}
}
}
}
分享到:
相关推荐
Dos下的局域网聊天室,支持群聊和私聊,多人聊天
Java代码写的基于TCP和Socket编程的局域网多线程多人聊天室(Java网络编程)实训小例子。
C语言编写,采用CS模型,TCP、UDP网络协议实现的内网多人聊天室。 服务器:采用多线程以及线程锁处理客户端的所有请求以及信息转发任务。服务端实时显示客户的登录与登出信息;保存客户上传的共享文件(网盘功能);...
c# winform IP MSG 类似功能 还可以 聊天室一样群聊 私聊 局域网内部通信 发消息 聊天
使用UDP和TCP开发的Java局域网聊天室。 功能: 1、群聊和私聊的实现; 2、可发送单一文件或文件夹; 3、可在传送文件同时进行聊天消息发送,不会假死。
局域网聊天室,java scoket编程,可直接运行,实现群聊、私聊、可使用表情
支持群聊、私聊支持在线会议,会议室设置密码,密码验证通过才能进入会议室,功能比较齐全
C#实现的局域网聊天室 数据库Sqlserver 界面winform 服务器同步服务器 功能多线程实现 私聊,群聊,文件传输 XML配置文件
简单的JAVA聊天室,私聊,群聊,在线用户,端口设置都有
UDP局域网聊天室实现 1.UDP聊天室基本功能分析 2.UDP实现流程分析(客户端,服务器) 3.UDP聊天功能实现(群聊,私聊) 4.总结 1.UDP基本功能分析 在学完网络中UDP的编程之后,我们想通过实现一个UDP的聊天室来实际运用...
2. **多人参与**:支持多个用户同时在线,进行群聊或私聊。 3. **文件传输**:用户之间可以方便地发送和接收文件,实现资料的快速共享。 4. **用户管理**:服务器端可对用户进行添加、删除等基本管理操作。 **技术...
实现目标 一个在Linux下可以使用的聊天...5. Client段增加某些常用话语,可以对其中某些部分进行”姓名替换”,例如,输入/ClientA/welcome,则会自动发送”ClientA 大侠,欢迎你来到咱们的聊天室” 附加功能: 文件传输
本聊天室命名为mfqq聊天室 主要用于局域网内的文本信息交流 在此聊天室中共有以下功能: 注册:直接输入用户名和密码就可成功注册并登录进入聊天室 登录:输入已注册的用户和密码即可进入聊天室 创建群聊:能够创建...
聊天室中,本人将用户信息单独存放在数据库中 功能:私聊,群聊,登录,注册,查看在线联系人,退出,创建数据库
该聊天室可以实现公聊和私聊的功能,基于tcp的实现,用到多线程
自己编的,用最简单的SELECT模型和多线程技术实现的,还有许多不足之处,但是能实现基本的私聊,群聊,服务器广播功能,我会在以后加以改进。
java实现简单聊天程序,包含数据库,网络通信,代码简单易懂。功能实现较为完整。
开发平台UBUNTU12,WINDOWS,QT5.4 将服务器部署在Ubuntu里,启动之后,可以接受QT客户端连接,实现登录、注册、私聊、群聊功能,十分适合练手
1.ChatRoom模仿QQ界面实现局域网消息互通; ... 3.登录后,选中私信模式,在好友列表中可以双击选中某位好友,来...4.群聊世界,可以跟局域网内所有在线用户交流; 5.用户主界面额外设置了Bing网页搜索功能,供用户使用。
主要为大家详细介绍了Python socket实现简单聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下