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

一:服务端:

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);

                }

            }

        }
    }

}

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();
        }

    }

}

服务端完成

二:客户端部分

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();
            }

        }
    }

}

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();
        }

    }

}
时间: 2024-11-03 10:15:57

socket网络套节字---聊天室的相关文章

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

使用socket.io打造公共聊天室

最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室.当然,我毫不犹豫选择了node来写,node有一个名叫socket.io的框架已经很完善的封装了socket相关API,所以无论是学习还是使用都是非常容易上手的,在这里强烈推荐!demo已经做好并放到我的个人网站了,大家可以试试,挺好玩的. 进去试试 ->   http://www.yinxiang

Java网络编程案例---聊天室

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net包中提供了两种常见的网络协议的支持: TCP:TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称TCP/IP. UDP:UDP是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要发送的数据的数据报. 本案例以

node+express+socket.io制作一个聊天室功能

首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js 1 var http=require("http"); 2 var express=require("express"); 3 var sio=require("socket.io"); 4 5 var app=express(); 6 app.use(express.static(__dirname+

【Java】Socket+多线程实现控制台聊天室

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端程序传送信息到服务器,服务器再把信息分发到其他客户端上,实现即时通信. 所需技术: 1:数据传输. 服务器与客户端之间的信息传递,都通过数据通道实现,有一个客户端连接到服务器,就有一条数据通道架设于该客户端和服务器之间. 这条数据通道通过Socket来实现:每个客户端通过一个socket与服务器建立

多线程+socket实现多人聊天室

最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo: demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消息,当一个客户端发送消息时,其他的客户端都可以接受到. 服务端: 客户端: 客户端代码: package com.cky.client; import java.io.IOException; import java.io.InputStream; import java.io.PrintWrite

Socket实现多人聊天室-未完成

1.项目准备: 下面呢,我们就会按照这个流程图一步一步实现一个聊天室的功能.在开发的过程中,我们将使用到一个第三方库(github上下载). 在guthub上下载下来这个类库,然后把这两个文件直接拖入工程中. 聊天室呢,分服务端和客户端,我们依次来创建. 2.服务端: 我们接下来创建一个服务端的项目: 3.客户端:

Python Socket实现简单的聊天室

通过参考其他牛人的文章和代码,  再根据自己的理解总结得出,  说明已经加在注释中, FYI 主要参考文章: http://blog.csdn.net/dk_zhe/article/details/37820965  http://www.cnblogs.com/coser/archive/2012/01/06/2315216.html  https://docs.python.org/2.7/library/select.html?highlight=select#module-select

UDP&mdash;Socket,套接字聊天简单的聊天程序。

思路:(发送端) 1.既然需要聊天.就应该怎么建立聊天程序,,DatagramSocket对象http://www.w3cschool.cc/manual/jdk1.6/ DatagramSocket dgSocket = new DatagramSocket(); 2.那么发给谁?怎么打包数据.DatagramPacket. 代码如下DatagramPacket对象API文档链接http://www.w3cschool.cc/manual/jdk1.6/ 具体查看集体代码: //创建数据包 b