使用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
void main(String[] args) {

//运行线程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
void run() {

try {

// 创建一个ServerSocket对象,并指定端口:12345

// 端口的范围: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
void output(String out) {

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
void run() {

// //(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】

时间: 2024-12-19 05:39:56

使用ServerSocket建立聊天服务器(一)的相关文章

使用ServerSocket建立聊天服务器(二)

-------------siwuxie095 工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:MyServerSocket.java(主类).ServerListener.java.ChatSocket.java.ChatManager.java 工程结构目录如下: MyServerSocket.java(主类): package com.siwuxie095.socket; /** * 聊天服务器,不仅能向客户端发送数据,也能从客户端读取

使用GoWorld游戏服务器引擎轻松实现分布式聊天服务器

GoWorld游戏服务器引擎简介 GoWorld是一款开源的分布式可扩展的游戏服务器引擎,使用Go语言(Golang)编写.它采用类似BigWorld的结构,使用了简化的场景-对象框架.以一个典型的MMORPG为例,每个服务器上会有多个场景,每个场景里可以包含多个对象,这些对象包括玩家.NPC.怪物等.GoWorld服务器可以将场景分配到在不同的进程甚至不同的机器上,从而使得游戏服务器的负载是可扩展的. 开源分布式游戏服务器引擎:https://github.com/xiaonanln/gowo

通过python 构建一个简单的聊天服务器

构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使用 Telnet,客户机可以连接到 Python 聊天服务器上,并在全球范围内相互进行通信.提交到聊天服务器的消息可以由其他人进行查看(以及一些管理信息,例如客户机加入或离开聊天服务器).这个模型如图 1 所示. 图 1. 聊天服务器使用 select 方法来支持任意多个客户机 聊天服务器的一个重要

本地建立SVN服务器

想在自己电脑上搭建SVN服务器,于是有以下步骤. 首先明确SVN服务包括服务器和客户端,平时听到的TortoiseSVN就是一个客户端. 首先下载两个软件,服务器端我使用的是VisualSVN,版本是VisualSVN-Server-2.7.7.msi,客户端是TortoiseSVN,版本是npp.6.6.8.Installer.1406601028.exe 安装完两个软件. 打开VisualSVN,如图所示: 建立一个版本库,操作过程如图所示: 这里没有选择上面空的版本库,也是为了简便,下次实

建立ftp服务器

使用serv-u(11以上版本)建立ftp服务器,以URL:ftp://ftp.ganenX.cn/发布. 1:安装serv-u 2:在serv-u中新建用户 登录id为ftp.ganen4.cn 根目录为自己制定的目录如D://ganen4 创建成功 3:在DNS中新建区域 区域名为ganen4.cn 在区域中新建主机主机名为ftp 在internet浏览器中输入ftp://ftp.ganenX.cn/登录成功 建立ftp服务器,布布扣,bubuko.com

定制的Server-Sent Events 聊天服务器

1 //匿名聊天服务器 2 //将新的消息POST到/chat地址,或者以GET形式从通一个URL获取文本或事件流 3 //创建一个GET请求到"/"来返回一个简单的HTML文件,这个文件包括客户端聊天UI 4 5 var http = require('http'); 6 7 //聊天客户端使用的HTML文件 8 var clientUI = require('fs').readFileSync("chatClient.html"); 9 var emulatio

虚拟机centos上建立svn服务器

其实网络上有不少人都分享过用linux建立svn服务器的过程,但是实际自己操作起来还是困难重重的,很多错误就稀里糊涂的出现了.鄙人学了2天的linux基本命令操作,就急急跑来完成第一个任务:建立svn服务器.由于底子薄,出了问题更是比别人付出千百倍的能力去解决,真是不容易啊 言归正传,第一步先安装svn的软件 # yum install subversion: 然后建立一个专门用来装SVN东西的目录 #mkdir /svn/ 使用svn自己带的命令来在这个目录下面再做一个目录 #svnadmin

翻译brent ozar的sqlserver dba训练课程——第一章:建立数据库服务器清单

在公司里,走进销售副总裁的办公室,询问他手下有多少销售人员.不,我的意思是你并不要那么做,他们会问你销售工具为什么那么慢. 其实我的意思是,如果你能走进他的办公室问他这个问题.我敢打赌,他会马上回答,不会有片刻犹豫.或者你走进ceo的办公室问他有多少员工,或者问cfo年度预算是多少,他们肯定会迅速回答. 因此,我的观点是,当你负责某个事物时,你需要清楚的知道你所负责的是那些. 制作一个表格清单 让我们开始制作一个表格清单.在表格的顶部,我们列出以下列: sqlserver版本(2005.2008

使用VisualSVN建立SVN服务器

原地址:http://blog.csdn.net/happyjiang2009/article/details/5719988 以前使用官方Subversion搭建SVN版本控制环境,感觉很繁琐,需要手动该文件,很麻烦,今天在网上看到了VisualSVN搭建版本控制环境的方法,写出来和大家分享一下.欢迎提出问题O(∩_∩)O~ 1.下载安装文件(服务器端和客户端) 服务器端采用VisualSVN,一个可用的下载地址是:http://idc218b.newhua.com/down/VisualSV