[JavaWeb基础] 024.Socket编程之简单的聊天程序
1.Socket的简介
1)什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
2)Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
2.Socket的Server端代码
- package com.babybus.sdteam.server;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class TalkServer {
- public static void main(String args[]) {
- try{
- ServerSocket server=null;
- try{
- // 创建一个ServerSocket在端口4700监听客户请求
- server=new ServerSocket(4700);
- }catch(Exception e) {
- // 出错,打印出错信息
- System.out.println("can not listen to:"+e);
- }
- Socket socket=null;
- try{
- // 使用accept()阻塞等待客户请求,有客户
- // 请求到来则产生一个Socket对象,并继续执行
- socket=server.accept();
- }catch(Exception e) {
- System.out.println("Error."+e);
- //出错,打印出错信息
- }
- String line;
- // 由Socket对象得到输入流,并构造相应的BufferedReader对象
- BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- // 由Socket对象得到输出流,并构造PrintWriter对象
- PrintWriter os = new PrintWriter(socket.getOutputStream());
- // 由系统标准输入设备构造BufferedReader对象
- BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
- // 在标准输出上打印从客户端读入的字符串
- System.out.println("Client:"+is.readLine());
- // 从标准输入读入一字符串 如果该字符串为 "bye",则停止循环
- line=sin.readLine();
- while(!line.equals("bye")){
- // 向客户端输出该字符串
- os.println(line);
- // 刷新输出流,使Client马上收到该字符串
- os.flush();
- // 在系统标准输出上打印读入的字符串
- System.out.println("Server:"+line);
- // 从Client读入一字符串,并打印到标准输出上
- System.out.println("Client:"+is.readLine());
- line=sin.readLine();
- }
- // 关闭Socket输出流
- os.close();
- // 关闭Socket输入流
- is.close();
- // 关闭Socket
- socket.close();
- // 关闭ServerSocket
- server.close();
- }catch(Exception e){
- System.out.println("Error:"+e);
- }
- }
- }
3.Socket的Client端代码
- package com.babybus.sdteam.client;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.net.UnknownHostException;
- public class TalkClient {
- public static void main(String[] args) {
- try {
- // 新建一个socket
- Socket socket = new Socket("127.0.0.1", 4700);
- // 向本机的4700端口发出客户请求
- BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
- // 由系统标准输入设备构造BufferedReader对象
- PrintWriter os=new PrintWriter(socket.getOutputStream());
- // 由Socket对象得到输出流,并构造PrintWriter对象
- BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- // 由Socket对象得到输入流,并构造相应的BufferedReader对象
- String readline;
- // 从系统标准输入读入一字符串
- readline=sin.readLine();
- while(!readline.equals("bye")){
- // 若从标准输入读入的字符串为 "bye"则停止循环
- os.println(readline);
- // 将从系统标准输入读入的字符串输出到Server
- os.flush();
- // 刷新输出流,使Server马上收到该字符串
- System.out.println("Client:"+readline);
- // 在系统标准输出上打印读入的字符串
- System.out.println("Server:"+is.readLine());
- // 从Server读入一字符串,并打印到标准输出上
- readline=sin.readLine(); //从系统标准输入读入一字符串
- }
- os.close(); //关闭Socket输出流
- is.close(); //关闭Socket输入流
- socket.close(); //关闭Socket
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
4.上面已经写得很详细了,有兴趣的创建个Java程序运行下就明白了。
本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4890437.html
[JavaWeb基础] 024.Socket编程之简单的聊天程序的更多相关文章
- python socket编程 实现简单p2p聊天程序
目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...
- Java网络编程以及简单的聊天程序
网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编 ...
- 基于socket实现的简单的聊天程序
记得八年前第一次使用socket做的一个五子棋程序,需要序列化棋子对象,传递到对方的电脑上. 一个偶然的机会,第二次使用socket做点事情.先看聊天服务器端的实现: 服务器端要实现以下功能: ...
- Python 基础之socket编程(二)
Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- Python 基础之socket编程(一)
Python 基础之socket编程(一) 可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样.....下去了.不扯淡了,来来来,看看今天都搞了点 ...
- socket编程,简单多线程服务端测试程序
socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...
- Socket编程的简单实现
关于socket编程的简单实现,主要分成客户端.服务端两个部分.实现如下: 1.服务端代码如下,注意:server端要优先于client端启动 2.client端代码,以及启动后客户端和服务端之间的简 ...
- Python 基础之socket编程(三)
python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...
随机推荐
- python(类多态)
一.多态 (以封装和继承为前提)不同的子类调用相同的方法,产生不同的结果 class Dog(): def __init__(self,name): self.name = name def game ...
- FarmCraft
题意:mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子.mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为ci.树上的每 ...
- mysql5.7 修改密码,修改权限
1.修改数据库对指定用户和ip权限 a. IP为192.168.0.1的用户jack拥有对数据库datebase的表table的 增删改查权限, ,连接密码为password grant select ...
- 自己封装函数,实现数组的内置方法indexOf的功能
在学习或开发过程中,经常会有朋友需要使用到一个数组方法-indexOf,这里我们先来谈谈它的功能:返回指定数据所在的索引,如果没有则返回-1. 那么我们在使用时通常是直接使用它这个数组内置方法 今天这 ...
- 线段树的区间合并 B - LCIS
B - LCIS HDU - 3308 这个是一个很简单很明显的线段树的区间合并,不过区间合并的题目都还是有点难写,建议存个板子. #include <cstdio> #include & ...
- 王颖奇 20171010129《面向对象程序设计(java)》第十五周学习总结
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 学习总结: 理论部分: ◼ JAR文件◼ 应用程序首选项存储◼ Java Web Start JAR文件: 1.Java程序的打 ...
- javaScript 添加和移除class类名的几种方法
添加类属性: // 一次只能设置一个类值,如果当前属性本身存在类值,会被替换 element.className = '类名'; /* * .setAttribute 用来设置自定义属性和值的 * 自 ...
- Power BI:社保、公积金增减
本月和上月比较,社保.公积金有增减,拓展开来,每两个相邻月份比较,社保.公积金有增减. 数据放在SQL Server Express,有公司.姓名.分类.个人缴费金额.单位缴费金额.年月等字段,uni ...
- JDBC06 其他操作及批处理Batch
灵活指定SQL语句中的变量 -PreparedStatement 对存储过程进行调用 -CallableStatement 运用事务处理 -Transaction 批处理 -Batch -对于大量的批 ...
- 使用npoi导入Excel - 带合并单元格--附代码
之前我们在使用npoi导入excel表格的时候,往往会遇见那种带有合并单元格的数据在导入的时候出现合并为空的问题, 也就是只有第一条有数据,其余均为空白.在网上翻了半天也没有找到合适的解决方案,最后还 ...