概述

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服务器客户程序相关推荐

  1. java 简单聊天室_java实现简单聊天室单人版

    本文实例为大家分享了java实现简单聊天室的具体代码,供大家参考,具体内容如下 先整理下思路: 1.创建一个通信服务端,传入端口号和相关的流后等待客户端连接,并初始化图形界面. 2.创建一个JFram ...

  2. java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是:         1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...

  3. 利用socket.io+nodejs打造简单聊天室

    代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  4. C语言实现网络聊天室 socket的简单应用

    C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...

  5. java web聊天室原理_java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进行mvc结构的设 ...

  6. java jsp聊天系统_java web实现简单聊天室

    目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...

  7. java web聊天室原理_java web实现简单聊天室

    目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...

  8. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  9. 实现TCP简单聊天室(含连接数据库)

    课程设计题目:   多人在线聊天室    目录 第一章 系统概述. 1 第二章 系统需求分析. 2 2.1 系统任务描述. 2 2.2 系统功能分析. 2 2.3 系统可行性分析. 2 第三章 系统概 ...

  10. Java——实现聊天室

    学习Java的每一个人都知道,聊天室是每一个程序员都要过手的项目,根据要求的不同,聊天室的实现可易可难. 我今天的聊天室程序主要实现的功能是: 1.私聊功能 2.群聊功能 3.查看成员列表功能 4.退 ...

最新文章

  1. 使用Java8的Stream对两个 List 遍历匹配数据的优化处理
  2. 作为JBoss AS 7模块运行Drools 5.4.0 Final
  3. tpm php,TPM系列
  4. linux 快速启动程序,centos7快速启动应用程序教程
  5. bzoj 3379: [Usaco2004 Open]Turning in Homework 交作业(区间DP)
  6. 【aRsenal-1】用R创建Word和PowerPoint文档
  7. 利用jira-python及selenium完成jira的统计报表及日报的填写
  8. python游戏引擎-转:十大开源游戏引擎深入比较
  9. 查看QQ空间加密相册 真实(视频)
  10. qq围棋 android,腾讯围棋(QQ围棋)
  11. 欧拉函数,欧拉公式,降幂公式
  12. idempotent - 幂等
  13. 程序员转行适合做什么?
  14. linux图形界面和dos界面切换
  15. 中国智慧城市健康发展应注意八个方面
  16. 云收呗api接口免费开放
  17. 【技术点】数据结构--B树系列(四)
  18. 修理机器人基维斯_《魔兽世界》魔兽世界修理机器人心得
  19. 魔王语言(C语言版)
  20. Python中escape和unescape

热门文章

  1. 十款最好用的远程桌面工具
  2. Sublime Text 安装中文、英文字体
  3. csr8675硬件支持蓝牙5.0还是4.2?5.0是不是后来软升级达到的效果?
  4. 有关NotifyIcon的使用
  5. 邮件服务器1---原理以及基本概念
  6. ie11 华表_IE11网页加载项和控件不能运行的解决方法
  7. 开发与测试的相爱相杀
  8. 计算机硬件维修的步骤和方法,计算机硬件组装与维护教程
  9. 模式识别、机器学习的区别和联系
  10. 雨林木风GhostXPSP3装机版YN9.9_09.11更新