前面一篇博客我们简单地理清了JAVA创建服务器,以及客户机连接服务器的流程,今天我们继续往下学习,实现客户机和服务器的通信。由于基本概念我们已经在前一篇博客说清楚了,这里我们就不再进行赘述。(不清楚的可以先阅读下我的前一篇博客JAVA通信(一)——输入数据到客户端)

具体代码

package communicatetest1;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;//创建一个测试类
public class communicateTest {public static void main(String[] args) throws IOException {//创建一个服务器对象ServerSocket server=new ServerSocket(9005);//输出服务器的端口信息System.out.println("服务器创建成功,端口号为:"+server.getLocalPort());while(true) {//创建一个Socket对象来连接,这里不需要新建一个对象,它只要直接引用server即可Socket socket=server.accept();//利用socket来接收输出输入流的数据//这里有一点需要注意,OutputStream是向客户机输出信息,而InputStream是读取客户机发送过来的信息OutputStream output=socket.getOutputStream();InputStream input=socket.getInputStream();//接着开始进行通信测试String s="Hello,Welcome to My ServerSocket!";//这条消息是当客户机连接上我们创建的服务器时,服务器发送给客户机的一条信息//也就是我们要向客户机发送消息,那么我们应该用的是OutputStream//首先我们要先将发送信息转化为byte类型,因为输出流的写入方法write()中的参数是byte类型byte[] dataout=s.getBytes();//接着调用输出流的写入方法,把信息发送给客户机output.write(dataout);//然后让这条信息在命令行中显示出来,以便我们检测信息是否真的已经被发送出去output.flush();//接收每一个来自客户机的字符int ascii=input.read();//如果接收到回车字符就结束循环while(ascii!=13) {char accept=(char) ascii;//输出客户机发出的,服务器收到的每一个字符System.out.print(accept);ascii=input.read();}//关闭连接socket.close();}}}

我们在前一篇博客代码的基础上再加上一段代码。利用InputStream的read()方法来实现把信息传送到服务器。需要注意的是read()方法得到的是字符的ascii码,因此我们要用int的变量接收,再把它转化为char型字符。

二、运行命令行如下

输入telnet localhost 9006 后,连接如下

我们尝试输入一些字符,会看到如下界面

每次在命令行中输入一个字符,服务器就会接收到一个字符。而不是我们想象中的写完一句话,按回车后才会发送给服务器。但是这种发送形式不是很适用于我们的日常生活。而且它是不能进行删除的。因为我们每写完一个字符,它就马上被发送到服务器了。当你按下删除键时,它会被识别成一个字符发送给服务器。

三、设置读取发送规则

如果要实现客户机和服务器的正常通信我们就必须为它们设置一定的读取规则,而不能一个个字符地读取。比如我们可以规定回车键为一条完整消息的结束。每次读取到回车键时服务器再一次性地接收消息。当功能逐渐增多时,我们最好把它封装成一个类,而不要总是在主函数里面测试。代码修改如下:

package communicatetest2;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;//定义一个通信类
public class ServerChat {OutputStream output;//输出流InputStream input;//输入流ServerSocket server;//设置一个服务器对象属性//定义一个建立服务器的方法private void setUpServer(int port) throws IOException {//将输入的端口设置为服务器server=new ServerSocket(port);//输出当前服务器的端口号System.out.println("服务器创建成功,端口号:"+server.getLocalPort());//定义一个作为中介的接收对象SocketSocket socket=server.accept();//为输入输出流赋值output=socket.getOutputStream();input=socket.getInputStream();//开始通信//传送信息给客户机String outS="Hello,welcome to my ServerSocket!\r\n";out(outS);//发送信息给服务器ReadString();}  //定义一个输出信息到客户机的方法private void out(String outS) throws IOException {//将字符串转化为byte数组byte[] dataout=outS.getBytes();//调用write()将信息发送客户机output.write(dataout);//强制输出到命令行的界面中output.flush();}//定义一个传送字符串给服务器的方法public void ReadString() throws IOException {String inputS="";//读取第一个字符int AsciiNumber=input.read();while(AsciiNumber!=13) {//将ascii码转化为相应的char型字符inputS+=(char)AsciiNumber;//接收下一个字符AsciiNumber=input.read();}System.out.println(inputS);output.close();}//主函数入口public static void main(String[] args) throws IOException {//创建一个通信类的对象ServerChat server=new ServerChat();server.setUpServer(9009);}
}

命令行运行结果如下

如此一下我们就可以实现回车后再进行显示了。但是实质上他还是一个一个字符地传输,只不过当服务器接收到字符时,我们不立即将其显示出来,而是等接受完整句话,我们才把它显示出来。但是它现在还有一个问题,那就是只能传送一句话,这就很难受了。谁说话只说一句呀,因此我们还要对它进行改进。当我们接收完一句话时不要立即关闭客户端和服务器的连接,而是等到用户输入“bye”的时候再断开连接。相关部分的代码更改如下:

 public void ReadString() throws IOException {String inputS="";while(!inputS.equals("bye")) {//读取第一个字符int AsciiNumber=input.read();while(AsciiNumber!=13) {//将ascii码转化为相应的char型字符inputS+=(char)AsciiNumber;//接收下一个字符AsciiNumber=input.read();}System.out.println(inputS);}//关闭连接output.close();}

运行命令行结果如下

现在我们就可以进行多条信息的交流啦~

当然现在我们只允许服务器和一个客户机进行交流,当有一个客户机在和服务器在一起交流时,如果第二个客户机尝试和服务器进行连接,就会出现如下报错。

原因很简单,当前我们的只是一个单线程的程序,当有一个客户机在和服务器进行通信时,这个线程就已经被占用了。后期我会继续推出一篇博客来讲解JAVA多线程通信的实现,支持多人聊天。

JAVA通信(二)——实现客户机和服务器通信相关推荐

  1. 全网疯传!Java利用TCP协议实现客户端与服务器通信【附通信源码

    目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套 ...

  2. 客服 服务器系统中客户机和服务器,客户机/服务器计算是什么 客户机/服务器计算介绍【详解】...

    什么是客户机/服务器计算 客户机/服务器计算定义一种体系结构,在该结构中,程序逻辑分布在客户机系统和服务器系统之间.客户机/服务器计算是20世纪80年代的各种趋势形成的结果,它使用通过LAN连接到后端 ...

  3. 【通信协议及编码】实验3:MFC框架下聊天室客户机与服务器程序

    文章目录 一.实验目的 二.实验环境 三.实验内容 一.实验目的 掌握MFC套接字编程方法 借助VS2016的MFC应用程序向导创建程序框架: 从CSocket类派生用户自定义的套接字类: 通过CAr ...

  4. RFC868--时间协议客户机与服务器的实现

    本例根据RFC 868网络时间协议分别建立了时间协议的客户机和服务器. 1.TimeProtocolConstants类提供提供两个常量静态值:TCP_PORT指定协议的标准TCP端口:EPOCH_O ...

  5. 关于计算机应用的客户服务器模式,计算机客户机/服务器计算模式

    客户机/服务器计算模式源于个人计算机PC.工程工作站和计算机网络技术的迅速的发展以及UNIX系统的广泛应用.从而促进计算机系统从集中式处理环境进入分布式计算环境.9 0年代将是以个人计算机.工程工作站 ...

  6. 客户机和服务器在s7通信中各有什么作用,哪些通信口可以进行 Modbus TCP 通讯,作为 Modbus 服务器的 SIMATIC S7 CPU 可以...

    以下通信端口可用于 Modbus/TCP 协议:在默认情况下,端口号 502 作为 Modbus 服务器的本地端口. 可以在 Modbus 客户机中设置需要的本地端口,通常使用从 2000 开始的端口 ...

  7. 在客户机与服务器之间实现文件共享

    使用系统: WIN10.Windows Sever2016 实现文件共享前提: 两台机器必须保证在同一网段(在使用虚拟机且处于仅主机模式)如图: 实现文件共享通常有三种方式: (1)身份验证访问 (2 ...

  8. 一个客户机-服务器系统使用了卫星网络,客户机/服务器体系结构可用于局域网、广域网和WWW。这三种用途迥异的网络的一个共同特点是工作负 - 试题答案网问答...

    相关题目与解析 关于客户机/服务器体系结构的错误说法是()A.曾经是一种流行的结构B.可用于广域网C.不可用于万 ●C/S(客户机/服务器)与B/S(浏览器服务器)体系结构的区别是:(57).(57) ...

  9. 客户机 服务器系统的特点是客户机和服务器,客户机 服务器数据库系统的特点...

    客户机 服务器数据库系统的特点 内容精选 换一换 华为云提供ECS与BMS用来运行ASE数据库,同时也支持多种方式将线下数据库迁移到华为云.同构迁移是指的源端与目标端的OS保持不变(允许小版本的变化) ...

最新文章

  1. intellij idea 如何一键清除所有断点
  2. Kotlin学习入门笔记
  3. PyCharm无法启动的问题
  4. SpringBoot-@PathVariable
  5. 面向流批一体的 Flink Runtime 新进展
  6. python自动检测网站_Web全自动化测试Python + Pytest+Selenium+ Saucelabs 转
  7. Project(9)——收货地址 -查看列表
  8. java毕业生设计大学生旅游拼团网站计算机源码+系统+mysql+调试部署+lw
  9. 国家30万吨白糖收储正式启动
  10. 单声道蓝牙实现音乐播放
  11. 仿微博视频边下边播之封装播放器
  12. 个人博客网站升级http为https
  13. 传图识字有次数限制吗_告诉你一个免费的微信小程序,可以传图识字
  14. 《牧羊少年奇幻之旅》读书笔记
  15. IBM赌未来:量子计算服务IBM Q系统今年上线
  16. QQ,群,空间等API接口代码分享
  17. 推荐微信小程序常用的几个UI组件库
  18. 使用图片制作3D背景
  19. 【Excel】偷懒小技巧3:金额小写自动转换为大写
  20. friends(六人行)全集剧本下载

热门文章

  1. springboot学生信息管理的设计与实现毕业设计源码191219
  2. 美国付费电视行业2015年财报大集合
  3. 高德地图获取所在城市POI数据
  4. 封BT的一些常见用法
  5. 基于51单片机智能电子秤方案原理图程序设计
  6. 融资担保系统-助力企业的可持续发展
  7. BUUCTFweb题刷题记录(2020.09.14-2020.09.19)
  8. 智慧楼宇数字孪生应用方案
  9. 【Python简明教程二十八】PIP
  10. 珍宝鸭的力扣练习(1):字符串特殊方法合集