例子来自Java官方教程,稍作调整。

实现的是单个客户端请求服务端,根据服务端提示进行一系列操作。

协议类:

package com.dylan.socket;/*** @author xusucheng* @create 2017-12-24**/
public class KnockKnockProtocol {private static final int WAITING = 0;private static final int SENTKNOCKKNOCK = 1;private static final int SENTCLUE = 2;private static final int ANOTHER = 3;private static final int NUMJOKES = 5;private int state = WAITING;private int currentJoke = 0;private String[] clues = { "Turnip", "Little Old Lady", "Atch", "Who", "Who" };private String[] answers = { "Turnip the heat, it's cold in here!","I didn't know you could yodel!","Bless you!","Is there an owl in here?","Is there an echo in here?" };public String processInput(String theInput) {String theOutput = null;if (state == WAITING) {theOutput = "Knock! Knock!";state = SENTKNOCKKNOCK;} else if (state == SENTKNOCKKNOCK) {if (theInput.equalsIgnoreCase("Who's there?")) {theOutput = clues[currentJoke];state = SENTCLUE;} else {theOutput = "You're supposed to say \"Who's there?\"! " +"Try again. Knock! Knock!";}} else if (state == SENTCLUE) {if (theInput.equalsIgnoreCase(clues[currentJoke] + " who?")) {theOutput = answers[currentJoke] + " Want another? (y/n)";state = ANOTHER;} else {theOutput = "You're supposed to say \"" +clues[currentJoke] +" who?\"" +"! Try again. Knock! Knock!";state = SENTKNOCKKNOCK;}} else if (state == ANOTHER) {if (theInput.equalsIgnoreCase("y")) {theOutput = "Knock! Knock!";if (currentJoke == (NUMJOKES - 1))currentJoke = 0;elsecurrentJoke++;state = SENTKNOCKKNOCK;} else {theOutput = "Bye.";state = WAITING;}}return theOutput;}
}

服务器端:

package com.dylan.socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;/*** @author xusucheng* @create 2017-12-24**/
public class KnockKnockServer {private static final int PORT = 8858;public static void main(String[] args) throws IOException {/*if (args.length != 1) {System.err.println("Usage: java KnockKnockServer <port number>");System.exit(1);}int portNumber = Integer.parseInt(args[0]);*/try (ServerSocket serverSocket = new ServerSocket(PORT);Socket clientSocket = serverSocket.accept();PrintWriter out =new PrintWriter(clientSocket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));) {String inputLine, outputLine;// Initiate conversation with clientKnockKnockProtocol kkp = new KnockKnockProtocol();outputLine = kkp.processInput(null);out.println(outputLine);while ((inputLine = in.readLine()) != null) {outputLine = kkp.processInput(inputLine);out.println(outputLine);if (outputLine.equals("Bye."))break;}} catch (IOException e) {System.out.println("Exception caught when trying to listen on port "+ PORT + " or listening for a connection");System.out.println(e.getMessage());}}
}

客户端:

package com.dylan.socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;/*** @author xusucheng* @create 2017-12-24**/
public class KnockKnockClient {private static final String HOST="127.0.0.1";private static final int PORT=8858;public static void main(String[] args) throws IOException {/*if (args.length != 2) {System.err.println("Usage: java EchoClient <host name> <port number>");System.exit(1);}String hostName = args[0];int portNumber = Integer.parseInt(args[1]);*/try (Socket kkSocket = new Socket(HOST, PORT);PrintWriter out = new PrintWriter(kkSocket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));) {BufferedReader stdIn =new BufferedReader(new InputStreamReader(System.in));String fromServer;String fromUser;while ((fromServer = in.readLine()) != null) {System.out.println("Server: " + fromServer);if (fromServer.equals("Bye."))break;fromUser = stdIn.readLine();if (fromUser != null) {System.out.println("Client: " + fromUser);out.println(fromUser);}}} catch (UnknownHostException e) {System.err.println("Don't know about host " + HOST);System.exit(1);} catch (IOException e) {System.err.println("Couldn't get I/O for the connection to " +HOST);System.exit(1);}}
}

Java Socket编程系列(三)开发支持单客户端访问的Server相关推荐

  1. Java Socket编程系列(四)开发支持多客户端访问的Server

    例子来自Java官方教程,稍作调整. 上一篇介绍了单客户端访问的Server实现,这一篇实现的是多个客户端请求服务端,根据服务端提示进行一系列操作. 协议类(和系列三一样没变): package co ...

  2. tcp java实例_实现了基于TCP的Java Socket编程实例代码

    实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello" ...

  3. Java 网络编程系列之 NIO

    Java 网络编程系列之 NIO 第 1 章Java NIO 概述 1.1 IO 概述 IO 的操作方式 1.2 阻塞 IO (BIO) 1.3 非阻塞 IO(NIO) 1.4 异步非阻塞 IO(AI ...

  4. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  5. Java Socket编程----通信是这样炼成的

    转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socke ...

  6. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  7. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

  8. java socket编程心跳_Java Socket编程心跳包创建实例解析

    1.什么是心跳包? 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用 ...

  9. JAVA socket编程 Datagram套接字 UDP协议(转)

      查看文章     JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...

最新文章

  1. R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射
  2. 面向对象与面向过程区别
  3. SQL注入攻击实现原理与攻击过程详解
  4. Spring+mongodb集群集成(吐血教程) 转自:http://blog.csdn.net/qq_16497617/article/details/52817335
  5. 记一次引入Elasticsearch的系统架构实战
  6. vue项目结构(未抽离成.vue文件前的结构)
  7. Kali Linux 从入门到精通(三)-入侵系统定制
  8. 2020年Java讲课笔记目录
  9. #1064 - You have an error in your SQL syntax; version for the right syntax to use near '' at line
  10. 9025.计算机专业英语,计算机专业英语测试
  11. 使用docker私有化部署nuget server-proget
  12. slf4j打印未捕获异常信息_谁再悄咪咪的吃掉异常,我上去就是一 JIO
  13. 【二维码识别】基于matlab GUI 灰度+二值化+校正QR二维码识别与生成【含Matlab源码 600期】
  14. 前端视频播放初探总结,video标签-视频插件jwplayer
  15. mysql定时自动备份数据库
  16. 开幕在即!众星齐聚八泉峡推介会 为山西加油,为二青助力!
  17. 大气辐射学期中知识点总结
  18. 热议!211高校近200名硕博新生开学无宿舍住,需校外租房...
  19. python背景图颜色_更改特定子图背景颜色(饼图外部)
  20. 制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)

热门文章

  1. 美国日期字符解析Fri, 02-Jan-2020 00:00:00 GMT0400
  2. c语言可以小数乘小数吗,DSP 定点算数运算设计
  3. JAVA SE 8安装与配置
  4. 计算机教案三年级冀教版,冀教版信息技术三年级教案
  5. 专家:应对禽流感需储备不同种药物
  6. 百度地图---点亮城市
  7. JS实现 下一个排列(下一个更大的数)
  8. 成龙在北大的演讲:值得每一个中国人看
  9. 云客Drupal源码分析之菜单上下文连接Menu contextual links
  10. python 做表格分析_Python 处理分析 128 张 Excel 表格竟不到3秒?| 附数据集