Java简单聊天室Socket服务器客户程序
概述
java.net.Socket
代表两台机器之间网络连接的对象
客户端必须要认识服务器,服务器必须要认识所有的客户端。
- 如何建立客户端与服务器之间的初始连接
- 如何传送信息到服务器
- 如何接收来自服务器的信息
建立连接
要创建Socket连接,必须知道服务器在哪里以及用哪个端口来收发数据,也就是IP地址和端口号
try {Socket socket = new Socket("192.168.20.135", 5000);
} catch (UnknownHostException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}
常用端口
- 80 # HTTP网页服务器,HTTPS使用443端口,FTP使用20端口
- 110 # POP3邮件服务器
- 25 # SMTP邮局交换服务器
- 23 # Telnet服务器
0~1023
端口保留给已知的特定服务使用,可以从1024~65535
之间挑选。
数据读写
BufferedReader
使用 BufferedReader 从 Socket 上读取数据
Socket socket = new Socket("192.168.20.135", 5000);
InputStreamReader stream = new InputStreamReader(socket.getInputStream()); //从 Socket 上取得输入串流
BufferedReader reader = new BufferedReader(stream);
String msg = reader.readLine();
reader.close();
PrintWriter
用 PrintWriter 写数据到 Socket 上
Socket socket = new Socket("192.168.20.135", 5000);
PrintWriter writer = new PrintWriter(socket.getOutputStream()); //连接 Socket 和 String 流
writer.println("message to send"); //带换行
writer.print("another message");
writer.close();
Socket Server
一对Socket,一个用于等待用户请求的ServerSocket,一个用于与用户通信的Socket
ServerSocket
try {ServerSocket serverSocket = new ServerSocket(4242);while(true){ //服务器进入无穷循环等待客户端的请求Socket socket = serverSocket.accept(); //此方法会停下来等待要求到达之后再继续PrintWriter writer = new PrintWriter(socket.getOutputStream());writer.println("Welcome...");writer.close();}
} catch (IOException e) {e.printStackTrace();
}
工作方式
1 服务器应用程序对特定端口创建出ServerSocket
ServerSocket serverSocket = new ServerSocket(4242);
这会让服务器应用程序开始监听来自 4242 端口的客户端请求
2 客户端对服务器应用程序建立Socket连接
Socket socket = new Socket("192.168.20.135", 9000);
客户端根据服务器的IP地址和端口号建立连接
3 服务器创建出与客户端通信的新的Socket
Socket socket = serverSocket.accept();
accept() 方法会在等待用户的Socket连接时闲置着,当用户连上来时,此方法会返回一个不同端口上的新的Socket以便与客户端通信。如此ServerSocket可以空出来等待其他的用户。
取得所有连线
List<PrintWriter> clientOutputStreams = new ArrayList<>(); //定义客户端输出流列表
try {ServerSocket serverSocket = new ServerSocket(9000); //监听连接到9000端口的所有客户端while(true){Socket clientSocket = serverSocket.accept();PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); //取得客户端输出流clientOutputStreams.add(writer); //添加到输出流列表//启动监听客户端输入流线程Thread readClientMsg = new Thread(new ClientHandler(clientSocket));readClientMsg.start();}
} catch (IOException e) {e.printStackTrace();
}
群发消息
public void sendToAll(String msg){Iterator<PrintWriter> itClient = clientOutputStreams.iterator(); //利用迭代器进行遍历while(itClient.hasNext()){PrintWriter writer = itClient.next();writer.println(msg);writer.flush();}
}
取得客户端消息
利用多线程循环监听客户端发来的消息,如果获取到消息就发送给所有用户
线程在取得客户端连接时就启动
Socket clientSocket = serverSocket.accept();
Thread readClientMsg = new Thread(new ClientHandler(clientSocket));
readClientMsg.start();
class ClientHandler implements Runnable{BufferedReader reader;Socket socket;public ClientHandler(Socket clientSocket){//绑定客户端并取得输入流this.socket = clientSocket;try {InputStreamReader is = new InputStreamReader(socket.getInputStream());reader = new BufferedReader(is);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {String msg;//循环监听输入流,取到消息后发送给所有客户端try {while((msg = reader.readLine()) != null){sendToAll(msg);}} catch (IOException e) {e.printStackTrace();}}
}
Socket Client
发送消息给服务器
Socket socket;
PrintWriter writer;
private void setSocket(){try {socket = new Socket("192.168.20.135", 4242);writer = new PrintWriter(socket.getOutputStream());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}
private void sendMsg(String msg){writer.println(msg);writer.flush();
}
接收服务器消息
结合以上发送消息合并代码
BufferedReader reader;
private void setSocket(){try {socket = new Socket("192.168.20.135", 4242);writer = new PrintWriter(socket.getOutputStream()); //定义输出流,通过发送按钮发送消息给服务器InputStreamReader streamReader = new InputStreamReader(socket.getInputStream()); //定义输入流reader = new BufferedReader(streamReader); //绑定到缓存输入流,利用多线程循环循环查询服务器消息并接收} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}
开启新线程循环接收服务器消息
Thread readMsg = new Thread(new ReadMsg());
readMsg.start();
private class ReadMsg implements Runnable{@Overridepublic void run() {String msg;try {while((msg = reader.readLine()) != null){//获取到服务器信息System.out.println(msg);}} catch (IOException e) {e.printStackTrace();}}
}
Java简单聊天室Socket服务器客户程序相关推荐
- java 简单聊天室_java实现简单聊天室单人版
本文实例为大家分享了java实现简单聊天室的具体代码,供大家参考,具体内容如下 先整理下思路: 1.创建一个通信服务端,传入端口号和相关的流后等待客户端连接,并初始化图形界面. 2.创建一个JFram ...
- java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- C语言实现网络聊天室 socket的简单应用
C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...
- java web聊天室原理_java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进行mvc结构的设 ...
- java jsp聊天系统_java web实现简单聊天室
目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...
- java web聊天室原理_java web实现简单聊天室
目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...
- python socket 网络聊天室_Python基于Socket实现简单聊天室
本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...
- 实现TCP简单聊天室(含连接数据库)
课程设计题目: 多人在线聊天室 目录 第一章 系统概述. 1 第二章 系统需求分析. 2 2.1 系统任务描述. 2 2.2 系统功能分析. 2 2.3 系统可行性分析. 2 第三章 系统概 ...
- Java——实现聊天室
学习Java的每一个人都知道,聊天室是每一个程序员都要过手的项目,根据要求的不同,聊天室的实现可易可难. 我今天的聊天室程序主要实现的功能是: 1.私聊功能 2.群聊功能 3.查看成员列表功能 4.退 ...
最新文章
- 使用Java8的Stream对两个 List 遍历匹配数据的优化处理
- 作为JBoss AS 7模块运行Drools 5.4.0 Final
- tpm php,TPM系列
- linux 快速启动程序,centos7快速启动应用程序教程
- bzoj 3379: [Usaco2004 Open]Turning in Homework 交作业(区间DP)
- 【aRsenal-1】用R创建Word和PowerPoint文档
- 利用jira-python及selenium完成jira的统计报表及日报的填写
- python游戏引擎-转:十大开源游戏引擎深入比较
- 查看QQ空间加密相册 真实(视频)
- qq围棋 android,腾讯围棋(QQ围棋)
- 欧拉函数,欧拉公式,降幂公式
- idempotent - 幂等
- 程序员转行适合做什么?
- linux图形界面和dos界面切换
- 中国智慧城市健康发展应注意八个方面
- 云收呗api接口免费开放
- 【技术点】数据结构--B树系列(四)
- 修理机器人基维斯_《魔兽世界》魔兽世界修理机器人心得
- 魔王语言(C语言版)
- Python中escape和unescape