很久以前写过socket聊天室,都快忘完了,心血来潮又重新写一遍。

服务器端:

package com.fancy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map; public class Server {
private int port;
private ServerSocket server;
private Map<String,PrintWriter> clients = new HashMap(); public Server() throws IOException {
port = 10025;
server = new ServerSocket(port);
System.out.println("成功创建服务器端!");
startReceive();
} public void startReceive() throws IOException{
while(true){
Socket socket = server.accept();
//InetAddress address = socket.getInetAddress();
ClientHandler handler = new ClientHandler(socket);
new Thread(handler).start();
}
}
public void sendMsg(String from,String str) throws IOException {
for(String k:clients.keySet()){
if(k.equals(from)){
continue;
}
PrintWriter pw = clients.get(k);
pw.println(str);
pw.flush();
}
}
class ClientHandler implements Runnable{
private String nickname;
private Socket socket;
private PrintWriter pw;
public ClientHandler(Socket socket){
this.socket = socket;
}
@Override
public void run() {
BufferedReader br = null;
try {
InputStream in = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(in));
OutputStream out = socket.getOutputStream();
pw = new PrintWriter(out,true);
String name = br.readLine();
this.nickname = name;
if(!clients.containsKey(name)){
clients.put(name, pw);
pw.println("欢迎新朋友:"+name+",当前在线人数:"+clients.size());
}
String str;
while((str = br.readLine())!=null){
if("exit".equalsIgnoreCase(str.trim())){
clients.remove(this.nickname);
this.socket.close();
sendMsg("all", this.nickname+"下线了,当前在线人数:"+clients.size());
}else{
sendMsg(name,name+":"+str);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
br.close();
} catch (IOException e) {
}
}
}
} public static void main(String[] args) {
try {
Server s = new Server();
} catch (IOException e) {
e.printStackTrace();
}
}
}

客户端:

package com.fancy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; public class Client {
private Socket socket;
private boolean online = true;
public Client() throws UnknownHostException, IOException {
socket = new Socket("127.0.0.1", 10025);
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
Scanner scan = new Scanner(System.in);
String word;
ServerHandler hander = new ServerHandler();
new Thread(hander).start();
System.out.println("请输入您的昵称:");
word = scan.nextLine();
pw.println(word);
pw.flush();
while((word=scan.nextLine())!=null){
pw.println(word);
pw.flush();
if("exit".equalsIgnoreCase(word)){
online = false;
break;
}
}
}
class ServerHandler implements Runnable{ @Override
public void run() {
while(online){
InputStream in;
try {
in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String back = br.readLine();
System.out.println(back);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
try {
Client c = new Client();
System.out.println("started!");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}

  运行一次server,多次client的结果如下:

  

java socket编程--聊天小案例的更多相关文章

  1. 如何为可扩展系统进行Java Socket编程

    从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...

  2. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  3. Java Socket编程题库

    一.    填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...

  4. Java Socket编程(转)

    Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...

  5. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

  6. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  7. 转:Java Socket编程

    对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将 ...

  8. Java Socket编程基础篇

    原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...

  9. Java Socket编程详细解说

    Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是So ...

随机推荐

  1. Hadoop高级培训课程大纲-管理员版

    一.课程概述 本次培训课程主要面向大数据系统管理人员和开发设计人员,基于开源社区大数据应用最活跃的Hadoop和HBase技术框架.围绕分布式文件存储(HDFS).分布式并行计算(Map/Recue) ...

  2. 【Spring实战-2】Spring4.0.4整合Hibernate4.3.6

    作者:ssslinppp      源程序下载:http://download.csdn.net/detail/ssslinppp/8751185  1. 摘要 本文主要讲解如何在Spring4.0. ...

  3. Bezier画线算法

    编译器:VS2013 描述:Bezier画线是利用导数相同拼接曲线,使曲线十分光滑,而不是随意拼接观赏性很差 主函数段 #include "stdafx.h" #include&l ...

  4. charles只获取指定的请求的设置方法

    过滤网络请求 通常情况下,需要对网络请求进行过滤,只监控指定服务器的请求.有3种办法: 方法一:在主界面的中部的 Filter 栏中输入需要过滤出来的关键字.例如我们的服务器的地址(host)是:ww ...

  5. Nginx Tengine ngx_http_upstream_check_module 健康功能检测使用

    该模块可以为Tengine提供主动式后端服务器健康检查的功能. 该模块在Tengine-1.4.0版本以前没有默认开启,它可以在配置编译选项的时候开启:./configure --with-http_ ...

  6. CA单向认证和双向认证的区别?

    1:单向认证,内容会被串改吗?

  7. 第13章 TCP编程(3)_基于自定义协议的多进程模型

    5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 ];//TLV中的T unsigned i ...

  8. [ffmpeg_3.3.2]demuxing_decoding.c

    分析ffmpeg3.3.2的example: 由于ffmpeg文档比较少,而且API变化表较大,所以个人首先从ffmpeg自带的demo开始分析,分析(demuxing_decoding.c) 1:首 ...

  9. 了解java的类加载器

    1.java运行之前,编译后的class文件需要加载到虚拟机内存,这必须用到class的加载器来加载,所以有必要了解加载器原理. 2.加载器采用父类委派机制加载,这样的目的是保证基础类仅仅加载一次(比 ...

  10. 使用SolrNet访问Solr-5.5.0

    由于今年年初刚发布的Solr-5.5.0,网上所能找到的资料少之又少,所以只能靠自己一点点摸索. 从某Hub上下载了SolrNet源码,按照教程提交文档或者查询均失败,无奈只得跟断点一点点差怎么回事. ...