1. 创建一个Java项目 TestMyServerSocket.

2. 创建一个包 com.weloglog.main

3. 创建一些使用到的类

程序启动类 MyServerSccket : 用来启动程序, 启动之后创建一个进程, 用来监视本机当前端口

监视本机端口进程类 ServerListener : 用来监视本地端口, 当有连接本机端口时会生成一个聊天类 ChatSocket 并把这个聊天类添加到 聊天管理类(单例类)中 ChatManager

聊天类 ChatSocket : 用来发送消息给所以聊天窗口(除过自己)

聊天管理类 ChatManager : 用来收集管理所有聊天窗口

4. 以下为所有类代码:

MyServerSccket.java

  1. package com.weloglog.main;
  2.  
  3. public class MyServerSccket {
  4.  
  5. public static void main(String[] args) {
  6. new ServerListener().start();
  7. }
  8.  
  9. }

ServerListener.java

  1. package com.weloglog.main;
  2.  
  3. import java.io.IOException;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6.  
  7. import javax.swing.JOptionPane;
  8.  
  9. public class ServerListener extends Thread {
  10.  
  11. int port = 12345;
  12. @Override
  13. public void run() {
  14. try {
  15. //端口 : 1 - 65535
  16. ServerSocket serverSocket = new ServerSocket(port);
  17. while (true) {
  18. //阻塞的方法
  19. Socket socket = serverSocket.accept();
  20. //建立连接
  21. JOptionPane.showMessageDialog(null, "有客户端连接到本机12345端口");
  22. //将Socket传递给线程
  23. ChatSocket cs = new ChatSocket(socket);
  24. cs.start();
  25. ChatManager.getChatManager().add(cs);
  26. }
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

ChatSocket.java

  1. package com.weloglog.main;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStreamWriter;
  8. import java.io.UnsupportedEncodingException;
  9. import java.net.Socket;
  10.  
  11. public class ChatSocket extends Thread {
  12.  
  13. Socket socket;
  14.  
  15. public ChatSocket(Socket s){
  16. this.socket = s;
  17. }
  18.  
  19. //发送消息
  20. public void out(String out){
  21. try {
  22. socket.getOutputStream().write(out.getBytes("UTF-8"));
  23. System.out.println(out);
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28.  
  29. @Override
  30. public void run() {
  31. try {
  32. BufferedReader br = new BufferedReader(
  33. new InputStreamReader(
  34. socket.getInputStream(),"UTF-8"));
  35. String line = null;
  36. while((line = br.readLine()) != null){
  37. ChatManager.getChatManager().publish(this, line);
  38. }
  39. } catch (UnsupportedEncodingException e) {
  40. e.printStackTrace();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }

ChatManager.java

  1. package com.weloglog.main;
  2.  
  3. import java.util.Vector;
  4.  
  5. public class ChatManager {
  6. //单例类
  7. private ChatManager(){}
  8. private static final ChatManager cm = new ChatManager();
  9. public static ChatManager getChatManager(){
  10. return cm;
  11. }
  12.  
  13. //存放聊天进程的容器
  14. Vector<ChatSocket> vector = new Vector<ChatSocket>();
  15.  
  16. //添加
  17. public void add(ChatSocket cs){
  18. vector.add(cs);
  19. }
  20.  
  21. //遍历发送消息
  22. public void publish(ChatSocket cs, String out){
  23. for (int i = 0; i < vector.size(); i++) {
  24. ChatSocket csChatSocket = vector.get(i);
  25. //把不是自己输出
  26. if (!cs.equals(csChatSocket)) {
  27. csChatSocket.out(out);
  28. }
  29. }
  30. }
  31. }

Java 中使用serversocket通信的更多相关文章

  1. java中有关socket通信的学习笔记

    最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...

  2. Java中的socket通信

    socket又称套接字,应用程序通常通过"套接字"向网络发出请求或应答网络请求 建立过程:服务器监听-客户端发出请求-建立链接-通信 特点:1.基于tcp链接,数据传输有保障,2. ...

  3. Java中实现线程通信的三个方法的作用是什么?

    Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() ...

  4. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  5. HTTP协议报文、工作原理及Java中的HTTP通信技术详解

    一.web及网络基础       1.HTTP的历史            1.1.HTTP的概念:                 HTTP(Hyper Text Transfer Protocol ...

  6. Java并发基础--线程通信

    java中实现线程通信的四种方式 1.synchronized同步 多个线程之间可以借助synchronized关键字来进行间接通信,本质上是通过共享对象进行通信.如下: public class S ...

  7. 【转】Java学习:Java中的线程之线程间的通信

    hello各位小伙伴 今天我们来搞一下 线程之间的通信 ( • ̀ω•́ )✧ 让线程按照我们的想法来执行 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: ...

  8. Mac OS中Java Servlet与Http通信

    Java中一个Servlet其实就是一个类,用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序.Servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器 ...

  9. java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)

    CPU:10核 主频100MHz 1核  主频    3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...

随机推荐

  1. LeetCode 最长公共前缀(探索字节跳动)

    题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...

  2. 浅谈WebViewClient与WebChromeClient

    简介:WebViewClient被用来传递单纯的加载一个链接时所发生的事件,比如开始加载,结束加载等,它代表这个链接加载时的最普通的和最笼统的事件,WebChromeClient更多的是传递JS对话框 ...

  3. CNN基础框架简介

    卷积神经网络简介 卷积神经网络是多层感知机的变种,由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来.视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,我们称之为感受野 ...

  4. 在Ubuntu 16.04 LTS下编译安装OpenCV 4.1.1

    目录 一 安装前的准备 二 编译并安装OpenCV 4.1.1 注:原创不易,转载请务必注明原作者和出处,感谢支持! OpenCV目前(2019-8-1)的最新版本为4.1.1.本文将介绍如何在Ubu ...

  5. 【8583】ISO8583报文解析

    ISO8583报文(简称8583包)又称8583报文,是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分. [报文格式] POS终端上送POS中心的消息报文结构 ...

  6. js-xlsx

    XLSX.read(data, {type: type}); type主要取值如下: base64: 以base64方式读取: binary: BinaryString格式(byte n is dat ...

  7. java.lang.RuntimeException: org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。

    向一个XML文件写入出现异常 解决办法:使用记事本打开该XML文件,另存为,编码选择UTF-8 java.lang.RuntimeException: org.dom4j.DocumentExcept ...

  8. Oracle面试题

    0.绑定变量的优缺点及使用场合分别是什么? 优点:能够避免SQL的硬解析以及与之相关的额外开销(SQL语法.语义的分析.逻辑分析.生成较佳的执行计划等开销),提高执行效率. 缺点:如果在表存在数据倾斜 ...

  9. 转载:深入理解Spring MVC 思想

    原文作者:赵磊 原文地址:http://elf8848.iteye.com/blog/875830 目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.sp ...

  10. java中,有关移位运算符的有关讨论

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...