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的结果如下:

  

时间: 2024-10-26 07:04:59

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

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

从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket和Windows WinSock代码.我的任务是确保视频游戏客户端和一个游戏服务器通信.很幸运有这样的机会写一些Java Socket代码,我对Java流式网络编程和简洁明了的API着迷.这一点都不让人惊讶,Java最初就是设计促进智能设备之间的通信,这一点很好的转移到了桌面应用和服务器应用. 19

Java Socket编程

对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信.这样就有两个Socket了,客户端和服务端各一个. 客户端写服务端读 服务端代码 public class Server { public s

Java Socket编程readLine返回null,read返回-1的条件

客户端正常关闭socket的时候,服务器端的readLine()方法会返回null,或者read()方法会返回-1 Java Socket编程readLine返回null,read返回-1的条件,布布扣,bubuko.com

【转】Java Socket编程

原文地址:Java Socket编程 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信.这样就有两个Socket了,客户端和服务端各一个. 对于Socket之间的通

【Java】Java Socket编程(1)基本的术语和概念

计算机程序能够相互联网,相互通讯,这使一切都成为可能,这也是当今互联网存在的基础.那么程序是如何通过网络相互通信的呢?这就是我记录这系列的笔记的原因.Java语言从一开始就是为了互联网而设计的,它为实现程序的相互通信提供了许多有用API,这类应用编程接口被称为套接字(Socket).在开始学习Java Socket之前我们需要先来了解一下基本的术语和概念. 1.计算机网络 计算机网络由一组通过通信信道(Communication channel)相互连接的机器组成.这些机器被称为:主机(host

Java Socket编程详细解说

Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信.这样就有两个Socket了,客户

Python Socket 编程——聊天室示例程序

原文:Python Socket 编程--聊天室示例程序 上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 图来自:http://www.ibm.com/de

Java Socket编程基础篇

原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术.下面就让我们一起揭开Socket的神秘面纱. Socket编程 网络基础知识点: 两台计算机间进行通讯需要以下三个条件 IP地址.协议.端口号: IP地址:定位应用所在机器的网络位置.(比如家庭住址:北京市朝阳区XX街道XX小区) 端口号

20182332 实验四《Java Socket编程 》实验报告

20182332 实验肆<数据结构与面向对象程序设计>实验报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 盛国榕 学号:20182332 实验教师:王志强 实验日期:2019年9月30日 必修/选修: 必修 1.实验内容 (一)Java Socket编程 1.学习蓝墨云上教材<Java和Android编程>"第16章 输入/输出 "和"第22章 网络",学习JavaSocket编程 2.结对编程.结对伙伴A编写客户端