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);
}
}
}
}

最新文章

  1. Vertical Menu ver4
  2. 响应性web设计实战总结
  3. ThinkPHP随笔
  4. [LintCode] Paint House 粉刷房子
  5. 定时同步时间与crontab
  6. hdu 3572 Task Schedule
  7. Cannot initialise keyboard run ./nano-X
  8. Linux下配置VNC
  9. px/em/pt区别和转换
  10. DOS批处理命令递归删除给定的文件(夹),兼VC工程清理小工具
  11. PHP与XML技术
  12. javascript的键盘事件大全
  13. 学习string,stringBuffer时遇到的问题
  14. 流式大数据计算实践(3)----高可用的Hadoop集群
  15. python学习:条件语句if、else
  16. Thinking in Java from Chapter 10
  17. redhat7.4 使用centos yum源
  18. MySQL数据库----数据操作
  19. JAVA计算文件的crc32校验码
  20. 六,mysql优化——小知识点

热门文章

  1. gradle添加阿里云maven库
  2. 来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的
  3. JAVA单元测试的用法和要点
  4. kotlin if
  5. AB窗体互传参数本质
  6. matlab将字符串转化为变量的方法
  7. C语言处理CSV数据
  8. 提高 python 效率的一些细节方式
  9. Microsoft 防跨站点脚本库AntiXSS Library
  10. .NET开发辅助工具-ANTS Performance Profiler【转载】