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 ...
随机推荐
- Neutron 理解 (2): 使用 Open vSwitch + VLAN 组网 [Neutron Open vSwitch + VLAN Virtual Network]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- shell 11函数
函数定义 function 方法名(){ command return int; } 注意:function可加可不加 #shell #!/bin/sh function fun1(){ echo & ...
- 大家都对vertical-align的各说各话
原文地址:http://www.blueidea.com/tech/web/2008/5892.asp 最近几天仔细研究了一下vertical-align这个属性,结果让我大吃一惊,这个很“资深”的C ...
- Linux rpc 编程最简单实例
通过rpcgen的man手册看到此工具的作用是把RPC源程序编译成C语言源程序,从而轻松实现远程过程调用.1.下面的例子程序的作用是客户端程序(fedora Linux下)取中心服务器也是Linux上 ...
- [UE4]角色增加挂点、增加枪
人物骨骼增加Socket(骨骼) 增加手持武器预览: 角色蓝图增加组件“Skeletal Mesh”(好像这叫骨骼模型吧),并拖放至人物“Mesh”下面作为子组件. 选中刚建好的“SkeletalMe ...
- 运行quectel EC20 module example data
environment setting are as below: 1. ubuntu 14.04, linux kernel 4.4,OpenLinux(QuecLinux) 2. module: ...
- Windows10右键添加“在此处打开命令窗口"
今天跑代码时用到了Powershell,有一个环境变量死活都找不到,无奈只好重新回到cmd命令行测试,结果立马就跑通了.-_-|| 由于现在Win10默认右键只有Powershell,所以为了以后方 ...
- python-pycharm中使用anaconda部署python环境
pycharm中使用anaconda部署python环境 今天来说一下python中一个管理包很好用的工具anaconda,可以轻松实现python中各种包的管理.相信大家都会有这种体验,在pycha ...
- ansible的安装与使用
ansible的特点: 1. 基于ssh运行 2. 无需客户端 安装ansible 这里提供四种安装方式,根据自己的需要任选一种即可 1.1使用yum安装 yum install epel-relea ...
- 5. window.location.href/replace/reload()--页面跳转+替换+刷新
1.window.location=url; window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面. 一.最外层top跳转页面,适合用于iframe框架集 ...