java socket编程--聊天小案例
很久以前写过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编程--聊天小案例的更多相关文章
- 如何为可扩展系统进行Java Socket编程
从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...
- java Socket多线程聊天程序
参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...
- Java Socket编程题库
一. 填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...
- Java Socket编程(转)
Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...
- Java基础:三步学会Java Socket编程
Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛 第一步 ...
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- 转:Java Socket编程
对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将 ...
- Java Socket编程基础篇
原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...
- Java Socket编程详细解说
Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是So ...
随机推荐
- 转转转!SpringMVC访问静态资源的三种方式
如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...
- python selenium 问题汇总
FAQ 1.python+selenium+Safari浏览器,定位元素 selenium.common.exceptions.ElementNotVisibleException: Message: ...
- Notepad++ 删除空白行的方法(转)
Notepad++ 是我特别喜欢的一款编程工具.在安装后就可以轻松使用了.Notepad++ 上提供了很多方便的插件以实现更多的扩展,当然自身已经比较强大好用了.如果你遇到文本中间有大量的空白行的话, ...
- numpy的flat、flatten、ravel
import numpy as np dt = np.arange(10).reshape(5,2) # =============================================== ...
- HTC Vive前置摄像头API(未测试)
/*WebCamTexture:网络摄像头材质 WebCamTexture.Play() 播放: WebCamTexture.Pause() 暂停: WebCamTexture.Stop() 停止:* ...
- Spark数据本地性
1.文件系统本地性 第一次运行时数据不在内存中,需要从HDFS上取,任务最好运行在数据所在的节点上: 2.内存本地性 第二次运行,数据已经在内存中,所有任务最好运行在该数据所在内存的节点上: 3.LR ...
- 编译器错误消息: CS0016: 未能写入输出文件“c:/Windows/Microsoft.NET/Framework/v4.0.50727/Temporary ASP.NET Files/root .... 拒绝访问。
此问题困扰良久,得终极解决方案 环境:windows 2008 server r2 + iis7 + .net framework4.5 解决:1. 错误信息中包含的目录“c:/Windows/Mic ...
- TCP/IP协议和IP
理解 使用网络能够把多方链接在一起,然后可以进行数据传递 所谓的网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信 tcp/ip简介 1. 什么是协议 有的说英语,有的说中文,有的 ...
- 19.XPath选择器
1.extract():提取数据 2./text() :获取节点内容文本 3./@href :获取节点href属性 4. @ :获取属性名称 需要注意问题: 用定义的规则那 ...
- THREE.JS 场景世界坐标和平面二维坐标互转
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...