1. 创建一个Java项目 TestMyServerSocket.

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

3. 创建一些使用到的类

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

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

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

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

4. 以下为所有类代码:

MyServerSccket.java

package com.weloglog.main;

public class MyServerSccket {

    public static void main(String[] args) {
new ServerListener().start();
} }

ServerListener.java

package com.weloglog.main;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; import javax.swing.JOptionPane; public class ServerListener extends Thread { int port = 12345;
@Override
public void run() {
try {
//端口 : 1 - 65535
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
//阻塞的方法
Socket socket = serverSocket.accept();
//建立连接
JOptionPane.showMessageDialog(null, "有客户端连接到本机12345端口");
//将Socket传递给线程
ChatSocket cs = new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

ChatSocket.java

package com.weloglog.main;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket; public class ChatSocket extends Thread { Socket socket; public ChatSocket(Socket s){
this.socket = s;
} //发送消息
public void out(String out){
try {
socket.getOutputStream().write(out.getBytes("UTF-8"));
System.out.println(out);
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void run() {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(
socket.getInputStream(),"UTF-8"));
String line = null;
while((line = br.readLine()) != null){
ChatManager.getChatManager().publish(this, line);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

ChatManager.java

package com.weloglog.main;

import java.util.Vector;

public class ChatManager {
//单例类
private ChatManager(){}
private static final ChatManager cm = new ChatManager();
public static ChatManager getChatManager(){
return cm;
} //存放聊天进程的容器
Vector<ChatSocket> vector = new Vector<ChatSocket>(); //添加
public void add(ChatSocket cs){
vector.add(cs);
} //遍历发送消息
public void publish(ChatSocket cs, String out){
for (int i = 0; i < vector.size(); i++) {
ChatSocket csChatSocket = vector.get(i);
//把不是自己输出
if (!cs.equals(csChatSocket)) {
csChatSocket.out(out);
}
}
}
}

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. 2018-2019-2 20175226王鹏雲 实验四《Android程序设计》实验报告

    2018-2019-2 20175226王鹏雲 实验四<Android程序设计>实验报告 实验报告封面 课程:Java程序设计 班级:1752班 姓名:王鹏雲 学号:20175226 指导 ...

  2. XGBoost原理简介

    XGBoost是GBDT的改进和重要实现,主要在于: 提出稀疏感知(sparsity-aware)算法. 加权分位数快速近似学习算法. 缓存访问模式,数据压缩和分片上的实现上的改进. 加入了Shrin ...

  3. ArcGIS Python获得一个图层所有线长

    import arcpy # Create an empty Geometry object # g = arcpy.Geometry() # Run the CopyFeatures tool, s ...

  4. 优化webpack打包速度方案

    基本原理要么不进行打包:要么缓存文件,不进行打包:要么加快打包速度. 不进行打包方案: 1,能够用CDN处理的用CDN处理,比如项目引入的第三方依赖jquery.js,百度编辑器 先进行打包或者缓存然 ...

  5. React Native 日常报错

    在学习React.js 或 React Native 过程中,有时看着别人的框架或代码,但总是会出现错误,因为React或之中用到的一些包经常更新,有些代码或教程就显得过旧了. 一.日常报错 'con ...

  6. 转 CentOS 7 环境下安装Maven

    下载安装文件 wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3 ...

  7. 运行python程序不显示cmd方法

    运行python程序不显示cmd方法 Pythonw xxx.py 将*.py改成*.pyw,然后执行*.pyw Python.exe和pythonw.exe不同: 执行时没有控制台窗口 所有向原有的 ...

  8. Spring源码整理

    转载:https://www.cnblogs.com/ITtangtang/p/3978349.html  感谢博主

  9. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  10. 【并行计算-CUDA开发】CUDA ---- Warp解析

    Warp 逻辑上,所有thread是并行的,但是,从硬件的角度来说,实际上并不是所有的thread能够在同一时刻执行,接下来我们将解释有关warp的一些本质. Warps and Thread Blo ...