很久以前写过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. 驳《编码规范是技术上的遮羞布》自由发挥==摆脱编码规范?X

    引子: 看了一坨文字<编码规范是技术上的遮羞布>,很是上火,见人见智,本是无可厚非,却深感误人子弟者众.原文观点做一个简单的提炼: 1.扔掉编码规范吧,让程序员自由发挥,你会得到更多的好处 ...

  2. jquery粘贴操作

    今天忘记记录一个点了,关于input字体默认浅色,聚焦变深的问题. 图一,默认浅色 图二,聚焦出现下拉框“最近搜索”记录,点击“程序员” 图三,input值变为“程序员”,颜色没有变深(复制粘贴也不变 ...

  3. [UE4]角色、动画蓝图、动画蒙太奇、动画之间的调用关系

    一.在“角色”中设置要使用的“动画蓝图” 二.在“动画蓝图”中使用“动画”和“混合动画” 三.在“混合动画”中,也可以使用“动画” 四.在角色中使用“动画蒙太奇”

  4. C#后台调用前台javascript的五种方法小结

    第一种,OnClientClick (vs2003不支持这个方法) <asp:Button ID="Button1" runat="server" Tex ...

  5. xgCalendar在ASP.NET中的使用

    1.将wdCalendar文件夹考入项目中 2.在页面中添加引用,见3中head标签中定义 3.配置xgCalendar,两段代码放在一起就是完整的页面 body> <div> &l ...

  6. 第11课 enum、sizeof、typedef 分析

    1. enum枚举类型 1.1 使用方法 (1)enum是C语言中的一种自定义类型 (2)enum值是可以根据需要自定义的的整型值 (3)第一个定义的enum值默认为0. (4)默认情况下的enum值 ...

  7. 【C++11新特性】 - 空间配置allocator类

    原文链接: http://blog.csdn.net/Xiejingfa/article/details/50955295 今天我们来讲讲C++的allocator类. C++提供了new和delet ...

  8. 【Unix网络编程】chapter3 套接字编程简介

    chapter3套接字编程简介3.1 概述 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换.多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数, ...

  9. css border

    CSS border用于设置HTML元素(如div)的边框,包括边框的宽度.颜色和样式.本文章向码农介绍CSS border边框属性详细内容,感兴趣的码农可以参考一下. CSS 边框即CSS bord ...

  10. hbase建表时 ERROR: java.io.IOException: Table Namespace Manager not ready yet, try again later

    其实解决不难,是因为时钟不同步,把每个节点切换到root用户下同步时钟就好了,在重启hbase!