一:服务端:

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

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. unreal3启动流程总结

    一.启动代码所在工程为Launch(win32),可为所有同一codebase项目共享. 但共享方式很不智能,是通过在源文件中添加大量#if/else条件编译宏来实现,即各项目在自己的工程中添加[程序 ...

  2. URAL 1297 Palindrome (后缀数组+RMQ)

    题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个. 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, ...

  3. HN669打包工具--打包工具使用文档

    打包工具主要包含下载更新资源文件以及打包两个部分 一.下载更新资源文件 1.终端进入工具根目录,即HN669SDK_iOS目录,并运行./api.sh脚本 2.输入游戏id (note:此游戏id为我 ...

  4. 关于js模板引擎template的使用记录

    引言 有一天在群里有一个人发了这么一个图片 看到这个就会发现2个问题,一个是后期如果html结构改变了,这一大块都要重写.还有一个就是写的时候自己都看不清,很容易出错. 然后还有一个人写的清楚一点,但 ...

  5. VS插件开发(生成实体类)

    写了N年的代码,回头过来看,其中有80%代码都是重复的代码,深入研究VS插件开发,应用到工作中,让自己减少基础的代码开发,增加开发效率 1.新增解决方案: Extensiblity->VSIX ...

  6. 程序员笔记|常见的Spring异常分析及处理

    一.前言 相信我们每个人在SpringMVC开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如json或xml形式,但是一旦出现了异常(比如:NPE或者数组越界等等),返 ...

  7. 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  8. [Xcode 实际操作]五、使用表格-(5)设置UITableView的单元格背景颜色

    目录:[Swift]Xcode实际操作 本文将演示单元格背景颜色的设置 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添加两个协 ...

  9. MySQL常用配置和性能压力测试:MySQL系列之十五

    一.MySQL常用配置 以下所有配置参数以32G内存的服务器为基 1.打开独立的表空间 innodb_file_per_table = 1 2.MySQL服务所允许的同时会话数的上限,默认为151,经 ...

  10. CDN-内容发布网络

    整理<CDN技术详解>一书中重要的内容. 互联网与万维网 广义的互联网,由两层组成:一层是以TCP/IP为代表的网络层:另一层是以万维网WWW为代表的应用层.辨识互联网和万维网的区别,是认 ...