该服务器一次只能处理一个客户端请求;
p/**
* 利用Socket进行简单服务端与客户端连接
* 这是服务端
*/
public class EchoServer {
  private ServerSocket serverSocket;
  private int port = 8088;
  //利用构造器启动服务器
  public EchoServer()throws Exception{
    serverSocket = new ServerSocket(port);
    System.out.println("服务器已启动!");
  }
  //需要向客户端发送的短信
  private String ehco(String msg){
    return "echo:"+msg;
  }
  //通过Socket对象获取Io输入流出
  private BufferedReader getReader(Socket socket)throws Exception{
    InputStream in = socket.getInputStream();
    //返回一个字符流对象
    return new BufferedReader(new InputStreamReader(in));
  }
  //通过Socket对象获取IO输出流
  private PrintWriter getWriter(Socket socket)throws Exception{
  OutputStream out = socket.getOutputStream();
  //自动刷新
    return new PrintWriter(out,true);
  }
  //服务器对客户端的请求进行处理
  public void service() {
  while(true){
  Socket socket = null;
  try {
    //接收客户端请求,产生socket对象进行通信
    socket = serverSocket.accept();
    System.out.println("获取客户端的url,端口"+socket.getInetAddress()+":"+socket.getPort());
    BufferedReader br = getReader(socket);
    PrintWriter pw = getWriter(socket);
    String msg = null;
    while((msg = br.readLine()) != null){
      //打印客户端消息
      System.out.println("客户端发送过来的消息:"+msg);
      //向客户端写消息
      pw.println(ehco(msg));
      if(msg.equals("bye")){
        break;
      }
  }

  }catch (Exception e){
    e.printStackTrace();
  }
  }
}

  public static void main(String[] args) throws Exception{
    //产生服务器实例,启动服务器
    EchoServer echoServer = new EchoServer();
    echoServer.service();
  }
}

---------------

客户端(单线程的)
public class EchoClient {

private int port = 8088;
private String host = "localhost";
private Socket socket;
//使用构造方法产生Socket实例
public EchoClient()throws Exception{
socket = new Socket(host,port );
}
//根据socket对象产生输出流对象
private BufferedReader getReader(Socket socket)throws Exception{
InputStream in = socket.getInputStream();
return new BufferedReader(new InputStreamReader(in));
}
//根据Socket对象产生输入流对象
private PrintWriter getWriter(Socket socket)throws Exception{
return new PrintWriter(socket.getOutputStream(),true);
}
//客户端处理方法
public void talk(){
try {
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
//控制台输入信息
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while((msg = localReader.readLine()) != null){
//pw.write(msg);
//不能使用write()方法,使用write()要加上println,然后flush();
//println方法中包含write()+println()方法,构造时自动刷新;
pw.println(msg);
System.out.println(br.readLine());
if(msg.equals("bye")){
break;
}
}

}catch (Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception{
EchoClient client = new EchoClient();
client.talk();
}
}

java网络编程-单线程服务端与客户端通信的更多相关文章

  1. Java网络编程(TCP服务端)

    /* * TCP服务端: * 1.创建服务端socket服务,并监听一个端口 * 2.服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象 * 3.可以通过获 ...

  2. java http post/get 服务端和客户端实现json传输

    注:本文来源于<java http post/get 服务端和客户端实现json传输> 最近需要写http post接口所以学习下. 总的还是不难直接上源码! PostHttpClient ...

  3. Netty 学习(二):服务端与客户端通信

    Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...

  4. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  5. Java网络编程:QQ邮件发送客户端程序设计

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

  6. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  7. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  8. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  9. java的服务端与客户端通信(1)

    一.理解socket 1.1什么是socket? socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...

随机推荐

  1. 博弈论:寻找先手必胜策略——Grundy值

    选修了人工智能课程,老师布置了调研任务:Grundy,开始看了一些资料并没有看懂. 后来找到了一篇文,写的很棒,里面有好多博弈相关的问题与分析,分享出来给大家: http://endless.logd ...

  2. C++中的指针,指针函数和函数指针

    指针是C或C++中的一大难题,因此弄懂指针对C和C++的学习有很大的帮助,最近一直在研究指针,因此写一篇随笔把心得记录一下. 简单来说指针也是一种变量,只不过指针变量所存储的不是我们直观上看到的,而是 ...

  3. Codeforces1076F. Summer Practice Report(贪心+动态规划)

    题目链接:传送门 题目: F. Summer Practice Report time limit per test seconds memory limit per test megabytes i ...

  4. 数据持久化系列之Mysql

    一.命令行操作 1.显示所有库: show databases; 2.要操作某个库,比如库名: db_book:use db_book; 3.查看表的基本结构,比如表名: t_book:desc t_ ...

  5. hdu5003 Osu!排序实现水题

    Osu! is a famous music game that attracts a lot of people. In osu!, there is a performance scoring s ...

  6. https://blog.csdn.net/doegoo/article/details/50749817

    因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J ...

  7. docker lamp

    可以直接使用官方镜像搭建LAMP环境从官方下载PHP+Apache镜像和MySQL两个镜像来组成(如:php:7.2.3-apache-stretch和mysql:5.7.21)docker pull ...

  8. PythonStudy——逻辑运算符 Logical Operators

    在Python中,None.任何数值类型中的0.空字符串“”.空元组().空列表[].空字典{}都被当作False,还有自定义类型,如果实现了 __ nonzero __ () 或 __ len __ ...

  9. 统一社会信用代码+组织机构代码 校验 python

    转自: https://blog.csdn.net/warrah/article/details/69338912 https://blog.csdn.net/qq_37142340/article/ ...

  10. Day 09 函数基础

    函数初级 简介 # 函数是一系列代码的集合,用来完成某项特定的功能 优点 '''1. 避免代码的冗余2. 让程序代码结构更加清晰3. 让代码具有复用性,便于维护''' 函数四部分 '''1. 函数名: ...