使用ServerSocket建立聊天服务器(一)
-------------siwuxie095
工程名:TestMyServerSocket
包名:com.siwuxie095.socket
类名:MyServerSocket.java(主类)、ServerListener.java、ChatSocket.java
工程结构目录如下:
MyServerSocket.java(主类):
package com.siwuxie095.socket; /** * 聊天服务器,仅能向客户端发送数据 * * @author siwux * */ public class MyServerSocket {
/** * 这是主类(主线程),启动线程ServerListener进行监听, * 当有Socket对象进行连接时,在线程ServerListener中 * 启动线程ChatSocket * * @param args */ public static
//运行线程ServerListener,使用匿名对象 new ServerListener().start(); } } |
ServerListener.java:
package com.siwuxie095.socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JOptionPane; //创建线程 ServerListener,将有阻塞的代码放到这个独立的线程中 public class ServerListener extends Thread { // 复写run() @Override public try { // 端口的范围:1~65535,通常都指定较大的数字, // 这样和较小的或系统预留的端口分开 // 有异常抛出,用 try catch 捕获 ServerSocket serverSocket = new ServerSocket(12345);
// ServerSocket创建完成后需要侦听客户端的连接 // 调用accept()方法,这是一个阻塞的方法, // 会阻塞当前的线程,对于有阻塞的代码,应该放到独立的线程中 //(ServerListener 就是一个独立的线程) // 返回值是Socket类型,创建以接收返回值 // 当accept()被执行且socket被赋值,说明有客户端连接 //每当有一个客户端连接到ServerSocket,accept()都会返回一个新的Socket对象 //如果有多个客户端来连接当前的服务器ServerSocket,就会有多个Socket对象出现 //需要一个while循环来循环监听 while (true) {
Socket socket = serverSocket.accept(); // 建立连接时 // 弹出提示框:有客户端连接到本机的 12345 端口 JOptionPane.showMessageDialog(null, "有客户端连接到本机的 12345 端口");
//由于每一个socket要与一个独立的客户端进行通信 //所以要将socket传递给新的线程:ChatSocket(用于Socket通信) //每一个socket都有一个独立的ChatSocket线程 //每一个ChatSocket线程之间是相互独立的,它们不能相互沟通数据 //运行该线程,使用匿名对象 new ChatSocket(socket).start();
}
} catch (IOException e) { e.printStackTrace(); } } } |
ChatSocket.java:
package com.siwuxie095.socket; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.Socket; /** * 代码段(4)一直包装到带缓冲的字符流,输出时需要flush进行强制输出 * 代码段(3)是简单的字节流进行输出 * * (4)等效于(3)等效于(1)加(2) * * (4)=(3)=(1)+(2) * * 主要使用(4),其他注释起来 * * @author siwux * */ //创建用于Socket通信的线程:ChatSocket public class ChatSocket extends Thread {
Socket socket;
//创建构造方法,传入Socket对象 public ChatSocket(Socket socket) { this.socket=socket; }
//(1) public try { //socket.getOutputStream() 即 OutputStream //实际上是 OutputStream.write() 即 os.write() //为 getBytes()指定编码 //有异常抛出,用 try catch 捕获 socket.getOutputStream().write(out.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
//复写run()方法 @Override public
// //(2) // int count=0; // while (true) { // output("loop:"+count+"-"); // count++; // try { // sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // }
// //(3) // try { // OutputStream os=socket.getOutputStream(); // int count=0; // while (true) { // String outString="loop:"+count+"-"; // byte outByte[]=outString.getBytes("UTF-8"); // os.write(outByte); // count++; // sleep(1000); // // } // // } catch (IOException e) { // e.printStackTrace(); // } catch (InterruptedException e) { // e.printStackTrace(); // }
//(4) try {
//对当前的Socket执行 //使用getOutputStream()获取输出流,通过输出流向外输出数据 //返回值是OutputStream类型,创建以接收返回值 OutputStream os=socket.getOutputStream();
//创建一个BufferedWriter作为数据的输出,传入匿名对象,指定编码,层层包装 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
//通过BufferedWriter可以在Socket中直接输出一行字符串 int count=0; //一直循环 while (true) {
//让BufferedWriter输出字符串 bw.write("loop:"+count+"-"); //因为带缓冲,所以需要强制输出,不然无法输出 bw.flush(); //1秒执行一次 //有异常抛出,用 try catch 捕获 sleep(1000); count++;
}
} catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }
} } |
运行后,终止按钮(Terminate)长亮,即 当前程序正在运行 且 没有停止
而且,此时也没有任何提示框,即当前程序被阻塞在
ServerListener.java 的:
Socket socket=serverSocket.accept();
打开
CMD 窗口,输入:telnet 127.0.0.1 12345
或
telnet localhost 12345
(即
本机地址+端口),回车。此时,会弹框提示:
点击确定,CMD 窗口开始无限循环输出:
此时程序并未停止,可以继续打开多个
CMD 窗口进行连接,
相当于新建客户端,也是从一开始进行输出
点击
终止按钮(Terminate),可结束运行
【made by siwuxie095】
使用ServerSocket建立聊天服务器(一)的更多相关文章
- Socket 基础解析使用ServerSocket建立聊天服务器
很简单的教程哦! 1.socket 简介 Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.ServerSocket 用于 ...
- 使用 ServerSocket 建立聊天服务器-1
1.代码目录 2.ChatSocket.java --------------------------------------------------------------------------- ...
- 使用ServerSocket建立聊天服务器(二)
-------------siwuxie095 工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:M ...
- 使用 ServerSocket 建立聊天服务器-2
1. 从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新 ...
- 使用Java建立聊天客户端
---------------siwuxie095 关于 聊天服务器,详见本人博客的分类:来一杯Java, 里面的 使用ServerSocket ...
- [CareerCup] 8.7 Chat Server 聊天服务器
8.7 Explain how you would design a chat server. In particular, provide details about the various bac ...
- openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150 评论- ...
- 使用rabbitmq实现集群im聊天服务器消息的路由
这个地址图文会更清晰:https://www.jianshu.com/p/537e87c64ac7 单机系统的时候,客户端和连接都有同一台服务器管理. image.png 在本地维护一份userI ...
随机推荐
- web测试中的测试点和测试方法总结
测试是一种思维,包括情感思维和智力思维,情感思维主要体现在一句俗语:思想决定行动上(要怀疑一切),智力思维主要体现在测试用例的设计上.具有了这样的思想,就会找出更多的bug. 一.输入框 1.字符 ...
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP
自己写了一个爬虫爬取豆瓣小说,后来为了应对请求不到数据,增加了请求的头部信息headers,为了应对豆瓣服务器的反爬虫机制:防止请求频率过快而造成“403 forbidden”,乃至封禁本机ip的情况 ...
- LSTM与Highway-LSTM算法实现的研究概述
LSTM与Highway-LSTM算法实现的研究概述 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2015-12-22 ...
- html5 video 监听播放结束. 最好获取html标签而不是id。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 源码编译安装mysql5.6
1.download the source package and unzip to the destination dir http://mirror.switch.ch/mirror/mysql/ ...
- 201621123014《Java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...
- PKUSC2018 Slay The Spire
有攻击牌和强化牌各 $n$ 张,强化牌可以让之后所有攻击牌攻击力乘一个大于 $1$ 的系数,攻击牌可以造成伤害 求所有“抽出 $m$ 张然后打 $k$ 张”能造成的伤害之和 $k,m,2n \leq ...
- Azure上采用Powershell从已有的VHD创建VM
刚刚的一篇Blog采用Json Template的方式从已有的VHD创建了一台新的VM.由于Json Template封装的比较好,可以改的内容不多. 下面将介绍通过用Powershell来从已有的V ...
- Linux内核 - 定时器
#include <linux/timer.h> //头文件 struct timer_list mytimer; //定义变量 static void my_timer(unsigned ...
- 转:MySQL InnoDB Add Index实现调研
MySQL InnoDB Add Index实现调研 MySQL Add Index实现 MySQL各版本,对于add Index的处理方式是不同的,主要有三种: Copy Table方式 这是Inn ...