一:服务端:

1.创建客户端:

  1. package com.ywh.serversocket;
  2.  
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.Socket;
  6. import java.util.Set;
  7.  
  8. public class LoginThread extends Thread
  9. {
  10. Socket client;
  11. boolean bl;
  12.  
  13. //通过构造传入一个客户socket
  14. public LoginThread(Socket socket)
  15. {
  16. client=socket;
  17. }
  18.  
  19. @Override
  20. public void run()
  21. {
  22. // TODO Auto-generated method stub
  23. try
  24. {
  25. //如果登录成功才运行发送消息的线程
  26. LoginServer();
  27. if(bl)
  28. {
  29. new SendThread(client).start();
  30. }
  31. } catch (Exception e)
  32. {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36.  
  37. }
  38.  
  39. public void LoginServer()throws Exception
  40. {
  41. //将连接后客户端输入传过来的用户名进行比对确认是否存在此用户
  42.  
  43. //先把传过来的用户名转换为string字符串
  44. InputStream input=client.getInputStream();
  45. byte[] bytes=new byte[1024];
  46. input.read(bytes);
  47. String str=new String(bytes);
  48. System.out.println(str);
  49. //通过Set的add方法的返回值来确认用户名是否存在,
  50. //若用户名存在返回值为false,不存在则将新用户名加入用户名Set为true,
  51. boolean b=UserInfo.nickName.add(str);
  52. OutputStream output=client.getOutputStream();
  53.  
  54. if(b)
  55. {
  56. //当b=true,即新建用户成功时通知所有用户有新用户上线
  57.  
  58. //告知当前新用户创建成功
  59. output.write("1".getBytes());
  60. //将新用户的socket和用户名存入用户名map
  61. UserInfo.userMap.put(client, str);
  62. //获取用户socket
  63. Set<Socket> users=UserInfo.userMap.keySet();
  64. for(Socket user:users)
  65. {
  66. OutputStream op=user.getOutputStream();
  67. op.write((str+"已上线").getBytes());
  68. }
  69. bl=true;
  70. }else
  71. {
  72. //若创建新用户失败,则返回false
  73. output.write("0".getBytes());
  74. LoginServer();
  75. bl=false;
  76. }
  77.  
  78. }
  79.  
  80. }

JDBCUtil.java

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

  1. package com.ywh.serversocket;
  2.  
  3. import java.net.Socket;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.Set;
  7.  
  8. public class UserInfo
  9. {
  10. //用来存储用户和用户名的Map
  11. public static HashMap<Socket, String> userMap=new HashMap<Socket, String>();
  12. //用于存储用户名比对的Set
  13. public static Set<String> nickName=new HashSet<String>();
  14.  
  15. }

3.交互:发送线程

  1. package com.ywh.serversocket;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.net.Socket;
  6. import java.util.Set;
  7.  
  8. public class SendThread extends Thread
  9. {
  10.  
  11. Socket client;
  12.  
  13. public SendThread(Socket socket)
  14. {
  15. client = socket;
  16. }
  17.  
  18. @Override
  19. public void run()
  20. {
  21. // TODO Auto-generated method stub
  22. while(true)
  23. {
  24. try
  25. {
  26. InputStream input=client.getInputStream();
  27. byte[] bytes=new byte[1024];
  28. input.read(bytes);
  29. String str=new String(bytes);
  30. Set<Socket> users=UserInfo.userMap.keySet();
  31. for(Socket user:users)
  32. {
  33. if(user!=client)
  34. {
  35. user.getOutputStream().write
  36.  
  37. ((UserInfo.userMap.get(client)+":"+str).getBytes());
  38. }
  39.  
  40. }
  41.  
  42. } catch (IOException e)
  43. {
  44. // TODO Auto-generated catch block
  45. Set<Socket> users=UserInfo.userMap.keySet();
  46. for(Socket user:users)
  47. {
  48. if(user!=client)
  49. {
  50. try
  51. {
  52. user.getOutputStream
  53.  
  54. ().write((UserInfo.userMap.get(client)+"下线").getBytes());
  55. } catch (IOException e1)
  56. {
  57. // TODO Auto-generated
  58.  
  59. catch block
  60. e1.printStackTrace();
  61. }
  62. }
  63. UserInfo.nickName.remove
  64.  
  65. (UserInfo.userMap.get(client));
  66. UserInfo.userMap.remove(client);
  67.  
  68. }
  69.  
  70. }
  71.  
  72. }
  73. }
  74.  
  75. }

4.主方法,用于运行

  1. package com.ywh.serversocket;
  2.  
  3. import java.io.IOException;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6.  
  7. public class Main
  8. {
  9.  
  10. public static void main(String[] args)
  11. {
  12. // TODO Auto-generated method stub
  13.  
  14. try
  15. {
  16. @SuppressWarnings("resource")
  17. ServerSocket serversocket=new ServerSocket(8088);
  18. System.out.println("服务器已启动...");
  19.  
  20. while(true)
  21. {
  22. Socket socket=serversocket.accept();
  23. new LoginThread(socket).start();
  24. }
  25.  
  26. } catch (IOException e)
  27. {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }
  31.  
  32. }
  33.  
  34. }

服务端完成

二:客户端部分

1.客户端发送信息

  1. package com.ywh.clientsocket;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.net.Socket;
  6.  
  7. public class ClientReceive extends Thread
  8. {
  9. Socket client;
  10. public ClientReceive(Socket socket)
  11. {
  12. // TODO Auto-generated constructor stub
  13. client=socket;
  14. }
  15. @Override
  16. public void run()
  17. {
  18. // TODO Auto-generated method stub
  19. while(true)
  20. {
  21. try
  22. {
  23. InputStream input=client.getInputStream();
  24. byte[] bytes=new byte[1024];
  25. input.read(bytes);
  26. System.out.println(new String(bytes));
  27. } catch (IOException e)
  28. {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32.  
  33. }
  34. }
  35.  
  36. }

2.客户端接受信息

  1. package com.ywh.clientsocket;
  2.  
  3. import java.io.IOException;
  4. import java.net.Socket;
  5. import java.util.Scanner;
  6.  
  7. public class ClientSend extends Thread
  8. {
  9. Socket client;
  10.  
  11. public ClientSend(Socket socket)
  12. {
  13. // TODO Auto-generated constructor stub
  14. client=socket;
  15. }
  16.  
  17. @Override
  18. public void run()
  19. {
  20. // TODO Auto-generated method stub
  21. @SuppressWarnings("resource")
  22. Scanner sc=new Scanner(System.in);
  23. while(true)
  24. {
  25. String str=sc.nextLine();
  26. try
  27. {
  28. client.getOutputStream().write(str.getBytes());
  29. } catch (IOException e)
  30. {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36.  
  37. }

ClientSend.java

3.客户端主方法

  1. package com.ywh.clientsocket;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.net.Socket;
  6. import java.util.Scanner;
  7.  
  8. public class Main
  9. {
  10. public static String ip = "192.168.10.32";
  11. public static int port = 8088;
  12. static Scanner sc = new Scanner(System.in);
  13.  
  14. public static void main(String[] args)
  15. {
  16. // TODO Auto-generated method stub
  17. // System.out.println("请输入IP地址");
  18. // String ip=sc.nextLine().trim();
  19. // System.out.println("请输入端口号");
  20. // int port=sc.nextInt();
  21.  
  22. try
  23. {
  24. Socket user = new Socket(ip, port);
  25. System.out.println("连接服务器成功,请输入登录昵称");
  26. String nickName = sc.nextLine();
  27. while (nickName.equals(""))
  28. {
  29. System.out.println("昵称不能为空,请重新输入昵称");
  30. nickName = sc.nextLine();
  31. }
  32.  
  33. Login(user,nickName);
  34.  
  35. new ClientSend(user).start();
  36. new ClientReceive(user).start();
  37.  
  38. } catch (IOException e)
  39. {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43.  
  44. }
  45.  
  46. public static void Login(Socket user, String nickName)
  47. {
  48. try
  49. {
  50. user.getOutputStream().write(nickName.getBytes());
  51.  
  52. InputStream input = user.getInputStream();
  53. byte[] bytes = new byte[1024];
  54. input.read(bytes);
  55. String str = new String(bytes).trim();
  56. while (str.equals("0"))
  57. {
  58. System.out.println("昵称重复,请重新输入昵称");
  59. nickName = sc.nextLine();
  60. while (nickName.equals(""))
  61. {
  62. System.out.println("昵称不能为空,请重新输入昵称");
  63. nickName = sc.nextLine();
  64. }
  65. user.getOutputStream().write(nickName.getBytes());
  66. input = user.getInputStream();
  67. bytes = new byte[1024];
  68. input.read(bytes);
  69. str = new String(bytes);
  70. }
  71. if(str.equals("1"))
  72. {
  73. System.out.println("登录成功");
  74. }else
  75. {
  76. System.out.println("服务器错误");
  77. }
  78. } catch (IOException e)
  79. {
  80. // TODO Auto-generated catch block
  81. e.printStackTrace();
  82. }
  83.  
  84. }
  85.  
  86. }

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

  1. C++ socket 网络编程 简单聊天室

    操作系统里的进程通讯方式有6种:(有名/匿名)管道.信号.消息队列.信号量.内存(最快).套接字(最常用),这里我们来介绍用socket来实现进程通讯. 1.简单实现一个单向发送与接收 这是套接字的工 ...

  2. Python实现网络多人聊天室

    网络多人聊天室 文件结构: chatroom ├── client.py  # 客户端代码 ├── language.py  # 语言文件 ├── server.py  # 服务端代码 └── set ...

  3. 示例:Socket应用之简易聊天室

    在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...

  4. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

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

    最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...

  6. Python实现网络多人聊天室 - Windows

    项目名称:多人聊天室项目结构: client.py server.py settings.py项目思路:服务端接收客户端连接,客户端发送信息给服务端,服务端将信息发送给所有客户端.项目实现:主进程负责 ...

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

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决 ...

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

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端 ...

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

    最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo: demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消 ...

随机推荐

  1. Win10 上 安装Arduino 驱动 和 Arduino IDE 1.6.9

    Win10 安装Arduino IDE软件 和 驱动 在Win10 上安装最新的Arduino IDE (1.6.9安装包)很简单,并且不行要手动安装Arduino板子的驱动,整个安装过程都当前的简单 ...

  2. 《精通Spring4.X企业应用开发实战》读后感第六章(内部工作机制、BeanDefinition、InstantiationStrategy、BeanWrapper)

  3. Entity Framework Code-First(2):What is Code-First?

    What is Code-First?: Entity Framework introduced Code-First approach from Entity Framework 4.1. Code ...

  4. xsp4 命令行配置运行(CLI工具)

    xsp不必单独安装,它会在安装xamarin studio的时候出现在bin目录下,当然xsp是开源的地址:https://github.com/mono/xsp 常规使用方式如下: --root G ...

  5. Flask从入门到做出一个博客的大型教程(一)

    本项目全部在虚拟环境中运行,因此请参照前面的文章,链接为https://blog.csdn.net/u014793102/article/details/80302975 建立虚拟环境后,再接着完成本 ...

  6. JSONCPP开发环境搭建

    环境设置 项目地址 https://github.com/open-source-parsers/jsoncpp.git 操作系统 64位 Fedora 24 安装jsoncpp $ git clon ...

  7. OpenStack 负载均衡底层命令创建流程

    1.创建负载均衡器pool-------------不支持高可用的负载均衡器 neutron lb-pool-create --lb-method ROUND_ROBIN --name mypool- ...

  8. PHP现阶段发现的不足点

    1.php测试单元的实现(参考文档:https://blog.csdn.net/weixin_41282397/article/details/85052015)

  9. 清北刷题冲刺 11-02 p.m

    函数最值 #include<iostream> #include<cstdio> #include<cstring> #define maxn 100010 usi ...

  10. Centos下搭建nginx反向代理

    上一节已经用编译的方式搭建好了一个nginx,链接在下面 https://www.toutiao.com/i6693130510777975300/ 然后这次我们把上次搭建好的nginx作为反向代理的 ...