socket网络套节字---聊天室

岸芷兰香 岸芷兰香     2022-09-10     208

关键词:

一:服务端:

1.创建客户端:

技术分享
package com.ywh.serversocket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Set;

public class LoginThread extends Thread
{
    Socket client;
    boolean bl;
    
    //通过构造传入一个客户socket
    public LoginThread(Socket socket)
    {
        client=socket;
    }
    
    
    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        try
        {
            //如果登录成功才运行发送消息的线程
            LoginServer();
            if(bl)
            {
                new SendThread(client).start();
            }
        } catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    
    
    public void LoginServer()throws Exception
    {
        //将连接后客户端输入传过来的用户名进行比对确认是否存在此用户
        
        //先把传过来的用户名转换为string字符串
        InputStream input=client.getInputStream();
        byte[] bytes=new byte[1024];
        input.read(bytes);
        String str=new String(bytes);
        System.out.println(str);
        //通过Set的add方法的返回值来确认用户名是否存在,
        //若用户名存在返回值为false,不存在则将新用户名加入用户名Set为true,
        boolean b=UserInfo.nickName.add(str);
        OutputStream output=client.getOutputStream();
        
        if(b)
        {
            //当b=true,即新建用户成功时通知所有用户有新用户上线
            
            //告知当前新用户创建成功
            output.write("1".getBytes());
            //将新用户的socket和用户名存入用户名map
            UserInfo.userMap.put(client, str);
            //获取用户socket
            Set<Socket> users=UserInfo.userMap.keySet();
            for(Socket user:users)
            {
                OutputStream op=user.getOutputStream();
                op.write((str+"已上线").getBytes());
            }
            bl=true;
        }else
        {
            //若创建新用户失败,则返回false
            output.write("0".getBytes());
            LoginServer();
            bl=false;
        }
        
    }
    
    

}
JDBCUtil.java

2.创建一个类用于存储登录用户的信息:

package com.ywh.serversocket;

import java.net.Socket;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class UserInfo
{
    //用来存储用户和用户名的Map
    public static HashMap<Socket, String> userMap=new HashMap<Socket, String>();
    //用于存储用户名比对的Set
    public static Set<String> nickName=new HashSet<String>();
    
}

3.交互:发送线程

技术分享
package com.ywh.serversocket;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Set;

public class SendThread extends Thread 
{

    Socket client;

    public SendThread(Socket socket)
    {
        client = socket;
    }
    

    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        while(true)
        {
            try
            {
                InputStream input=client.getInputStream();
                byte[] bytes=new byte[1024];
                input.read(bytes);
                String str=new String(bytes);
                Set<Socket> users=UserInfo.userMap.keySet();
                for(Socket user:users)
                {
                    if(user!=client)
                    {
                        user.getOutputStream().write

((UserInfo.userMap.get(client)+":"+str).getBytes());
                    }
                    
                }
                
                
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                Set<Socket> users=UserInfo.userMap.keySet();
                for(Socket user:users)
                {
                    if(user!=client)
                    {
                        try
                        {
                            user.getOutputStream

().write((UserInfo.userMap.get(client)+"下线").getBytes());
                        } catch (IOException e1)
                        {
                            // TODO Auto-generated 

catch block
                            e1.printStackTrace();
                        }
                    }
                    UserInfo.nickName.remove

(UserInfo.userMap.get(client));
                    UserInfo.userMap.remove(client);
                    
                }
                
            }
            
        }
    }
    
    

}
View Code

4.主方法,用于运行

技术分享
package com.ywh.serversocket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Main
{

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        
        try
        {
            @SuppressWarnings("resource")
            ServerSocket serversocket=new ServerSocket(8088);
            System.out.println("服务器已启动...");
            
            while(true)
            {
                Socket socket=serversocket.accept();
                new LoginThread(socket).start();
            }
            
            
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
View Code

服务端完成

二:客户端部分

1.客户端发送信息

技术分享
package com.ywh.clientsocket;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ClientReceive extends Thread
{
    Socket client;
    public ClientReceive(Socket socket)
    {
        // TODO Auto-generated constructor stub
        client=socket;
    }
    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        while(true)
        {
            try
            {
                InputStream input=client.getInputStream();
                byte[] bytes=new byte[1024];
                input.read(bytes);
                System.out.println(new String(bytes));
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    
    

}
View Code

2.客户端接受信息

技术分享
package com.ywh.clientsocket;

import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class ClientSend extends Thread
{
    Socket client;
    
    public ClientSend(Socket socket)
    {
        // TODO Auto-generated constructor stub
        client=socket;
    }

    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        @SuppressWarnings("resource")
        Scanner sc=new Scanner(System.in);
        while(true)
        {
            String str=sc.nextLine();
            try
            {
                client.getOutputStream().write(str.getBytes());
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

}
ClientSend.java

3.客户端主方法

package com.ywh.clientsocket;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;

public class Main
{
    public static String ip = "192.168.10.32";
    public static int port = 8088;
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        // System.out.println("请输入IP地址");
        // String ip=sc.nextLine().trim();
        // System.out.println("请输入端口号");
        // int port=sc.nextInt();

        try
        {
            Socket user = new Socket(ip, port);
            System.out.println("连接服务器成功,请输入登录昵称");
            String nickName = sc.nextLine();
            while (nickName.equals(""))
            {
                System.out.println("昵称不能为空,请重新输入昵称");
                nickName = sc.nextLine();
            }

            Login(user,nickName);

            new ClientSend(user).start();
            new ClientReceive(user).start();

        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void Login(Socket user, String nickName)
    {
        try
        {
            user.getOutputStream().write(nickName.getBytes());

            InputStream input = user.getInputStream();
            byte[] bytes = new byte[1024];
            input.read(bytes);
            String str = new String(bytes).trim();
            while (str.equals("0"))
            {
                System.out.println("昵称重复,请重新输入昵称");
                nickName = sc.nextLine();
                while (nickName.equals(""))
                {
                    System.out.println("昵称不能为空,请重新输入昵称");
                    nickName = sc.nextLine();
                }
                user.getOutputStream().write(nickName.getBytes());
                input = user.getInputStream();
                bytes = new byte[1024];
                input.read(bytes);
                str = new String(bytes);
            }
            if(str.equals("1"))
            {
                System.out.println("登录成功");
            }else 
            {
                System.out.println("服务器错误");
            }
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

 

win10下驱动级套节字通信(ksocket)

效果可以参考源码:tdiksocket等:https://github.com/haidragon/sokit 查看详情

fd_set-(转自kakaxia6337的专栏)

FD_ZERO,FD_ISSET这些都是套节字结合操作宏看看MSDN上的select函数,这是在select io 模型中的核心,用来管理套节字IO的,避免出现无辜锁定.int select(  int nfds,fd_set FAR *readfds,  fd_set FAR  查看详情

qt实现简单聊天(一个服务器和多个客服端)(代码片段)

...ientSocketList;每当一个客服端链接上那个服务器一直接听的套节字 查看详情

基于socket的网络聊天室

fromasyncoreimportdispatcherfromasynchatimportasync_chatimportsocket,asyncorePORT=5005NAME="ChatRoom"classEndSession(Exception):passclassCommandHandler:defunknow(self,session,cmd):sess 查看详情

gui应用:socket网络聊天室

在这个周末刚刚写出来的python桌面应用--网络聊天室,主要通过pyqt5作为桌面应用框架,socket作为网络编程的框架,从而实现包括客户端和服务端的网络聊天室的GUI应用,希望可以一起学习、一起进步!应用包括服务端server_ui.py... 查看详情

wsaevent

//TODO:在此添加控件通知处理程序代码CStringstr,edit_str;GetDlgItemText(IDC_StartServer,str);//事件句柄和套节字句柄表WSAEVENTeventArray[WSA_MAXIMUM_WAIT_EVENTS];SOCKETsockArray[WSA_MAXIMUM_WAIT_EVENTS];intnEventTotal=0;if(str== 查看详情

unity聊天室(socket编程)(代码片段)

示例:  什么是Socket:Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求或者应答网络请求!Socket是支撑TCP/IP协议的网络通信的基本操作单元,... 查看详情

socket发送udp广播实现聊天室功能

什么是Socket?Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。socket()函数Python中,我们用socket()函数来创建套接字,语法格式如下:socket.socket([fa... 查看详情

网络编程知识使用socket通信,做一个简单的多人聊天室(代码片段)

📢前言🎬使用Socket通信,做一个简单的多人聊天室🏳️‍🌈一个简单的UI🏳️‍🌈服务端部分🏳️‍🌈客户端部分🏳️‍🌈Loom插件的使用🎁效果展示💬总结📢前言Sock... 查看详情

一个简单的网络聊天程序实现

socket简介Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个so... 查看详情

基于java实现hello/hi简单网络聊天程序

目录Socket简要阐述Socket的概念Socket原理hello/hi的简单网络聊天程序实现服务器端客户端程序执行结果跟踪分析调用栈&LinuxAPI对比创建ServerSocket调用栈图示源码分析Socket绑定调用栈图示源码分析Socket监听调用栈图示源码分析Socket... 查看详情

PHP Socket 服务器与 node.js:网络聊天

】PHPSocket服务器与node.js:网络聊天【英文标题】:PHPSocketServervsnode.js:WebChat【发布时间】:2011-06-0204:07:36【问题描述】:我想使用长期持有的HTTP请求(Comet)、ajax和websockets(取决于所使用的浏览器)来编写一个HTTPWebChat。用户数据... 查看详情

前端小demo:使用socket实现简易网络聊天室(代码片段)

项目实现截图1.实现原理websocket首先我们要知道http是一种无状态协议,无法轻松实现实时应用。服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接。我们可以实现捕获浏览器上的事件,通过事件... 查看详情

游戏开发实战unity使用socket通信实现简单的多人聊天室(万字详解|网络|tcp|通信|mirror|networking)(代码片段)

文章目录一、前言二、简单的Socket通信:多人聊天室1、服务端:python代码1.1、importsocket1.2、构造socket对象1.3、绑定/监听端口1.3、监听客户端连接1.4、接收客户端socket消息1.5、多线程1.6、完整代码:game_server.py2、客户... 查看详情

游戏开发实战unity使用socket通信实现简单的多人聊天室(万字详解|网络|tcp|通信|mirror|networking)(代码片段)

文章目录一、前言二、简单的Socket通信:多人聊天室1、服务端:python代码1.1、importsocket1.2、构造socket对象1.3、绑定/监听端口1.3、监听客户端连接1.4、接收客户端socket消息1.5、多线程1.6、完整代码:game_server.py2、客户... 查看详情

第92题java高级技术-网络编程11(简易聊天室6:使用socket通信)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第92天,每天我会提供一篇文章供群成员阅读(不需要订阅付钱),... 查看详情

[8421论坛]2019socket网络编程入门到进阶与实战完整视频教程

...第五章 UDP辅助TCP实现点对点传输案例第六章 简易聊天室案例第七章 服务器传输优化-NIO第八章 数据传输稳定性优化第九章 局域网文件快传技术实战第十章 聊天室升级版实战第十一章 语音数据即时通... 查看详情

第93题java高级技术-网络编程12(简易聊天室7:使用socket传递对象)

回城传送–》《JAVA筑基100例》文章目录零、前言一、题目描述二、解题思路三、代码详解四、推荐专栏五、示例源码下载零、前言​今天是学习JAVA语言打卡的第93天,每天我会提供一篇文章供群成员阅读(不需要订阅付钱),... 查看详情