javasocket编程--聊天小案例

     2022-03-18     746

关键词:

  很久以前写过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();
        }
    }
}
View Code

客户端:

技术分享
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();
        }
        
    }
}
View Code

 

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

  技术分享

 

javasocket编程实现群聊(超详细)(代码片段)

Javasocket编程实现群聊最终效果文末有完整代码,创作不易,点个赞再走吧~客户端之间的交流有人退出群聊时,减少在线人数实现流程1、项目结构即原理分析功能实现多客户之间聊天实时统计在线人数图形化界面创建... 查看详情

javasocket实现简单在线聊天

出处:http://blog.csdn.net/tuzongxun最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下。 我计划的大致实现步骤分这样几大步:1、使用awt组件和socket实现简单的单客户端向... 查看详情

javasocket+多线程实现控制台聊天室

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html  聊天室程序的结构图: 架构解释:  Server服务器相当于一个中转站,Client客户端程序传送信息到服务器,服务器再把信息分发到其他客户端上,实现即... 查看详情

字节码学院之javasocket控制台聊天室(代码片段)

学了个把月基础,终于写出了一个双工通信的控制台版本的聊天室了,废话不说啦,直接上代码:服务端代码packagecom.zijiemaedu.socketdemo;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.Scanner;/***@author:Mr-zhang*@create: 查看详情

java网络编程案例---聊天室

  网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。  java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注... 查看详情

javasocket编程

申明:本文摘自:http://www.cnblogs.com/rocomp/p/4790340.htmlJava最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用... 查看详情

javasocket编程学习笔记

 1.Socket通信简介及模型  JavaSocket可实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。2.Socket通信实现方法 2.1 服务器端(非多线程)   用... 查看详情

javasocket编程学习笔记

在上一篇中,使用了javaSocket+Tcp/IP 协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用UDP协议来实现Socket的通信。1.关于UDP  UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快,进行... 查看详情

javasocket编程

一、网络编程概述网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不... 查看详情

javasocket编程简介

#JavaTCPIp编程 其实下面几张图片就可以解释简单解释tcp-ip协议的大体流程了。###计算机网络,分组报文和协议网络是一组通过通信信道相互连接的机器组成。组与组之间通过路由器连接数据通过分组报文传递协议,传输报文... 查看详情

javasocket编程api基础

 Socket是Java网络编程的基础,深入学习socket对于了解tcp/ip网络通信协议很有帮助,  此文讲解Socket的基础编程。Socket用在哪里:①、主要用在进程间,②、网络间通信。文章目录如下:一、Socket通信基本示例二、消息通信优... 查看详情

javasocket编程(li)

一、网络编程中两个主要的问题  一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定In... 查看详情

javasocket网络编程常见异常(转)

转:https://www.cnblogs.com/qq78292959/p/5085559.html 1.java.net.SocketTimeoutException  这个异常比较常见,socket超时。一般有2个地方会抛出这个:    a.一个是connect的时候,这个超时参数由connect(SocketAddressendpoint,inttimeout)中的后者来... 查看详情

javasocket编程以及与linuxsocketapi关系

Socket编程(基于Linux)Socket独立于具体协议的网络编程接口,在ISO模型中,主要位于会话层和传输层之间;在通用的计算机网络五层模型中,主要位于应用层和传输层之间。LinuxSocket基本上就是BSDSocket需要使用的头文件数据类型:#in... 查看详情

javasocket编程----通信是这样炼成的

http://www.cnblogs.com/rocomp/p/4790340.htmlJava最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术... 查看详情

javasocket编程(代码片段)

Socket概念tcp协议全称是TransmissionControlProtocol,传输控制协议,是以字节流的方式发送数据的协议。ip全称为InternetProtocol互联网协议,tcp/ip协议在四层模型中的传输层。http、ftp、telnet(ssh)远程登录服务为应用层协议࿰... 查看详情

javasocket聊天系统错误,求解啊,谢谢各位啦!!!!!

java.net.SocketException:selectfailed atjava.net.PlainSocketImpl.socketAccept(NativeMethod) atjava.net.PlainSocketImpl.accept(UnknownSource) atjava.net.ServerSocket.implAccept(UnknownSource) atjava.net.ServerSocket.accept(UnknownSource) atTankServer.start(TankServer.java:18) atTankServer.main(TankSe... 查看详情

2018-07-22期java死锁小案例编程

1、死锁案例publicclassDeadLock{ finalObjectlockA=newObject(); publicstaticvoidmain(String[]args){ DeadLockdemo=newDeadLock(); demo.startLock(); } publicvoidstartLock(){ ThreadAa=newThreadA(lockA,lockB); 查看详情